文章背景:自学Python编程快速上手
中关于发送电子邮件的章节。本文讲述如何通过Python,使用QQ邮箱发送电子邮件。
连接到SMTP服务器
import smtplibsmtpObj = smtplib.SMTP('smtp.qq.com',587)
发送SMTP的“Hello”消息
smtpObj.ehlo()
开始TLS加密
smtpObj.starttls()
登陆到SMTP服务器
smtpObj.login('my_email_address@qq.com','MY_SECRET_PASSWORD')
对于MY_SECRET_PASSWORD,针对QQ邮箱,需要输入的是授权码。授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
将密码放在源代码中要当心。调用input(),让用户输入密码是个好主意。
发送电子邮件
from email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import parseaddr, formataddrdef _format_addr(s): name, addr = parseaddr(s) return formataddr((Header(name, 'utf-8').encode(), addr))from_addr = 'my_email_address@qq.com' # 发件人to_addr = 'recipient@example.com' # 收件人message = MIMEText('Happy new year!', 'plain', 'utf-8') # 正文message['From'] = _format_addr('Sam ' % from_addr) # 发件人message['To'] = _format_addr('Python lover ' % to_addr) # 收件人subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8') #主题smtpObj.sendmail(from_addr, [to_addr], message.as_string())
邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发送出去,而是包含在发给message的文本中。所以,我们必须把
From
、To
和Subject
添加到MIMEText
中,才是一封完整的邮件。函数
_format_addr()
用来格式化一个邮件地址;如果包含中文,需要通过Header
对象进行编码。message['To']接收的是字符串而不是list,如果有多个邮件地址,用
,
分隔即可。sendmail()
方法就是发邮件,由于可以一次发给多个人,所以传入一个list
,邮件正文是一个str
,as_string()
把MIMEText
对象变成str
。
从SMTP服务器断开
smtpObj.quit()
代码汇总
import smtplibfrom email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import parseaddr, formataddrdef _format_addr(s): name, addr = parseaddr(s) return formataddr((Header(name, 'utf-8').encode(), addr))# 1. 连接到SMTP服务器smtpObj = smtplib.SMTP('smtp.qq.com',587)# 2. 发送SMTP的“HELLO”消息smtpObj.ehlo()# 3. 开始TLS加密smtpObj.starttls()# 4. 登陆到SMTP服务器smtpObj.login('my_email_address@qq.com','MY_SECRET_PASSWORD')# 5. 发送电子邮件from_addr = 'my_email_address@qq.com' # 发件人to_addr = 'recipient@example.com' # 收件人message = MIMEText('Happy new year!', 'plain', 'utf-8') # 正文message['From'] = _format_addr('Sam ' % from_addr) # 发件人message['To'] = _format_addr('Python lover ' % to_addr) # 收件人subject = 'Python SMTP 邮件测试'message['Subject'] = Header(subject, 'utf-8') #主题smtpObj.sendmail(from_addr, [to_addr], message.as_string())# 6. 从服务器断开smtpObj.quit()print("Done!")
运行代码后,打开收件箱,效果如下:
参考资料:
[1] Python编程快速上手—让繁琐工作自动化(https://ddz.red/AFTmO)
[2] QQ邮箱的POP3与SMTP服务器(https://service.mail.qq.com/cgi-bin/help?subtype=1&no=167&id=28)
[3] 授权码(https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256%27)
[4] SMTP发送邮件(https://www.liaoxuefeng.com/wiki/1016959663602400/1017790702398272)
[5] Python SMTP发送邮件(https://www.runoob.com/python/python-email.html)