1.SMTP 发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
如果我们本机没有 sendmail 访问,可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。
下面以QQ邮箱为例:
1.1使用SMTP的第一步需要把邮箱的SMTP服务打开:
-
登录QQ邮箱网页版,点击设置:
-
在账户一栏中找到SMTP服务:
-
打开SMTP服务,根据提示验证密保:
-
验证成功后复制授权码备用:
1.2准备发送邮件
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:邮件发送失败')
运行代码:
可以看到邮件发送成功,打开邮箱:
可以看到收到了一封邮件:
1.3使用Python发送HTML格式的邮件
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:邮件发送失败')
发送的邮件如下:
1.4给邮件添加附件
发送带附件的邮件,首先要创建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:邮件发送失败')
成功发送的邮件如下: