学习:Python smtplib模块基于SMTP发送邮件
2020-02-25 本文已影响0人
RachaelRiggs
本人python小白,日记仅作学习记录之用,如有不妥之处还请指各位大佬指正~~
原理:
SMTP(Simple Mail Transfer Protocol)是简单传输协议,它是一组用于由源地址到目的地址的邮件传输规则。
Python smtplib库中,smtplib.SMTP()类有多种方法实现连接SMTP服务器,发送纯文本邮件、HTML邮件以及带附件的邮件等操作。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
Code:
# -*- coding: UTF-8 -*-
import smtplib
from smtplib import SMTP
from email.header import Header
from email.mime.text import MIMEText
receiver = "bleuxxxxine@163.com"
sender = "273xxxx212@qq.com"
# 主题如果是纯中文或纯英文则字符数必须大于等于5个
# 不然会报错554 SPM被认为是垃圾邮件或者病毒
subject = "肖个别和王世界的婚礼邀请函"
contents = "婚礼邀请函 送呈:悦小姐台启 谨订于公历2026年09月05日" \
"为Mr.Xiao和Mr.Wang举行结婚典礼敬备喜筵 恭请 光临 " \
"地点:意大利博肖市"
smtpserver = "smtp.qq.com"
username = "273xxxx212"
# 邮箱授权码,不是密码
password = "hyocrsxxxiwmdhfb"
msg = MIMEText(contents, 'plain', 'utf-8')
msg['Subject'] = Header('肖个别和王世界的结婚邀请函.', 'utf-8')
msg['From'] = sender
msg['To'] = receiver
#服务器地址和端口25
smtp = smtplib.SMTP(smtpserver, 25)
smtp.set_debuglevel(1)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print('邮件发送完成!')
最终效果:
说明:
- 构造一个最简单的纯文本邮件:
from email.mime.text import MIMEText
msg = MIMEText('contents', 'plain', 'utf-8')
# 构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入’plain’表示纯文本,最终的MIME就是’text/plain’,最后一定要用utf-8编码保证多语言兼容性。
- 通过SMTP把邮件发出去:
# 服务器地址和端口号
smtp = smtplib.SMTP(smtpserver, 25)
# set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息。
smtp.set_debuglevel(1)
# 登录SMTP服务器
smtp.login(username, password)
# 发送邮件
smtp.sendmail(sender, receiver, msg.as_string())
# 关闭SMTP会话
smtp.quit()
set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息。
SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。
- 第一次用网易的邮箱发邮件,多次尝试均提示退信代码,注意到控制台提示的信息,于是点开了提示网易退信代码的网址
554 DT:SPM 和554 IP is rejected,用SMTP发送多次以后IP被禁,所以之后就直接用QQ邮箱了。
以后调试看到错误提示不要慌张,看清楚提示信息知道哪里出错,有针对性地修改代码就好。
IP地址被禁
4.调试过程还出现
'list' object has no attribute 'encode'
意思是说“列表”不能被“编码”;后来检查发现是contents格式不是str,导致无法utf-8编码提示错误。
msg = MIMEText(contents, 'plain', 'utf-8')
- 结合这篇blog理解了Python中
if __name__ == '__main__':
的作用和原理 指路
简而言之,在if __name__ == '__main__':
以下的代码只有在 所在的.py文件中,文件直接作为脚本执行时,if __name__ == '__main__':
以下的代码才会被执行。
6.用smtplib库的方法还可以实现发附件、图片、读取文档or群发邮件,可参考指路