1.相关知识
SMTP是发送邮件的协议,python内置对SMTP的支持,可以发送纯文本邮件,HTML邮件,还有带附件的邮件
python对SMTP的支持:email模块–负责构造邮件 smtplib模块–负责发送邮件。
2.关于授权码
不管是使用QQ邮箱,网易邮箱,还是新浪邮箱,要利用他们的SMTP服务器来发送邮件,POP3服务器来接受邮件,都需要授权码,为了防止你的客户端密码泄露而造成邮箱隐患,而使用只有你自己知道的授权码来登陆第三方客户端,比如smtplib模块就属于第三方客户端。而授权码即使在服务器端也是加密的,所以无法修改授权码,只能重置授权码。
邮箱的pop/smtp服务器默认是关闭的,需要手动开启,进行短信验证。
3.邮箱开启POP/SMTP服务
QQ邮箱开启pop/smtp服务:
- 点击设置
- 点击账户
- 鼠标下滑,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
- 开启POP3/SMTP服务,然后需要发送短信,记下自己的授权码,在第三方登录时需要用到
新浪邮箱开启pop/smtp服务:
- 点击设置
- 点击左侧客户端pop/imap/smtp
- 找到右侧客户端授权码,点击开启,然后发送短信,获取授权码。
网易邮箱开启pop/smtp服务:
- 点击设置
- 点击左侧POP3/SMTP/IMAP
- 右侧开启POP3/SMTP服务
- 需要发送短信,再设置授权码。
4.服务器地址及帮助
服务器地址及协议端口:
新浪邮箱帮助:http://help.sina.com.cn/comquestiondetail/view/160/
# ################选择新浪邮箱###############
# 新浪@sina.com邮箱 新浪@sina.cn邮箱
# 接受服务器地址:pop.sina.com or pop3.sina.com pop.sina.cn or pop3.sina.cn
# 发送服务器地址:smtp.sina.com smtp.sina.cn
# ###########端口号设置###################
# POP 协议 pop端口:110 smtp 端口:25
# IMAP 协议 IMAP 端口:143 smtp 端口:25
# ############加密设置####################
# pop: 995 imap: 993
# smtp: 587 or 465
网易邮箱的帮助:https://help.mail.163.com/faq.do?m=list&categoryID=76
QQ邮箱的帮助:https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=430&&id=48
除了改个域名,基本上一样。
5开始发送邮件-纯文本
5.1邮件发送
# 发送纯文本邮件
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from smtplib import SMTP_SSL
server = 'smtp.qq.com' # 使用的QQ邮箱的SMTP服务器
sender = 'xxx@qq.com' # 你的QQ邮箱账号
pwd = 'xxxxxxxxxxxxxxxx' # 你的16位授权码
sender_mail = 'xxx@qq.com' # 发送方的邮箱
receiver = 'xxx@sina.com' # 接收方的邮箱
mail_title = 'xxx@qq.com' # 邮件标题
mail_content = '用QQ邮箱发的!' # 邮件内容
# 构造邮件
msg = MIMEMultipart()
msg['Subject'] = Header(mail_title, 'utf-8') # 构造邮件标题
msg['From'] = sender_mail # 构造邮件发送方
msg['To'] = Header('test', 'utf-8') # 构造邮件接受方
msg.attach(MIMEText(mail_content, 'plain', 'utf-8')) # 构造邮件内容
# 发送邮件
smtp = SMTP_SSL(server) # 加密发送
smtp.set_debuglevel(1) # 打印smtplib库和smtp服务器的交互过程
smtp.login(sender_mail, pwd) # 通过smtplib登录smtp服务器
somebody = smtp.sendmail(sender_mail, [receiver], msg.as_string()) # 发送邮件
smtp.quit() # 退出服务器
交互过程:
send: 'ehlo [192.168.48.1]\r\n'
reply: b'250-newxmesmtplogicsvrsza2.qq.com\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-SIZE 73400320\r\n'
reply: b'250-AUTH LOGIN PLAIN\r\n'
reply: b'250-AUTH=LOGIN\r\n'
reply: b'250-MAILCOMPRESS\r\n'
reply: b'250 8BITMIME\r\n'
reply: retcode (250); Msg: b'newxmesmtplogicsvrsza2.qq.com\nPIPELINING\nSIZE 73400320\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME'
send: 'AUTH PLAIN ADEzMTUzOTU2MjFAcXEuY29tAHF5dGZyc29nY2R2eWphZ2c=\r\n'
reply: b'235 Authentication successful\r\n'
reply: retcode (235); Msg: b'Authentication successful'
send: 'mail FROM:<xxx@qq.com> size=402\r\n'
reply: b'250 OK.\r\n'
reply: retcode (250); Msg: b'OK.'
send: 'rcpt TO:<xxx@sina.com>\r\n'
reply: b'250 OK\r\n'
reply: retcode (250); Msg: b'OK'
send: 'data\r\n'
reply: b'354 End data with <CR><LF>.<CR><LF>.\r\n'
reply: retcode (354); Msg: b'End data with <CR><LF>.<CR><LF>.'
data: (354, b'End data with <CR><LF>.<CR><LF>.')
send: b'Content-Type: multipart/mixed; boundary="===============4761608527476114621=="\r\nMIME-Version: 1.0\r\nSubject: =?utf-8?q?1315395621=40163=2Ecom?=\r\nFrom: xxx@qq.com\r\nTo: =?utf-8?q?test?=\r\n\r\n--===============4761608527476114621==\r\nContent-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: base64\r\n\r\n55SoUVHpgq7nrrHlj5HnmoQh\r\n\r\n--===============4761608527476114621==--\r\n.\r\n'
reply: b'250 OK: queued as.\r\n'
reply: retcode (250); Msg: b'OK: queued as.'
data: (250, b'OK: queued as.')
send: 'quit\r\n'
reply: b'221 Bye.\r\n'
reply: retcode (221); Msg: b'Bye.'
新浪邮箱收到:
5.2代码解析
- 构造一个邮件对象就是一个Message对象
- 如果使用MIMEText构造一个MEMEText对象,就表示一个文本邮件对象;
- 如果构造一个MIMEImage对象,就是一个作为附件的图片;
- 要把多个对象组合起来,使用MIMEMultipart对象;
- MIMEBase可以表示任何对象。
继承关系:
Message
MIMEBase
MIMEMultipart
MIMENonMultipart
MIMEMessage
MIMEText
MIMEImage
6.不同邮箱互发测试
测试目标:1-新浪邮箱 2-QQ邮箱 3-网易邮箱
发送测试结果:
- QQ邮箱可以发送给自己,网易邮箱和新浪邮箱
- 新浪邮箱可以发送给自己,但是发送给QQ邮箱和网易邮箱的失败了
- 网易邮箱可以发送给自己,新浪邮箱和QQ邮箱。
关于新浪的SMTP服务器发送失败,怀疑是SMTP服务器把我的邮件误认为是群发邮件或者是有毒邮件,所以偷偷扔掉了,但是不通知我,还返回给我一个成功的状态码。。。
关于邮件发送成功对方却接受不到的几种可能:http://qunfa.abot.cn/post/68.html
还有通过退信码查找错误原因:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html