Python使用SMTP协议实现邮件发送

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplibemail两个模块

  1. email负责构造邮件
  2. smtplib负责发送邮件

一、基本环境设置

以下笔者测试使用163邮箱给foxmail邮箱发邮件,所以需要手动对发送方邮箱配置SMTP协议,其余邮箱操作同理。
首先,登录到163邮箱,然后在设置菜单中点击如下选项。
Python使用SMTP协议实现邮件发送
然后,手动开启SMTP服务,此时可能需要设置客户端授权码,即为登录第三方邮件客户端的专用口令,和该邮箱登录密码不同,对于163邮箱可以自己设置授权码,但如果是QQ或者foxmail邮箱会有系统自动分配给用户授权码。
Python使用SMTP协议实现邮件发送
因为发送方是163邮箱,所以此时用到的SMTP服务器是smtp.163.com
对于其他邮箱相应的SMTP服务器是smtp.xxx.com,比如:
Gmail:smtp.gmail.com
Foxmail:smtp.foxmail.com
Python使用SMTP协议实现邮件发送

二、实现文本邮件发送

我们以下先来实现一下简单的文本邮件的发送代码。其中plain表示纯文本内容。

msg = MIMEText('I Love You','plain','utf-8')
from email.mime.text import MIMEText
from email.utils import formataddr
import smtplib
# SMTP服务器以及相关配置信息
smtp_sever = 'smtp.163.com'
from_addr = '[email protected]'
password = 'xxxx'
to_addr = '[email protected]'

# 1.创建邮件(写好邮件内容、发送人、收件人和标题等)
msg = MIMEText('I Love You','plain','utf-8')
msg['From'] = formataddr(('若水',from_addr))
msg['To'] = formataddr(('小伙伴',to_addr))
msg['Subject'] = '2019你好'
# 2.登录账号
sever = smtplib.SMTP(smtp_sever,25) # 端口号是25
sever.login(from_addr,password)
# 3.发送邮件
sever.sendmail(from_addr,to_addr,msg.as_string())
sever.quit()

【注意事项】:
1)如果没有加入如下代码,则会被识别为垃圾邮件,故出现错误代码是554smtplib.SMTPDataError错误。点击查看邮件退信代码说明

msg['From'] = formataddr(('若水',from_addr))
msg['To'] = formataddr(('小伙伴',to_addr))
msg['Subject'] = '2019你好'

Python使用SMTP协议实现邮件发送
2)如果是群发邮件,则需要发送到多个邮箱,则sever.sendmail中的to_addr可以是存储多个邮箱的列表。
3)msg['To']接收的是字符串而不是list,如果有多个邮件地址,用,分隔即可

若一切顺利,则可在QQ邮箱上看到该邮件(往往在垃圾箱中)
Python使用SMTP协议实现邮件发送

参考文献:
[1]廖雪峰.SMTP发送邮件
[2]Python之简单的SMTP发送邮件详细教程附代码