zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python: 通过QQ邮箱发送电子邮件

PythonQQ 通过 发送 邮箱 电子邮件
2023-06-13 09:12:58 时间

文章背景:自学Python编程快速上手中关于发送电子邮件的章节。本文讲述如何通过Python,使用QQ邮箱发送电子邮件。

  1. 连接到SMTP服务器 import smtplib smtpObj = smtplib.SMTP('smtp.qq.com',587)
  1. 发送SMTP的“Hello”消息 smtpObj.ehlo()
  2. 开始TLS加密 smtpObj.starttls()
  3. 登陆到SMTP服务器 smtpObj.login('my_email_address@qq.com','MY_SECRET_PASSWORD') 对于MY_SECRET_PASSWORD,针对QQ邮箱,需要输入的是授权码。授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。 将密码放在源代码中要当心。调用input(),让用户输入密码是个好主意。
  4. 发送电子邮件
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr

def _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 <%s>' % from_addr)          # 发件人
message['To'] =  _format_addr('Python lover <%s>' % to_addr)    # 收件人

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')    #主题

smtpObj.sendmail(from_addr, [to_addr], message.as_string())
  • 邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发送出去,而是包含在发给message的文本中。所以,我们必须把FromToSubject添加到MIMEText中,才是一封完整的邮件。
  • 函数_format_addr()用来格式化一个邮件地址;如果包含中文,需要通过Header对象进行编码。
  • message['To']接收的是字符串而不是list,如果有多个邮件地址,用,分隔即可。
  • sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个stras_string()MIMEText对象变成str
  1. 从SMTP服务器断开
smtpObj.quit()

代码汇总

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr

def _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 <%s>' % from_addr)          # 发件人
message['To'] =  _format_addr('Python lover <%s>' % 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)