python实现群发邮件
前期准备工作
打开qq邮箱的 SMTP 服务,并保存授权码
- 进入qq邮箱个人主页,设置-账户-开启
IMAP/SMTP
服务-保存授权码 - 服务器地址:qq邮箱的是 smtp.qq.com
- 端口号:普通传输为25,SSL加密传输为465或587
代码结构
1.导入模块:smtplib
模块,email
模块
2.定义变量:包括发件人,密码,收件人,正文内容,服务器
3.使用方法:链接,登录,发送,退出
smtplib 模块
用于邮件的发信动作
1.链接服务器 —— connect(服务器地址,端口号)
2.登录邮箱 —— login(用户名,授权码)
3.发送邮件 —— sendmail(发件地址,收件地址,发送内容)
4.退出服务器 —— quit()
# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'xxx@qq.com'
password = '你的授权码数字'
# 收信方邮箱
to_addr = 'xxx@qq.com'
# 发信服务器
smtp_server = 'smtp.qq.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText('send by python','plain','utf-8')
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465) # 链接服务器 需要参数: 服务器地址 和 端口号
# 登录发信邮箱 需要参数: 用户名 和 授权码
server.login(from_addr, password)
# 发送邮件 需要参数: 发件收件地址、发送内容
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
email 模块
也就是用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。
MIMEText
-
MIMEText:内容形式为纯文本、HTML页面。
-
MMEImage:内容形式为图片。
-
MIMEMultipart:多形式组合,可包含文本和附件。
对应的导入方式:
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
MIMEText 参数解释
MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
Header
邮件头信息
from email.header import Header
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
完成以上步骤后来看看如何发送单个邮件(这里加上了try…except…语句):
# 普通传输
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方 SMTP 服务
mail_host="smtp.XXX.com" #设置服务器
mail_user="XXXX" #用户名
mail_pass="XXXXXX" #授权码
sender = 'XXXXXXXXXX@XX.com' # 发件人的邮箱地址
receivers = ['XXXXXXXXXX@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 列表,即可以存放多个邮箱地址
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("我是发件人") # 发件人标头
message['To'] = Header("我是收件人") # 收件人标头
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject)
# SSL加密传输的代码写法:
try:
smtpObj = smtplib.SMTP_SSL(mail_host) # SMTP_SSL() 内的 host_name 不能为空,否则会报错
smtpObj.connect(mail_host,465) # 链接服务器 需要 服务器地址 和 端口号
smtpObj.login(mail_user,mail_pass) # 登录 需要 用户名 和 授权码
smtpObj.sendmail(sender,receivers,message.as_string()) # 发送邮件 需要 发件收件地址、发送内容
smtpObj.quit()
print("邮件发送成功")
except smtplib.SMTPException:
print("Error:无法发送邮件")
如果想用普通传输就将:
smtpObj.connect(mail_host,465) # 链接服务器 需要 服务器地址 和 端口号
smtpObj.login(mail_user,mail_pass) # 登录 需要 用户名 和 授权码
改为:
smtpObj.connect(mail_host, 25) # SMTP 端口号 一般为 25
smtpObj.login(mail_user,mail_pass)
设计一个列表形式的变量
# 收信方邮箱
to_addrs = ['wufeng@qq.com','kaxi@qq.com']
# 邮箱正文内容
msg = MIMEText("text:",'plain','utf-8')
# 邮件头信息
msg["To"] = Header(",".join(to_addrs))
采用while循环
采用询问“是否继续输入邮箱地址”的方式,并用while循环来实现多个收件人的功能。
定义一个空列表to_addrs,用来存放收件人邮箱地址。
to_addrs = []
while True:
a=input('请输入收件人邮箱:')
#输入收件人邮箱
to_addrs.append(a)
#写入列表
b=input('是否继续输入,n退出,任意键继续:')
#询问是否继续输入
if b == 'n':
break
print(to_addrs)
调用csv模块
第一步,将数据写入csv文件:(若有现成的csv文件,则可以跳过此步)
import csv
#引用csv模块。
data = [['wufeng ', 'wufeng@qq.com'],['kaxi', 'kaxi@qq.com']]
#待写入csv文件的内容
with open('to_addrs.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
第二步,读取csv文件
# 读取收件人数据,并启动写信和发信流程
try:
with open('to_addrs.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
to_addrs=row[1]
msg = MIMEText(text,'plain','utf-8')
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addrs)
msg['Subject'] = Header('python test')
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs, msg.as_string())
print("邮件发送成功")
# 关闭服务器
server.quit()
except:
print("发送失败")