一、用python实现自动发邮件的思路如下:

使用Python发送邮件, 需要使用smtplib与email两个模块
画出图就是这么个意思:
image.png
也就是说email模块负责构造邮件;smtplib模块负责发送邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
首先, 我们来构造一个简单的邮件。

#代码片段
from email.mime.text import MIMEText 
import smtplib
msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8')

在这里, 我们把email模块与smtplib模块引入进来,我们还使用MIMEText构造了邮件内容。
MIMEText对象中, 有三个参数。
image.png
然后通过SMTP发送邮件出去。

现在有了邮件的正文, 但是还缺少, 发件人,收件人; 接下来,我们向用户收集信息。

#代码片段
# 输入Email地址和口令:
from_addr = input('From: ')
password = input('Password: ')
# 输入SMTP服务器地址:
smtp_server = input('SMTP server: ')
# 输入收件人地址:
to_addr = input('To: ')

在这里, 我们需要拿到, 发件人的邮箱,邮箱的密码, SMTP服务器地址, 还有收件人的邮箱。
这个STMP服务器地址是什么?
SMTP服务器地址,实际上就是代收发服务器地址,是由邮箱服务商提供的。说白了,你用哪家公司的邮箱, 就是哪家公司收发邮件服务器的地址。

在本文中编写的程序以QQ邮箱来测试. 使用QQ邮箱的收发邮件服务器的地址。

QQ邮箱SMTP服务器地址:smtp.qq.com, 端口465, QQ邮箱默认的端口是25, 我们这里使用的是加密端口465。

好了, 接下来我们要开始配置SMTP服务了.

#代码片段
server = smtplib.SMTP_SSL(smtp_server, 465) # SMTP协议加密端口是465
server.set_debuglevel(1)    #调试级别
#用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。

好了,接下来我们就要想着发送邮件了, 完成SMTP发送邮件功能

#代码片段
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())

login()方法用来登录SMTP服务器,参数有两个, from_addr是用户输入的发件邮箱, password是发件邮箱的密码。

sendmail()方法就是发邮件,需要引入三个参数:

第一个参数:from_addr是发件人的邮箱地址

第二个参数:[to_addr] 是收件人的邮箱地址, 是列表形式。因为邮件可能一次发给多个人,使用列表,如果发送多个人,就写多个邮箱,中间使用逗号隔开。

第三个参数:msg.as_string()把邮件内容MIMEText对象变成str。

接下来我们整合所有代码.如下:

from email.mime.text import MIMEText
import smtplib
msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8')
# 输入Email地址和口令:
from_addr = input('请输入发件人的邮箱号码From: ')
password = input('请输入发件人的邮箱密码Password: ')
# 输入SMTP服务器地址:
smtp_server = input('请输入邮箱服务器地址SMTP server: ')
# 输入收件人地址:
to_addr = input('请输入收件人邮箱地址To: ')

server = smtplib.SMTP_SSL(smtp_server, 465) # SMTP协议加密端口是465
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

好了,运行一下上面代码, 观察终端里的效果。
发现报错了:SMTPAuthenticationError: (535, b’Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256‘)
如果出现这种错误, 就说明邮箱出现授权问题. 也就是邮箱的SMTP服务没有开启。
解决办法请参考:<https://blog.51cto.com/u_5839280/3815351&gt;
问题解决后,运行代码,就可以在收件人信箱中收到我们刚发送的Email,如下图

image.png

仔细观察上图,会发现,现在还存在如下两个问题: 1.邮件没有主题; 2.收件人的名字没有显示为友好的名字,比如某某先生 ;

这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件。

二、用python编写自动发邮件的代码如下:

对以上代码进行完善后:

# 1、encoders模块负责编码 
# 2、Header模块负责处理邮件头 
# 3、MIMEText模块负责处理文本 
# 4、parseaddr模块与formataddr模块 负责将输入的内容格式化
# 5、smtplib模块负责发送邮件
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

# 用来处理格式化文本,将格式化的结果作为返回值传出去
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( Header(name, 'utf-8').encode(), addr))
# 输入Email地址和口令:
from_addr = input('请输入发件人的邮箱号码From: ')
password = input('请输入发件人的邮箱密码Password: ')
# 输入SMTP服务器地址:
smtp_server = input('请输入邮箱服务器地址SMTP server: ')
# 输入收件人地址:
to_addr = input('请输入收件人邮箱地址To: ')

# 邮件正文内容
content = '''
亲爱的朋友:
    你好!
    恭喜你坚持到现在!
    继续努力加油吧,未来可期,奥利给!
'''

# 把From、To和Subject添加到MIMEText中,才是一封完整的邮件
# 将发送邮箱、接收邮箱、邮件主题格式化
msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = _format_addr(u'英子 <%s>' % from_addr)
msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'来自好友的问候……', 'utf-8').encode()

# SMTP协议加密端口是465
server = smtplib.SMTP_SSL(smtp_server,465)

# 调试级别,用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息
server.set_debuglevel(1)

#login()方法用来登录SMTP服务器,参数有两个, from_addr是用户输入的发件邮箱, password是发件邮箱的密码。
server.login(from_addr, password) 

#sendmail()方法就是发邮件,需要引入三个参数:
# 第一个参数:from_addr是发件人的邮箱地址
# 第二个参数:[to_addr] 是收件人的邮箱地址, 是列表形式。因为邮件可能一次发给多个人,使用列表,如果发送多个人,就写多个邮箱,中间使用逗号隔开。
# 第三个参数:msg.as_string()把邮件内容MIMEText对象变成str。
server.sendmail(from_addr, [to_addr], msg.as_string())

#server.quit()语句,是邮件发送结束后,停止服务的意思.
server.quit() 

收到的邮件如下:
image.png