python smtp和yagmail发送邮件

1、邮件协议介绍

SMTP(Simple Mail Transfer Protocol)、POP3(Post Office Protocol version 3)和 IMAP(Internet Message Access Protocol)是电子邮件系统中使用的三种主要协议。它们各自承担着邮件服务中的不同职责,并且在使用场景和底层原理上有所不同。

  • SMTP 主要是用于发送邮件。

  • POP3 适合那些希望将邮件保存到本地而不占用服务器空间的用户。

  • IMAP 则更适合那些需要在多台设备间保持一致性的用户,因为它允许用户在服务器上管理和检索邮件。

2、邮件相关库

smptlib库:标准库,是互联网上传输电子邮件的标准协议。Python内置的smtplib模块提供了与SMTP服务器交互的功能,从而实现邮件的发送。

email.mime库:smtplib模块邮件内容主体的扩展,从原先默认只支持纯文本格式扩展到HTML,同时支持附件、音频、图像等格式,smtplib只负责邮件的投递即可。

from email.mime.text import MIMEText #构造一个MIMEText,表示文本邮件对象
#MIMEText对象中有三个需要我们设置的参数,一个是正文内容,一个是正文内容的类型,例如:”text/plain”和”text/html”,一个是正文内容的编码。
from email.mime.image import MIMEImage #构造一个MIMEImage,表示附件的图片邮件对象
from email.mime.multipart import MIMEMultipart #构造一个MIMEMultipart,表示整个邮件

yagmail库:yagmail 是一个 Python 包,旨在简化电子邮件的发送和接收。它建立在 Python 的 smtplib、email 和 keyring 模块之上,提供了一个高级的接口,使电子邮件操作更加容易。yagmail 的设计目标是使电子邮件发送和附件处理变得尽可能简单,同时保持灵活性。

3、smplib

python发送邮件存在以下步骤:登录邮件,编辑邮件内容,发送邮件。流程图参考网上:

(1)smtplib常用方法

  • smtplib.SMTP():初始化 SMTP 对象, 创建一个 SMTP 连接,也可以带上server和port连接到指定邮箱服务器。smtplib.SMTP(host, port)

  • smtplib.SMTP_SSL():初始化 SMTP 对象, 创建一个带有 SSL 加密的 SMTP 连接,也可以带上server和port连接到指定邮箱服务器。smtplib.SMTP_SSL(host, port)

  • SMTP.connect([host[,port]]):smtp对象没有连接到指定服务器可以用connect连接到指定服务器

  • obj.login(user,password):登录 SMTP 服务器。163和qq的password为授权码

  • obj.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]):发送邮件,其中 from_addr 是发件人地址,to_addrs 是收件人地址,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

  • obj.quit():断开与 SMTP 服务器的连接。

  • obj.starttls():启用 TLS 安全传输协议,增加安全性。

  • obj.set_debuglevel(level):设置调试等级,输出调试信息。

通常情况下会使用smtplib.SMTP来实例化,但是有些邮件服务器好多企业邮件是支持安全邮件的,认为它是不安全的而报错,所以需要使用加密过的SMTP_SSL来实例化或者obj.starttls()启动安全传输协议,不可以同时开启ssl和tls。

SMTP邮件服务器常用端口

25:最古老的一个SMTP端口,通过明文传输数据,经常被用来恶意发送垃圾邮件,现在大多数云服务器都会禁用掉25出口。

465:是为SMTPS(SMTP-over-SS)协议开放的,使用SSL加密信息,可以防止黑客截取邮件,但并未得到IETF机构的认证,SMTP/SMTPS之间关系类似于HTTP/HTTPS。

587:TLS/STARTTLS,基于身份验证的,使用该端口的SMTP服务 客户端必须要登录验证身份才能发送邮件,有效的避免垃圾邮件。

邮箱SMTP服务器登录口令支持加密方式对应端口号
163smtp.163.com个人设置授权码明文/SSL加密25/465
126smtp.126.com个人设置授权码明文/SSL加密25/465
QQsmtp.qq.com系统分配授权码明文/SSL加密/TLS加密25/465/587
Gmailsmtp.gmail.com邮箱登录密码TLS加密587

4、email.mime

一封Email邮件,不仅仅是有一些字符串组成的内容,它是一个结构,有收件人,发件人,抄送名单,邮件主题等等。要组织好这样一个结构,我们才能发送邮件。而组织Email邮件内容结构的任务,不属于smtplib模块范围,我们需要用到email模块(标准库中的模块)提供的一些工具。

(1)email.mime常用方法

在python中,MIME的这些对象的继承关系如下:

MIMEBase |-- MIMENonMultipart |-- MIMEApplication |-- MIMEAudio |-- MIMEImage |-- MIMEText |-- MIMEMultipart

一般不会用到MIMEBase,而是直接使用它的继承类。MIMEMultipart有attach方法,而MIMENonMultipart没有,只能被attach。MIME有很多种类型,这个略麻烦,如果附件是图片格式,我要用MIMEImage,如果是音频,要用MIMEAudio,如果是word、excel,我都不知道该用哪种MIME类型了,得上google去查。

最懒的方法就是,不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。application/octet-stream表明“这是个二进制的文件,希望你们那边知道怎么处理”,然后客户端,比如qq邮箱,收到这个声明后,会根据文件扩展名来猜测。

  1. email.mime.MIMEText()

    构造一个文本邮件对象,有三个参数

    _text:邮件正文内容,可以是纯文本或HTML格式。

    _subtype:邮件正文内容的类型,"plain"(纯文本)、“html”(HTML格式),默认为plain。

    _charset:邮件正文内容的编码方式,常用的有"utf-8"、"gbk"等。

  2. email.mime.MIMEImage()

    MIMEImage类用来创建图片作为附件的对象,它有两个参数:

    _imagedata:图片的二进制数据。

    _subtype:图片的类型,可以是"jpeg"、“gif”、"png"等。

  3. email.mime.Application()

    用于创建应用程序特定消息的类,构造函数参数说明: data: 要添加到消息部分的数据,可以是字节串或类文件对象。 _subtype: 指定消息部分的 MIME 子类型,默认为 'octet-stream',通常用于表示二进制数据。 policy: 控制邮件生成过程中的行为的策略对象,默认为 email.policy.compat32。 **params: 可选参数,用于指定消息的 Content-Type 的其他参数,例如 charset、name 等。 MIMEApplication 类通常用于创建包含二进制数据的 MIME 邮件附件。你可以通过创建一个 MIMEApplication 对象,并将要添加的二进制数据作为 _data 参数传递给构造函数来实现这一功能。在创建完对象后,你可以将其作为附件添加到邮件中的 MIMEMultipart 对象中。一般的附件都可以直接用application

  4. email.mime.MIMEAudio()

    MIMEAudio类用来创建邮件中的音频文件,它有两个参数:

    _audiodata:音频文件的二进制数据。

    _subtype:音频文件的类型,可以是"mp3"、"wav"等。

  5. email.mime.MIMEMultipart()

    初始化一个混合对象,既包含文本,又包含附件,它有一个参数:

    multipart类型,主要有三种子类型:mixed、alternative、related,默认为mixed

    ● MIMEMultipart(‘mixed’)类型

    如果一封邮件中含有附件,那邮件的中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。基本格式如下: msg=MIMEMultipart(‘mixed’)

    ● MIMEMultipart(‘alternative’)类型 MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。基本格式如下: msg=MIMEMultipart(‘alternative’)

    ● MIMEMultipart(‘related’)类型 MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为 html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。基本格式如下: msg=MIMEMultipart(‘related’)

  6. email.mime.MIMEBase()

    _maintype:MIME类型的大类,常见的有"text"、“image”、“audio”、“video”、"application"等。

    _subtype:MIME类型的子类,如"text/plain"、“image/jpeg”、"audio/mp3"等。

    _encoder:编码方式,可以是"base64"、"quoted-printable"等。

    _payload:MIME类型的内容,可以是文本、图片、音频、视频等。

(2)邮件对象方法

构造的对象一般会添加msg['From'] 、msg['To'] 、msg['Subject']属性,因为obj.sendmail的时候需要这些属性。另外可以能还存在一个其他方法:

  • msg['From'] = from_addr:设置邮件的发件人。

  • msg['To'] = to_addrs:设置邮件的收件人。

  • msg['Subject'] = subject:设置邮件的主题。

  • msg.set_content(text):设置邮件的纯文本内容。

  • msg.add_header(name, value):添加邮件的自定义报头。name为头部名称,value为头部的值。可用于MIMEMultipart的对象添加头部信息,否则可能会乱码,msg.add_header('content-disposition', 'attachment', filename='1.png'),前面参数都是固定的,filename自定义

  • msg.attach(part):将附件或嵌入内容或文本添加到邮件中。一般是MIMEMultipart的对象添加

  • email.message_from_string(string):将字符串解析为 EmailMessage 对象。

  • email.message_from_file(file):从文件中解析出 EmailMessage 对象。

在 Python 的 email 模块中,MIMEBase 类及其子类(如 MIMEText、MIMEImage 等)提供了一个 add_header() 方法,用于添加自定义的消息头部字段。 常见的一些消息头部字段包括但不限于: Content-Type:指定消息主体的媒体类型和子类型,如 text/plain、text/html、image/jpeg、audio/wav、video/mp4、 application/pdf等。 Content-Disposition:指定消息主体的处理方式,如 inline(内联显示)、attachment(作为附件下载)等。 Content-ID:指定消息主体的唯一标识符,在 multipart/related 消息中通常用于关联资源。 Content-Transfer-Encoding:指定消息主体的编码方式,如 base64、quoted-printable 等。 MIME-Version:指定 MIME 协议的版本号。 除了上述常见的消息头部字段外,您也可以根据需要添加其他自定义的消息头部字段,以满足特定的需求。 在使用 add_header() 方法时,需要指定头部字段的名称和值,例如: message.add_header('Content-Type', 'text/plain; charset=utf-8') message.add_header('Content-Disposition', 'attachment; filename="example.txt"') message.add_header('Content-ID', '<image001>') message.add_header('Content-Transfer-Encoding', 'base64') 通过适当设置这些消息头部字段,可以控制消息的内容类型、处理方式、编码方式等,在构建复杂的 MIME 消息时非常有用。

(1)发送纯文本邮件

import smtplib
from email.mime.text import MIMEText
​
# SMTP服务器信息
smtp_server = 'smtp.163.com'
smtp_port = 25
username = '13*******82@163.com'
password = 'MR********3F'
​
# 创建SMTP会话
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
​
# 创建MIMEText对象
body = "This is a test email sent using Python's smtplib."
msg = MIMEText(body,'plain','utf-8')
msg['From'] = username
msg['To'] = '****@163.com'
msg['Subject'] = 'Python SMTP Email Test'
​
# 发送邮件
server.sendmail(username,msg['To'],msg.as_string())
# 关闭SMTP会话
server.quit()

(2)发送超链接邮件

import smtplib
from email.mime.text import MIMEText
​
# SMTP服务器信息
smtp_server = 'smtp.163.com'
smtp_port = 25
username = '13*******82@163.com'
password = 'MR********3F'
​
# 创建SMTP会话
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
​
# 创建MIMEText对象
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.zhihu.com">这是一个链接</a></p>
"""
msg = MIMEText(mail_msg, 'html', 'utf-8')
msg['From'] = username
msg['To'] = '****@163.com'
msg['Subject'] = 'Python SMTP Email Test'
​
# 发送邮件
server.sendmail(username,msg['To'],msg.as_string())
# 关闭SMTP会话
server.quit()

(3)发送图片为附件邮件

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
​
# SMTP服务器信息
smtp_server = 'smtp.163.com'
smtp_port = 25
username = '13*******82@163.com'
password = 'MR********3F'
​
# 创建SMTP会话
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
​
# 创建MIMEImage对象
msg = MIMEMultipart("mixed")
msg['From'] = username
msg['To'] = '****@163.com'
msg['Subject'] = 'Python SMTP Email Test'
​
with open("foo.png", "rb") as f:
    mail_image = MIMEImage(f.read())
    #需要添加header信息,否则附件名称不对,并且附件可能存在乱码
    mail_image.add_header('content-Disposition', 'attachment', filename="foo.png")
    msg.attach(mail_image)
​
# 发送邮件
server.sendmail(username, msg['To'], msg.as_string())
# 关闭SMTP会话
server.quit()

(4)发送mixed邮件

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
​
# SMTP服务器信息
smtp_server = 'smtp.163.com'
smtp_port = 25
username = '13*******82@163.com'
password = 'MR********3F'
​
# 创建SMTP会话
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
​
# 创建MIMEMultipart对象
msg = MIMEMultipart()
msg['From'] = username
msg['To'] = '****@163.com'
msg['Subject'] = 'Python SMTP Email Test'
​
# # 添加邮件正文
body = "This is a test email sent using Python's smtplib."
msg.attach(MIMEText(body, 'plain'))
​
#添加文件附件
with open('20241105113241.json', 'rb') as file:
    attach = MIMEText(file.read(),"plain","utf-8")
    attach.add_header('Content-Disposition', 'attachment', filename='20241105113241.json')
    msg.attach(attach)
​
#添加图片附件
with open("foo.png", "rb") as f:
    attach = MIMEApplication(f.read())
    attach.add_header('content-Disposition', 'attachment', filename="foo.png")
    msg.attach(attach)
    
# 发送邮件
server.sendmail(username,msg['To'],msg.as_string())
​
# 关闭SMTP会话
server.quit()

(5)发送各种附件邮件

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
​
# SMTP服务器信息
smtp_server = 'smtp.163.com'
smtp_port = 25
username = '13*******82@163.com'
password = 'MR********3F'
​
# 创建SMTP会话
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
​
# 创建MIMEMultipart对象
msg = MIMEMultipart()
msg['From'] = username
msg['To'] = '****@163.com'
msg['Subject'] = 'Python SMTP Email Test'
​
# 添加邮件正文
body = "混合复杂邮件"
msg.attach(MIMEText(body, 'plain'))
​
# 添加超链接
body ="""
<p>CSDN链接如下:</p>
<p><a href="https://blog.csdn.net/liyue121100132">请点击</a></p>
"""
msg.attach(MIMEText(body, 'html'))
​
# 以下为附件,用MIMEApplication
​
# 添加文件附件
with open('20241105113241.json', 'rb') as f:
    attach = MIMEApplication(f.read())
    attach.add_header('Content-Disposition', 'attachment', filename='20241105113241.json')
    msg.attach(attach)
​
# 添加图片附件
with open("foo.png", "rb") as f:
    attach = MIMEApplication(f.read())
    msg.add_header('content-Disposition', 'attachment', filename="foo.png")
    msg.attach(attach)
​
# xlsx类型附件
with open("foo.xlsx", "rb") as f:
    attach = MIMEApplication(f.read())
    msg.add_header('Content-Disposition', 'attachment', filename="foo.xlsx")
    msg.attach(attach)
​
# pdf类型附件
with open("foo.pdf", "rb") as f:
    attach = MIMEApplication(f.read())
    msg.add_header('Content-Disposition', 'attachment', filename="foo.pdf")
    msg.attach(attach)
​
# mp3类型附件
with open("foo.mp3", "rb") as f:
    attach = MIMEApplication(f.read())
    msg.add_header('Content-Disposition', 'attachment', filename="foo.mp3")
    msg.attach(attach)
​
# 发送邮件
server.sendmail(username, msg['To'], msg.as_string())
​
# 关闭SMTP会话
server.quit()

(6)发送多个人

# msg['To']的值包含多个Email地址,用逗号隔开;
msg['To'] = 'aaa@qq.com,bbb@qq.com'
# sendmail函数的第2个参数,是一个list。这样就实现了将邮件发给多个人,这多个收件人,都在收件人列表中
server.sendmail(username,["aaa@qq.com","bbb@qq.com"],msg.as_string())

(7)抄送

msg['Cc']来装抄送列表。注意sendmail的第2个参数,这个参数是一个所有收件人的 list(列表),收件人和抄送人都在一个list里面。如果想添加多个Cc地址,在Msg['Cc']中用逗号将地址隔开,并且所有的地址都要在sendmail的第2个参数中

msg['To'] = 'aaa@qq.com'
msg['Cc'] = 'bbb@qq.com'
server.sendmail(username,["aaa@qq.com","bbb@qq.com"],msg.as_string())

(8)密送

密送,就是收件人在邮件的头部(To和Cc地址)看不到自己的地址,但是还是收到了邮件。所有To和Cc地址中的收件人,都看不到密送地址。要实现密送,只需要在sendmail函数中,将密送地址加入第2个参数的list即可。

msg['To'] = 'aaa@qq.com'
msg['Cc'] = 'bbb@qq.com'
## aaa和bbb的收件人,都不会知道ccc的存在
server.sendmail(username,["aaa@qq.com","bbb@qq.com","ccc@qq.com"],msg.as_string())

(9)发送正文带图片的邮件

  • 直接在HTML邮件中链接图片地址的方法是不可行的,因为大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站

  • 要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,就给它们依次编号,然后引用不同的cid:x

  • 把上面代码加入MIMEMultipartMIMETextplain改为html,然后在适当的位置引用图片

...
# 添加图片
img_body = '''
<html>
<head>Python 发送携带图片信息</head>
<body>
<p>
<p><img src="cid:image001"></p>
<p>
</body>
</html>
'''
# 正文内容
body = MIMEText(img_body, 'html', 'utf-8')
with open("foo.png",'rb') as f:
    mag = MIMEImage(f.read())
    # 定义图片ID在HTML中展示
    mag.add_header('Content-ID', 'image001')
    msg.attach(mag)
    msg.attach(body)
...

(10)将收件者和发件者带上名称

  • parseaddr:将带姓名的Email格式作为参数,给parseaddr函数,得到name姓名和addr纯email

  • formataddr:将name和addr转换成标准Email地址格式

    from email.utils import parseaddr, formataddr
    from email.header import Header
    s="mail_name_test<qq@163.com>"
    name, addr = parseaddr(s)
    print("name:"+name,"addr:"+addr)
    # name要经过Header函数的编码
    print(formataddr((Header(name,'utf-8').encode(), addr)))

# 补充一个函数小工具,它合并了 parseaddr和formataddr功能,输入以(发件人/收件人的昵称<xxxxx@163.com>)编写的Email地址,得到直接可以在MIMEText中使用字符串
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(), addr))
​
...
# 设置发送者,<>里面的邮箱为发件人的邮箱账号
mm["From"] = _format_addr("汤布力不<aaa@qq.com>")
# 设置接收者,<>里面的邮箱为收件人的邮箱账号
mm["To"] = _format_addr("玛卡巴卡<bbb@163.com>")
...

(11)从excel读取信息发送邮件

  • 读取表格数据,使用 pandas.read_excel() 来进行操作,该函数读取的数据返回为 DataFrame 的类型;;

  • 然后我们还需要以 DataFrame 数据中的每一行为单位,传入到发送邮件的函数中去作为接收方,来发送邮件,所以需要用到 DataFrame.apply(func) 去进行映射

import smtplib                        
from email.mime.text import MIMEText  
from email.header import Header       
import pandas as pd
​
​
# 设置服务器地址
mail_host = "smtp.qq.com"
# 设置服务器端口
mail_port = 465
​
# 初始化发送方账号
sender = "aaaa@qq.com"
​
# QQ邮箱第三方授权码
mail_pass = "h*******c"
​
​
def post_email(per_info):
    # 构造文本对象,三个参数:文本内容,设置文本格式,设置编码
    message = MIMEText(per_info["正文"],"plain","utf-8")
    # 文本对象 添加 发送者
    message["From"] = sender
    # 文本对象 添加 接收者
    message["To"] = per_info["收件人邮箱"]
    # 文本对象 添加 标题
    message["Subject"] = Header(per_info["邮件主题"])
​
    # 创建 SMTP 对象,连接目标服务器
    smtpObj = smtplib.SMTP_SSL(mail_host,mail_port)
    # 自己账号登录
    smtpObj.login(sender,mail_pass)
    # 发送邮件到目标地址  注意:信息由MTMEText对象 转为 字符串对象
    smtpObj.sendmail(sender,per_info["收件人邮箱"],message.as_string())
    # 结束 SMTP 对象
    smtpObj.quit()
​
​
if __name__ == '__main__':
    # 读取 邮件.xlsx
    email_info_df = pd.read_excel("邮件.xlsx")
​
    # 使用apply方法 将email_info_df中每一行 映射到post_email函数中

    email_info_df.apply(post_email,axis=1)
​​

5、yangmail

Yagmail是一个用于发送电子邮件的Python库,它旨在使发送邮件的过程尽可能简单。通过几行代码,你就能发送带有附件的邮件,而无需深入SMTP协议的复杂性。此外,Yagmail还提供了许多便捷的功能,如保存用户凭证,使得你不必每次发送邮件时都输入用户名和密码。

yagmail发送邮件只需要用到两个方法:

(1)yagmail.SMTP() #创建 yagmail SMTP 对象

​
def __init__(
    self,
    user=None,#用户名
    password=None,#密码
    host="smtp.gmail.com",#smtp服务器,默认为gmail,用其他邮箱需要修改host,否则会发送失败
    port=None,#smtp服务器端口,默认会根据smtp_ssl来判断使用465或者587。支持指定,需要结合smtp_ssl设置
    smtp_starttls=None,#应该是开启tls加密,不知道如何配置
    smtp_ssl=True,#是否用ssl加密传输
    smtp_set_debuglevel=0,#debug等级
    smtp_skip_login=False,#跳过登录
    encoding="utf-8",#编码格式
    oauth2_file=None,#身份鉴权
    soft_email_validation=True,#邮箱验证
    dkim=None,
    **kwargs
):
端口的源码如下:
self.port = str(port) if port is not None else "465" if smtp_ssl else "587"
所以当port为None时,如果smtp_ssl为ture,则port用465,;如果smtp_ssl为false,则port为587。当指定port时,就用指定port,但是指定port为25或者587是,smtp_ssl只能为False;指定port为465时,smtp只能为Ture否则会报错

(2)yag.send()#发送邮件

def send(
        self,
        to=None,#收件人邮箱,多个收件人用list
        subject=None,#邮件人主体
        contents=None,#邮件内容,可以是文本,超链接,附件
        attachments=None,#附件列表,多个附件就用list。与放到contents上效果一样
        cc=None,#抄送人,多个抄送人用list
        bcc=None,#密送(类似于抄送,但是收件人看不到其他人的邮箱地址)
        preview_only=False,#仅预览(可以发送,但是接收方收不到)
        headers=None,#头部信息(需要时字典格式)
        prettify_html=True,#修饰HTML
        message_id=None,#消息ID
        group_messages=True,#组消息
    )

(3)样例

一般发送邮件只需要几段代码就可以完成,比如发送一个带邮件、文本、超链接和图片嵌入的邮件。contents变量可以是一个列表,其中包含了邮件的文本内容和附件文件的路径。当调用send方法时,Yagmail会自动处理附件,将其与邮件一起发送。

import yagmail
​
yag = yagmail.SMTP('aaa@163.com',"M********3F","smtp.163.com",smtp_ssl=False,smtp_starttls="3")
yag.send(to=['aaa@qq.com','bbb.qq.com'], subject='Hello from Yagmail', contents=['This is the body of the email.','<a href="https://www.baidu.com">某度</a>','foo.pdf',yagmail.inline('foo.png')])
yag.close()
import yagmail
​
# 创建stmp链接
yag = yagmail.SMTP('aaa@qq.com', "hx******adc", "smtp.qq.com", smtp_ssl=False)
​
# 构建发送内容
recipient = 'bbb@163.com'
subject = 'Hello from Yagmail'
attachment_path = 'foo.pdf'
inline_image_path = yagmail.inline('foo.png')
content = ['This is the body of the email.', '<a href="https://www.baidu.com">某度</a>']
# 发送电子邮件
yag.send(to=recipient, subject=subject, contents=content, attachments=["attachment_path", "inline_image_path"])
# 关闭smtp链接
yag.close()

参考文档:

请解释什么是SMTP、POP3和IMAP协议,以及它们在邮件服务中的区别。使用场景是什么?底层原理是什么?_pop3和smtp和imap区别-CSDN博客

python发送邮件(二)——smtplib模块和email模块-腾讯云开发者社区-腾讯云

利用Python email的MIMEBase及MIMEApplication发送邮件附件-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值