smtplib、email实现邮件发送

Python实现发送邮件主要用到smtplib和email模块,其中:

  • smtplib模块主要负责发送邮件的动作、连接邮箱服务器和登录邮箱等操作。
  • email模块用于管理电子邮件消息的库,主要负责构造邮件,如发件人、收件人、主题、正文、附件等。

通过smtplib、email模块可以发送纯文字、HTML、图片、带附件的邮件。

发送纯文字邮件

发送纯文字邮件,首先使用email模块编辑邮件信息,如发件人、收件人、邮件主题和邮件内容等,示例代码如下:

from email.mime.text import MIMEText
from email.header import Header

mail_msg = """
Python 测试邮件...
"""

message = MIMEText(mail_msg, 'plain''utf-8')      # 邮件内容
message['From'] = Header("白巧克力LIN"'utf-8')         # 发件人名称(可以随便起)
message['To'] = Header("xxx"'utf-8')          # 收件人名称(可以随便起)
message['cc']='xxxxxxxxxxx'       # 抄送人(可以随便填)
message['Subject'] = Header('测试邮件''utf-8')  # 邮件主题
message['Date']=''       # 邮件日期,不可省略,可以随便填,最终日期为系统日期

使用MIMEText()方法编辑邮件内容,其中:第一个参数是邮件内容,第二个参数是文本格式,可选值有plain(原生文本模式)、html(网页文本模式),第三个参数是编码方式。

好了,编辑好邮件信息后,接下来通过smtplib模块实现发送邮件的动作、连接邮箱服务器和登录邮箱,示例代码如下:

import smtplib
sender = 'xxxxxxxxxxx@xxx.com'   # 发件人邮箱
receivers = ['xxxxxxxxx@xxx.com','xxxxxxxxx@xxx.com']  # 收件人邮箱列表
try:
    smtpObj = smtplib.SMTP_SSL('smtp.xxx.cn')  # 获得邮箱服务器的传输协议证书
    smtpObj.connect('smtp.xxx.cn''服务器端口')     # 连接邮箱服务器
    smtpObj.login('登录邮箱''授权码')       # 登录邮箱
    smtpObj.sendmail(sender,receivers, message.as_string())  # 发送邮件
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)

首先使用smtplib.SMTP_SSL()方法获取邮箱服务器的传输协议证书,其传入的参数为邮箱服务器,常见的邮件服务器如下:

  • 谷歌邮箱:smtp.gmail.com,端口号:587;
  • 新浪邮箱:smtp.sina.com.cn,端口号:25;
  • 网易邮箱:smtp.163.com,端口号:25;
  • Foxmail邮箱:SMTP.foxmail.com,端口号:25;
  • QQ邮箱:smtp.qq.com,端口号:25;
  • 阿里云邮箱:smtp.aliyun.com,SSL加密端口:465;非加密端口:25;

获取传输协议证书后,通过connect()方法连接邮箱服务器,再通过login()方法登录邮箱,最后通过sendmail()方法发送邮件。

发送HTML邮件

发送HTML邮件与发送纯文字邮件类似,发送HTML邮件的邮件内容为HTML文本,MIMEText()方法第二个参数为html,示例代码如下:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

mail_msg = """
<body>
Python 测试邮件...
</body>
"""

message = MIMEText(mail_msg, 'html''utf-8')      # 邮件内容
message['From'] = Header("白巧克力LIN"'utf-8')         # 发件人名称(可以随便起)
message['To'] = Header("xxx"'utf-8')          # 收件人名称(可以随便起)
message['cc']='xxxxxxxxxxx'       # 抄送人(可以随便填)
message['Subject'] = Header('测试邮件''utf-8')  # 邮件主题
message['Date']=''       # 邮件日期,不可省略,可以随便填,最终日期为系统日期

sender = 'xxxxxxxxxxx@xxx.com'   # 发件人邮箱
receivers = ['xxxxxxxxx@xxx.com','xxxxxxxxx@xxx.com']  # 收件人邮箱列表
try:
    smtpObj = smtplib.SMTP_SSL('smtp.xxx.cn')    # 获得邮箱服务器的传输协议证书
    smtpObj.connect('smtp.xxx.cn''服务器端口')     # 连接邮箱服务器
    smtpObj.login('登录邮箱''授权码')       # 登录邮箱
    smtpObj.sendmail(sender,receivers, message.as_string())  # 发送邮件
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)

通过编写HTML代码使邮件内容样式更加丰富,例如为邮件内容字体加粗、加大,发送表格等。

发送图片邮件

发送图片邮件与发送纯文字、HTML邮件有所不同,编辑邮件信息示例代码如下:

from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
mail_msg = """
<body>
<p>测试Python发送带图片的邮件...</p>
<p>图片如下:</p>
<p><img src="cid:jpg1" alt="testimage1"></p>
<p><img src="cid:jpg2" alt="testimage2"></p>
</body>
"""

message = MIMEMultipart()    # 创建可携带各种资源的实例
message.attach(MIMEText(mail_msg,'html','utf-8'))  # 将邮件信息绑定到实例中
with open('1.png''rb'as image_file:   # 二进制读取图片
    msgImage = MIMEImage(image_file.read())  # 将二进制图片放在msgImage变量中
msgImage.add_header('Content-ID''jpg1')  # 定义图片 ID,在 HTML 文本中引用
message.attach(msgImage)        # 将图片绑定到实例中
message['From'] = Header("白巧克力LIN"'utf-8')   # 发件人名称(可以随便起)
message['To'] = Header("xxx"'utf-8')       # 收件人名称(可以随便起)
message['cc']='xxxxxxxxxxx'       # 抄送人(可以随便填)
message['Subject'] = Header('测试邮件''utf-8')  # 邮件主题
message['Date']=''     # 邮件日期,不可省略,可以随便填,最终日期为系统日期

首先通过MIMEMultipart()方法创建实例,通过attach()方法将MIMEText()方法的邮件信息绑定到实例中,再通过MIMEImage()方法读取的图片存储在变量msgImage中,通过add_header()方法引用图片,通过attach()方法绑定到实例中。

当我们需要发送多张图片时,只需要重复15行到19行代码即可。

接下来通过smtplib模块实现发送邮件的动作、连接邮箱服务器和登录邮箱,示例代码如下:

import smtplib
sender = 'xxxxxxxxxxx@xxx.com'   # 发件人邮箱
receivers = ['xxxxxxxxx@xxx.com','xxxxxxxxx@xxx.com']  # 收件人邮箱列表
try:
    smtpObj = smtplib.SMTP_SSL('smtp.xxx.cn')  # 获得邮箱服务器的传输协议证书
    smtpObj.connect('smtp.xxx.cn''服务器端口')     # 连接邮箱服务器
    smtpObj.login('登录邮箱''授权码')       # 登录邮箱
    smtpObj.sendmail(sender,receivers, message.as_string())  # 发送邮件
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)

发送附件邮件

发送附件邮件与发送图片邮件类似,编辑邮件信息示例代码如下:

from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
mail_msg = """
Python测试邮件...
"""

message = MIMEMultipart()    # 创建可携带各种资源的实例
message.attach(MIMEText(mail_msg, 'plain''utf-8')) # 将邮件信息绑定到实例中
att_annex1 = MIMEText(open('文件1.xlsx''rb').read(), 'base64''utf-8'# 读取文件1.xlsx文件并构造附件1
att_annex1["Content-Type"] = 'application/octet-stream'   # 文件类型,二进制字节流
att_annex1["Content-Disposition"] = 'attachment; filename="1111.xlsx"' # filename为邮件中附件的名字,不支持中文,后缀名要和传输的文件后缀名要一致
message.attach(att_annex1)    # 将附件1绑定到实例中

首先使用MIMEMultipart()方法创建可携带各种资源的实例,通过attach()方法将MIMEText()方法的邮件信息绑定到实例中,通过MIMEText()方法将读取到文件构造成附件,通过将参数Content-Type的值设置为’application/octet-stream’告诉浏览器这是一个字节流(浏览器处理字节流的默认方式是下载),通过参数Content-Disposition来编辑附件的文件名并通过attach将附件绑定到实例中。

接下来通过smtplib模块实现发送邮件的动作、连接邮箱服务器和登录邮箱,示例代码如下:

import smtplib
sender = 'xxxxxxxxxxx@xxx.com'   # 发件人邮箱
receivers = ['xxxxxxxxx@xxx.com','xxxxxxxxx@xxx.com']  # 收件人邮箱列表
try:
    smtpObj = smtplib.SMTP_SSL('smtp.xxx.cn')  # 获得邮箱服务器的传输协议证书
    smtpObj.connect('smtp.xxx.cn''服务器端口')     # 连接邮箱服务器
    smtpObj.login('登录邮箱''授权码')       # 登录邮箱
    smtpObj.sendmail(sender,receivers, message.as_string())  # 发送邮件
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print(e)

这样就成功发送附件邮件了。

好了,关于smtplib、email实现发送邮件就讲到这里。

– END –


原文始发于微信公众号(白巧克力LIN):smtplib、email实现邮件发送

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/222532.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!