本文改写于2019年5月30日
前言
借助于本篇学习了解python如何去利用SMTP发送邮件,实操部分用的是阿里云的邮件推送服务。每天可以有200封免费邮件发送。
本文涉及到的库有:smtplib、email、yagmail
一、基本语法
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
- host:为可选参数,一般为服务器本机ip地址或者是域名
- port:在给出host后,指定SMTP的端口号,,一般为25端口
- local_hostname:若本机发送邮件,填写:localhost即可
Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
参数说明:
- from_addr: 邮件发送者地址。
- to_addrs: 字符串列表,邮件发送地址。
- msg: 发送消息
简单实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方 SMTP 服务
mail_host="smtp.XXX.com" #设置服务器
mail_user="XXXX" #用户名
mail_pass="XXXXXX" #口令
sender = '[email protected]'
receivers = ['[email protected]'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] = Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"
二、实操部分
2.1 准备工作
- 登入阿里云账号选择
邮件推送
产品 - 设置
发信域名
按要求添加一个域名(最好备案) - 去域名解析的地方按
配置
要求解析 - 解析完成后
验证
- 设置
发信域名
,新建发信地址
,发信类型
选择触发
,回信地址
不用填 - 设置
SMTP密码
大写字母,小写字母,数字都要有!
2.2 纯文本内容或者超文本(html)发送
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 设置账户
ali_username = '你设置的SMTP发件地址'
ali_password = 'SMTP密码'
# 发送者
sender = '设置的发件地址'
# 接收者,最多限制30个
receiver =['收件人邮箱']
# 构造邮件消息
# 邮件正文(纯文本)
mail_content = '这里填写你要发送邮件的正文内容'
msg = MIMEText(mail_content, 'plain', 'utf-8')
# 邮件正文(超文本(html))
# mail_content = r'这是个测试邮件
我在测试发送html,这是一个超级链接百度
'
# msg = MIMEText(mail_content, 'html', 'utf-8')
# 邮件主题
mail_title = '这里填写邮件主题'
msg['Subject'] = Header(mail_title, 'utf-8') # 中文需要编码
msg['From'] = sender
msg['To'] = ';'.join(receiver) # 将收件人列表转成;分割的字符串
# 连接SMTP服务端,用的SSL方式,端口465
try:
smtp = smtplib.SMTP_SSL('smtpdm.aliyun.com')
# 设置debug调试,0关闭,1开启,2带有时间戳(v3.5+)
smtp.set_debuglevel(0)
smtp.login(ali_username, ali_password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print('邮件发送成功!')
except Exception as e:
print('邮件发送失败:'+ str(e))
- 构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。
- msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。
2.3 发送图像、文本、附件混合
该部分内容详情见:参考文章3
multpart说明:
- 常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。
- 邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。
- 邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。
- 邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
# 设置账户
ali_username = '你设置的SMTP发件地址'
ali_password = 'SMTP密码'
# 发送者
sender = '设置的发件地址'
# 接收者,最多限制30个
receiver =['收件人信箱']
# 构造邮件对象MIMEMultipart对象,支持图片、附件、文本、超文本
msg = MIMEMultipart()
# 邮件主题
mail_title = '这里填写邮件主题'
msg['Subject'] = Header(mail_title, 'utf-8') # 中文需要编码
msg['From'] = sender
msg['To'] = ';'.join(receiver)
# 邮件正文
# 构造文字内容
# text = 'Hi!\n 我在测试发送邮件。\n这是你要的连接:https://www.baidu.com\n '
# text_plain = MIMEText(text, 'plain','utf-8')
# msg.attach(text_plain)
# 构造图片链接,将图片放置正文
with open('./test.png', 'rb') as imagefile:
sendimagefile = imagefile.read()
image = MIMEImage(sendimagefile)
# image.add_header('Content-Disposition', 'attachment', filename = 'test.png')
# 添加图片附件,不能和正文添加图片共存
image.add_header('Content-ID', '')
msg.attach(image)
# 构造正文html,不能和文本共存
html = """
Hi!
How are you?
Here is the link you wanted.
"""
text_html = MIMEText(html,'html', 'utf-8')
# text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"' # 作为附件添加需加此条语句
msg.attach(text_html)
# 构造附件
with open('./test.py','rb') as uploadfile:
sendfile = uploadfile.read()
sendfile_part = MIMEApplication(sendfile) # 用MIMEApplication支持多种文件类型
sendfile_part.add_header('Content-Disposition', 'attachment', filename="test.py")
msg.attach(sendfile_part)
# 连接SMTP服务端,用的SSL方式,端口465
try:
smtp = smtplib.SMTP_SSL('smtpdm.aliyun.com')
# 设置debug调试,0关闭,1开启,2带有时间戳(v3.5+)
smtp.set_debuglevel(0)
smtp.login(ali_username, ali_password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print('邮件发送成功!')
except Exception as e:
print('邮件发送失败:'+ str(e))
三、人生苦短,我用Python
Python为啥伟大,不就是因为有众多的第三方库么。接下来介绍下发邮件的库:yagmail
,用了这个,那么你就哈哈哈哈哈~~~~~~
任何库请学会看官方文档
官方文档:传送门
使用前请先安装yagmail
库
import yagmail
username = '你设置的SMTP发件地址'
password = 'SMTP密码'
receiver = ['收件人']
subject = '这是一个测试主题文件'
content = ['这是正文文本及html加图片测试,这是文本','这是html 链接 you wanted.',yagmail.inline('./test.png'),{'./test.png':'a.png'}]
# 只有图片可以用字典显示别名
# yagmail.inline()可以将图片嵌入正文
# 将正文全部以文本输出用yagmail.raw(),否则会自动判别类型
try:
yag = yagmail.SMTP(user=username, password=password, host='smtpdm.aliyun.com', port=465)
yag.send(to=receiver,subject=subject, contents=content, attachments=['./proxy.txt'])
print('邮件发送成功')
except Exception as e:
print(e)
参考文章
1、http://www.runoob.com/python/python-email.html
2、https://www.jianshu.com/p/abb2d6e91c1f
3、https://www.cnblogs.com/yufeihlf/p/5726619.html
4、https://www.docs4dev.com/docs/zh/python/3.7.2rc1/all/library-smtplib.html
5、https://blog.csdn.net/zhouxuan623/article/details/52595933
6、https://github.com/kootenpv/yagmail
7、https://www.cnblogs.com/fnng/p/7967213.html
8、https://www.jianshu.com/p/7db6af151e6c