SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
如果我们本机没有 sendmail 访问,可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。
下面以QQ邮箱为例:
登录QQ邮箱网页版,点击设置:
在账户一栏中找到SMTP服务:
打开SMTP服务,根据提示验证密保:
验证成功后复制授权码备用:
import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方SMTP服务器地址: smtp_server = 'smtp.qq.com' # 输入Email地址和授权码: from_addr = 'xxxxx@qq.com' password = 'xxxxxxxxxxxxxx' # 输入收件人地址: to_addr = 'weijiajian@wei.tax' # 定义发送的消息,其中plain是文本格式 message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8') # 定义发送人名字 message['From'] = Header('Python', 'utf-8') # 定义接收人的名字 message['To'] = Header('测试员', 'utf-8') # 定义邮件主题 subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') # 尝试发送邮件 try: # 创建SMTP对象 smtpObj = smtplib.SMTP() # 创建SMTP连接 smtpObj.connect(smtp_server, 25) # SMTP的端口号,一般为25 # 登录邮箱 smtpObj.login(from_addr, password) # 发送邮件 发送方 接收方 信息 smtpObj.sendmail(from_addr, to_addr, message.as_string()) print('邮件发送成功') except smtplib.SMTPException: print('Error:邮件发送失败')
运行代码:
可以看到邮件发送成功,打开邮箱:
可以看到收到了一封邮件:
Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:
import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方SMTP服务器地址: smtp_server = 'smtp.qq.com' # 输入Email地址和授权码: from_addr = 'w.yuling@qq.com' password = 'xxxxxxxxx' # 输入收件人地址: to_addr = 'weijiajian@wei.tax' # 定义发送的消息,定义为html格式 html_message = """ <p>这是一封html格式的邮件</p> <p><a href="https://weibk.github.io">这是一个连接,通往我的主页</a></p> """ message = MIMEText(html_message, 'html', 'utf-8') # 定义发送人名字 message['From'] = Header('Python', 'utf-8') # 定义接收人的名字 message['To'] = Header('测试员', 'utf-8') # 定义邮件主题 subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') # 尝试发送邮件 try: # 创建SMTP对象 smtpObj = smtplib.SMTP() # 创建SMTP连接 smtpObj.connect(smtp_server, 25) # SMTP的端口号,一般为25 # 登录邮箱 smtpObj.login(from_addr, password) # 发送邮件 发送方 接收方 信息 smtpObj.sendmail(from_addr, to_addr, message.as_string()) print('邮件发送成功') except smtplib.SMTPException: print('Error:邮件发送失败')
发送的邮件如下:
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header # 第三方SMTP服务器地址: smtp_server = 'smtp.qq.com' # 输入Email地址和授权码: from_addr = 'w.yuling@qq.com' password = 'xxxxxxxxxxx' # 输入收件人地址: to_addr = 'weijiajian@wei.tax' # 创建一个带附件的实例 message = MIMEMultipart() # 定义发送人名字 message['From'] = Header('Python', 'utf-8') # 定义接收人的名字 message['To'] = Header('测试员', 'utf-8') # 定义邮件主题 subject = 'Python SMTP 带附件的邮件测试' message['Subject'] = Header(subject, 'utf-8') # 邮件正文: message.attach(MIMEText('这封邮件带了两个附件.....', 'plain', 'utf-8')) # 添加第一个附件,传送当前目录下的 abs_test.py 文件 att1 = MIMEText(open('abs_test.py').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="abs_test.py"' message.attach(att1) # 添加第二个附件 att2 = MIMEText(open('calc_test.py').read(), 'base64', 'utf-8') att2["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att2["Content-Disposition"] = 'attachment; filename="calc.py"' message.attach(att2) # 尝试发送邮件 try: # 创建SMTP对象 smtpObj = smtplib.SMTP() # 创建SMTP连接 smtpObj.connect(smtp_server, 25) # SMTP的端口号,一般为25 # 登录邮箱 smtpObj.login(from_addr, password) # 发送邮件 发送方 接收方 信息 smtpObj.sendmail(from_addr, to_addr, message.as_string()) print('邮件发送成功') except smtplib.SMTPException: print('Error:邮件发送失败')
成功发送的邮件如下: