Python-使用SMTP服务发送邮件

1.SMTP 发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

如果我们本机没有 sendmail 访问,可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。

下面以QQ邮箱为例:

1.1使用SMTP的第一步需要把邮箱的SMTP服务打开:

  1. 登录QQ邮箱网页版,点击设置:

    Python-使用SMTP服务发送邮件

  2. 在账户一栏中找到SMTP服务:

    Python-使用SMTP服务发送邮件

Python-使用SMTP服务发送邮件

  1. 打开SMTP服务,根据提示验证密保:

    Python-使用SMTP服务发送邮件

  2. 验证成功后复制授权码备用:

    Python-使用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:邮件发送失败')

运行代码:

Python-使用SMTP服务发送邮件

可以看到邮件发送成功,打开邮箱:

Python-使用SMTP服务发送邮件

可以看到收到了一封邮件:

Python-使用SMTP服务发送邮件

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:邮件发送失败')

发送的邮件如下:

Python-使用SMTP服务发送邮件

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:邮件发送失败')

成功发送的邮件如下:

Python-使用SMTP服务发送邮件

上一篇:springboot 生产者消费者


下一篇:视觉SLAM十四讲CH4代码解析及课后习题详解