如何在Python中发送电子邮件?详细实现教程

2021年11月16日20:38:21 发表评论 1,006 次浏览

了解如何使用 Python 的标准库 smtplib 和电子邮件模块连接到任何 SMTP 服务器并自动在 Python 中发送电子邮件,包括一些详细的Python发送电子邮件示例。

手动发送电子邮件无疑是一项耗时且艰巨的任务,程序员可以使用他最喜欢的编程语言轻松地将其自动化,在本教程中,你将学习如何使用Python 中的smtplib模块发送电子邮件,我们还将使用电子邮件模块发送不同的附件类型,例如 HTML 内容和二进制文件。

SMTPSimple Mail Transfer Protocol)是处理发送和跨邮件服务器路由电子邮件的协议,它是一个 用于电子邮件发送的通信协议,它是在第一引入1982和在更新2008由RFC 5321到扩展SMTP添加(这是今天使用的)。所以简而言之,邮件服务器使用这个网络协议来发送邮件消息。

如何在Python中发送电子邮件?所述 的smtplib 模块使用SMTP协议和限定了 SMTP 可用于将邮件发送到任何因特网的机器中将用客户端会话对象 SMTP  (或 扩展的SMTP)监听器。它预装了 Python,所以我们不必安装它。

如果你想使用某种 API 使用 Python 发送电子邮件,你可以查看有关如何使用 Gmail API的教程,我们将对此进行介绍。

Python如何发送电子邮件?在开始之前,让我们安装BeautifulSoup,它将帮助我们自动从 HTML 中提取纯文本而无需担心正则表达式:

$ pip3 install bs4

相关: 如何在 Python 中阅读电子邮件。

建立我们的信息

好的,让我们开始吧,让我们首先导入我们要使用的库:

import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from bs4 import BeautifulSoup as bs

如何在Python中发送电子邮件?我们需要email模块,因为它为我们提供了MIME 标准,它不仅可以帮助我们发送ASCII字符集电子邮件,还可以帮助我们发送更大的字符集、HTML 甚至二进制文件。

具有MIME格式的邮件正文由多个部分组成,每个部分可能包含你实际想要发送的任何类型的数据(例如纯文本、HTML 或二进制文件)。

让我们定义我们的参数:

# your credentials
email = "email@example.com"
password = "password"
# the sender's email
FROM = "from@example.com"
# the receiver's email
TO   = "to@example.com"
# the subject of the email (subject)
subject = "Just a subject"

Python发送电子邮件示例介绍 - 很简单,emailpassword变量是你想和发送的电子邮件地址的凭据,FROM并且TO是发送者的电子邮件和接收的电子邮件分别为(emailFROM通常是相同的),并且subject是我们会发送邮件的标题(或主题)。

确保你根据自己的需要编辑这些变量,你可以通过使用TO变量中的电子邮件地址列表而不是字符串来发送到多个电子邮件地址。

让我们构建我们的邮件,现在我们将使用两个版本的邮件,一个是 HTML 版本,另一个是纯文本版本。大多数电子邮件提供商通常都是这种情况,因为出于安全原因,某些电子邮件客户端不会尝试呈现 HTML 内容。

因此,我们将使用MIMEMultipartobject 并"alternative"作为 the传递subtype,因此它可以将两个邮件版本合并为具有两个呈现选项的单个消息:

# initialize the message we wanna send
msg = MIMEMultipart("alternative")
# set the sender's email
msg["From"] = FROM
# set the receiver's email
msg["To"] = TO
# set the subject
msg["Subject"] = subject

我们还设置了FromTo电子邮件地址和subject. 让我们构建消息正文:

# set the body of the email as HTML
html = """
This email is sent using <b>Python </b>!
"""
# make the text version of the HTML
text = bs(html, "html.parser").text

在此示例中,我们将 设置html为简单的 HTML 消息,但你可以从 HTML 邮件模板中读取,如下所示:

# set the body of the email as HTML
html = open("mail.html").read()
# make the text version of the HTML
text = bs(html, "html.parser").text

如果你想使用邮件模板版本,请mail.html这里获取。让我们完成消息的构建: 

text_part = MIMEText(text, "plain")
html_part = MIMEText(html, "html")
# attach the email body to the mail message
# attach the plain text version first
msg.attach(text_part)
msg.attach(html_part)

在构建消息体之后,我们将其附加到我们刚刚创建的MIMEMultipart对象中。让我们看看这封电子邮件的样子:

print(msg.as_string())

输出:

Content-Type: multipart/alternative; boundary="===============2952145411990110564=="
MIME-Version: 1.0
From: from@example.com
To: to@example.com
Subject: Just a subject

--===============2952145411990110564==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit


This email is sent using Python !

--===============2952145411990110564==
Content-Type: text/html; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit


This email is sent using <b>Python </b>!

--===============2952145411990110564==--

Python如何发送电子邮件?你可能会注意到,每个部分都用一组固定的字符分隔,第一部分包含邮件标题,第二部分包含我们刚刚附加的实际邮件正文,请注意,如果有任何非ASCII 字符,它会自动更改我们的编码,因此你通常不必担心。有关MIME标准的更多信息,请查看此Wikipedia 页面

在接下来的几节中,我们将看到如何将文件添加为电子邮件附件,敬请期待!

相关: 如何在 Python 中删除电子邮件。

Python发送电子邮件示例:发送消息

现在,我们有邮件准备发送,让我们创建一个函数,它FROMTO电子邮件地址,以及实际msg发送,它会发送电子邮件给我们:

def send_mail(email, password, FROM, TO, msg):
    # initialize the SMTP server
    server = smtplib.SMTP("smtp.gmail.com", 587)
    # connect to the SMTP server as TLS mode (secure) and send EHLO
    server.starttls()
    # login to the account using the credentials
    server.login(email, password)
    # send the email
    server.sendmail(FROM, TO, msg.as_string())
    # terminate the SMTP session
    server.quit()

注意: 如果你使用 Gmail 帐户发送邮件,请确保打开“允许安全性较低的应用程序”,尽管这将使每个人都可以仅使用你的电子邮件地址和密码访问你的 Gmail 帐户。

如何在Python中发送电子邮件?所以我们首先使用smtplib连接到SMTP服务器,我们在这个例子中使用了 Gmail SMTP 服务器,端口为587。如果你想使用其他 SMTP 服务器(例如 Outlook 或 Yahoo), 请检查 SMTP 服务器列表及其端口号。

然后我们将到SMTP服务器的连接置于TLS模式以确保安全(使用StartTLS),最后,我们使用帐户凭据登录并在发送电子邮件后终止会话。

server.sendmail()方法执行整个邮件事务,它需要几个参数:发送此邮件的地址 ( FROM)、发送此邮件的地址列表(如果它是一个字符串,那么它将被视为具有 1 个地址的列表),以及message发送。

让我们调用刚刚创建的函数:

# send the mail
send_mail(email, password, FROM, TO, msg)

执行完上面的代码后(当然我用的是真实的gmail凭证),下面是收到的邮件截图:

如何在Python中发送电子邮件?详细实现教程
如何在Python中发送电子邮件?详细实现教程

添加附件

为了在我们的电子邮件中以附件形式发送二进制文件(如文档、图像、视频、音频文件等),我们需要为每个要发送的文件添加一个附件:

# list of files to send as an attachment to the email
# feel free to add your attachments here
files_to_send = [
    "test.txt",
    "1810.04805.pdf",
]
# initialize the message we wanna send
msg = MIMEMultipart("alternative")
# set the sender's email
msg["From"] = FROM
# set the receiver's email
msg["To"] = TO
# set the subject
msg["Subject"] = subject
# set the body of the email as HTML
html = open("mail.html").read()
# make the text version of the HTML
text = bs(html, "html.parser").text

text_part = MIMEText(text, "plain")
html_part = MIMEText(html, "html")
# attach the email body to the mail message
# attach the plain text version first
msg.attach(text_part)
msg.attach(html_part)
for file in files_to_send:
    # open the file as read in bytes
    with open(file, "rb") as f:
        # read the file content
        data = f.read()
        # create the attachment
        attach_part = MIMEBase("application", "octet-stream")
        attach_part.set_payload(data)
    # encode the data to base 64
    encoders.encode_base64(attach_part)
    # add the header
    attach_part.add_header("Content-Disposition", f"attachment; filename= {file}")
    msg.attach(attach_part)
# send the mail
send_mail(email, password, FROM, TO, msg)

注意:以上代码不能作为独立的 Python 脚本运行,请参阅此页面以获取完整代码版本。

以上Python发送电子邮件示例中,我们像以前一样添加纯文本和 HTML 附件,然后遍历files_to_send列表(其中包含我们要发送的文件列表,在本例中为文本文件和 PDF 文件)并将每个文件附加到我们的邮件中。你可以得到我在这个目录中使用的文件。

当然,你可以发送任何你想要的文件,确保你编辑了files_to_send列表,你就可以开始了。

如何在Python中发送电子邮件?我们使用application/octet-stream子类型来表示它是一个任意的二进制数据,我们使用set_payload()方法设置数据。之后,我们对文件附件进行Base 64编码,并在添加Content-Disposition标头以表明它是附件后将其附加到邮件中。

这是我发送邮件时的样子:

如何在Python中发送电子邮件?详细实现教程

我强烈建议你检查完整代码,因为你可以方便地将其复制出来。

结论

Python如何发送电子邮件?太棒了,这有很多用例!例如,你可以创建自己的自定义警报以在发生某些事情时通知你,或者你希望在用户在你的网站上创建帐户时向他们发送电子邮件确认,或向你的组织成员发送电子邮件,或发送键盘记录结果、可能性是无止境的!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: