使用Python发送自定义电子邮件
阅读原文时间:2021年04月20日阅读:1

电子邮件仍然是事实。 尽管存在各种弊端,但它仍然是向大多数人发送信息的最佳方法,特别是允许邮件排队等待收件人的自动方式。

Fedora社区行动与影响协调员正在为人们提供有关差旅资金的好消息。 我经常通过电子邮件发送此信息。 在这里,我将向您展示如何使用Mailmerge (一个可处理简单和复杂电子邮件的命令行Python程序)向一群人发送自定义消息。

安装Mailmerge

Mailmerge已打包并在Fedora中可用,您可以使用sudo dnf install python3-mailmerge从命令行安装它。 您也可以使用pip从PyPI安装它,如项目的自述文件所述

配置您的Mailmerge文件

三个文件控制Mailmerge的工作方式。 如果运行mailmerge --sample ,它将为您创建模板文件。 这些文件是:

  • mailmerge_server.conf:这包含您的SMTP主机发送电子邮件的配置详细信息。 您的密码存储在此文件中。
  • mailmerge_database.csv:此文件包含每封电子邮件的自定义数据,包括收件人的电子邮件地址。
  • mailmerge_template.txt:这是带有占位符字段的电子邮件文本,将使用mailmerge_database.csv中的数据替换

Server.conf

示例mailmerge_server.conf文件包含一些应熟悉的示例。 如果您曾经将电子邮件添加到手机中或设置了桌面电子邮件客户端,那么您之前已经看过这些数据。 要记住的最大事情是更新文件中的用户名,尤其是在使用示例配置之一时。

数据库.csv

mailmerge_database.csv文件要复杂一些。 它必须(至少)包含收件人的电子邮件地址以及替换电子邮件中的字段所必需的任何其他自定义详细信息。 在创建该文件的字段列表的同时,最好写出mailmerge_template.txt文件。 我发现使用电子表格捕获数据并在完成后将其导出为CSV文件很有帮助。 该样本文件:

     email,name,number

myself@mydomain.com,"Myself",17

bob@bobdomain.com,"Bob",42

允许您使用两个人的名字并告诉他们一个数字向两个人发送电子邮件。 该文件虽然不是很有趣,但却说明了一个重要的习惯:始终使自己成为文件中的第一个收件人。 这样,您就可以向自己发送测试电子邮件,以在向整个列表发送电子邮件之前验证一切正常。

如果任何值包含逗号,则必须将整个值括在双引号( )中。如果需要在双引号字段中包含双引号,请在一行中使用两个双引号。很有趣,因此请阅读Python 3中的CSV以获得更多细节。

Template.txt

作为我工作的一部分,我将分享有关Fedora贡献者会议Flock的旅行资助决定的新闻。 一封简单的电子邮件告诉人们他们已被选中用于旅行资金及其具体的资金详细信息。 一个针对用户的详细信息是我们可以为他们的机票分配多少钱。 这是我的模板文件的缩写版本(为简洁起见,我摘录了很多文本):

     $ cat mailmerge_template.txt

TO: {{Email}}

SUBJECT: Flock 2019 Funding Offer

FROM: Brian Exelbierd <bexelbie@redhat.com>





Hi {{Name}},





I am writing you on behalf of the Flock funding committee. &nbsp;You requested funding for your attendance at Flock. &nbsp;After careful consideration we are able to offer you the following funding:





Travel Budget: {{Travel_Budget}}





<<snip>>

模板的顶部指定了收件人,发件人和主题。 空行之后是电子邮件的正文。 该电子邮件需要database.csv文件中收件人的EmailNameTravel_Budget 。 请注意,这些字段用双花括号( {{}} )包围。 相应的mailmerge_database.csv如下所示:

     $ cat mailmerge_database.csv

Name,Email,Travel_Budget

Brian,bexelbie@redhat.com,1000

PersonA,persona@fedoraproject.org,1500

PèrsonB,personb@fedoraproject.org,500

请注意,我首先列出了自己(供测试),并且文件中还有两个人。 第二人称PèrsonB,其名字带有重音符号; Mailmerge将自动对其进行编码。

这就是整个模板的概念:编写电子邮件,然后将占位符放在双花括号中。 然后创建一个提供这些值的数据库。 现在让我们测试一下电子邮件。

测试并发送简单的电子邮件合并

试运行

首先进行试运行,将占位符字段完成的电子邮件打印到屏幕上。 默认情况下,如果您运行命令mailmerge ,它将对第一封电子邮件进行试运行:

     $ mailmerge

>>> encoding ascii

>>> message 0

TO: bexelbie@redhat.com

SUBJECT: Flock 2019 Funding Offer

FROM: Brian Exelbierd <bexelbie@redhat.com>

MIME-Version: 1.0

Content-Type: text/plain; charset="us-ascii"

Content-Transfer-Encoding: 7bit

Date: Sat, 20 Jul 2019 18:17:15 -0000





Hi Brian,





I am writing you on behalf of the Flock funding committee. &nbsp;You requested funding for your attendance at Flock. &nbsp;After careful consideration we are able to offer you the following funding:





Travel Budget: 1000





<<snip>>





>>> sent message 0 DRY RUN

>>> No attachments were sent with the emails.

>>> Limit was 1 messages. &nbsp;To remove the limit, use the --no-limit option.

>>> This was a dry run. &nbsp;To send messages, use the --no-dry-run option.

查看第一封电子邮件( 消息0 ,因为计数从零开始,就像计算机科学中的许多事情一样),您可以看到我的姓名和差旅预算正确。 如果要查看每封电子邮件,请输入mailmerge --no-limit告诉Mailmerge不要将自身限制为第一封电子邮件。 这是第三封电子邮件的试运行,其中显示了特殊字符编码:

     >>> message 2

TO: personb@fedoraproject.org

SUBJECT: Flock 2019 Funding Offer

FROM: Brian Exelbierd <bexelbie@redhat.com>

MIME-Version: 1.0

Content-Type: text/plain; charset="iso-8859-1"

Content-Transfer-Encoding: quoted-printable

Date: Sat, 20 Jul 2019 18:22:48 -0000





Hi P=E8rsonB,

那不是错误; P = E8rsonBPèrsonB的编码形式。

发送测试信息

现在,使用命令mailmerge --no-dry-run发送测试电子邮件,该命令告诉Mailmerge将消息发送到列表中的第一封电子邮件:

     $ mailmerge --no-dry-run

>>> encoding ascii

>>> message 0

TO: bexelbie@redhat.com

SUBJECT: Flock 2019 Funding Offer

FROM: Brian Exelbierd <bexelbie@redhat.com>

MIME-Version: 1.0

Content-Type: text/plain; charset="us-ascii"

Content-Transfer-Encoding: 7bit

Date: Sat, 20 Jul 2019 18:25:45 -0000





Hi Brian,





I am writing you on behalf of the Flock funding committee. &nbsp;You requested funding for your attendance at Flock. &nbsp;After careful consideration we are able to offer you the following funding:





Travel Budget: 1000





<<snip>>





>>> Read SMTP server configuration from mailmerge_server.conf

>>> &nbsp; host = smtp.gmail.com

>>> &nbsp; port = 587

>>> &nbsp; username = bexelbie@redhat.com

>>> &nbsp; security = STARTTLS

>>> password for bexelbie@redhat.com on smtp.gmail.com: 

>>> sent message 0

>>> No attachments were sent with the emails.

>>> Limit was 1 messages. &nbsp;To remove the limit, use the --no-limit option.

在倒数第四行,您会看到它提示您输入密码。 如果您使用的是双重身份验证或域管理的登录名,则需要创建一个绕过这些控件的应用程序密码。 如果您使用的是Gmail和类似系统,则可以直接在界面中进行操作; 否则,请联系您的电子邮件系统管理员。 这不会损害电子邮件系统的安全性,但是您仍然应该保持密码的复杂性和机密性。

当我检查电子邮件帐户时,我收到了格式精美的测试电子邮件。 如果您的测试电子邮件准备就绪,请通过输入mailmerge --no-dry-run --no-limit发送所有电子邮件。

发送复杂的电子邮件

当您利用Jinja2模板制作时,您真的可以看到Mailmerge的强大功能。 我发现它对于包含条件文本和发送附件很有用。 这是一个复杂的模板和相应的数据库:

     $ cat mailmerge_template.txt

TO: {{Email}}

SUBJECT: Flock 2019 Funding Offer

FROM: Brian Exelbierd <bexelbie@redhat.com>

ATTACHMENT: attachments/{{File}}





Hi {{Name}},





I am writing you on behalf of the Flock funding committee. &nbsp;You requested funding for your attendance at Flock. &nbsp;After careful consideration we are able to offer you the following funding:





Travel Budget: {{Travel_Budget}}

{% if Hotel == "Yes" -%}

Lodging: Lodging in the hotel Wednesday-Sunday (4 nights)

{%- endif %}





<<snip>>





$ cat mailmerge_database.csv

Name,Email,Travel_Budget,Hotel,File

Brian,bexelbie@redhat.com,1000,Yes,visa_bex.pdf

PersonA,persona@fedoraproject.org,1500,No,visa_person_a.pdf

PèrsonB,personb@fedoraproject.org,500,Yes,visa_person_b.pdf

这封电子邮件有两件事。 首先,有一个附件。 我必须向国际旅行者发送签证邀请函,以帮助他们来到弗洛克,标题的ATTACHMENT部分指定要附加的文件。 为了保持目录干净,我将所有目录都放在了Attachments子目录中。 其次,它包括有关酒店的条件信息,因为有些人会获得其酒店住宿的资金,我需要为那些住宿的人提供这些详细信息。 这是通过if构造完成的:

     {% if Hotel == "Yes" -%}

Lodging: Lodging in the hotel Wednesday-Sunday (4 nights)

{%- endif %}

在大多数编程语言中,这就像if一样。 Jinja2具有很高的表现力,可以执行多级条件。 通过包含控制电子邮件内容的数据库元素,尝试使生活更轻松。 使用空格对于电子邮件的可读性很重要。 ifendif中的减号( - )是Jinja2如何控制空白的一部分 。 有很多选择,因此请尝试看看最适合您的选择。

还要注意,我用两个字段( HotelFile)扩展了数据库。 这些值控制着酒店文本的包含并提供附件的名称。 在我的示例中,PèrsonB和我获得了酒店资金,而PersonA没有。

无论您使用的是简单模板还是复杂模板,试运行和发送电子邮件都是相同的。 试试看!

您还可以尝试在标头中使用条件条件( 如果endif )。 例如,只有在数据库中有一个附件时,您才可以具有附件,或者您可能需要更改某些电子邮件的发件人名称,而其他电子邮件则不需要。

Mailmerge的优势

Mailmerge程序提供了一种强大而简单的方法来发送大量自定义的电子邮件。 每个人都只获得他们需要的信息,并且省略了多余的步骤和细节。

即使对于简单的组电子邮件,我发现这种方法也比使用CC或BCC向一群人发送一封电子邮件有效得多。 许多人会过滤电子邮件,并延迟阅读未直接发送给他们的任何内容。 使用Mailmerge可确保每个人都收到自己的电子邮件。 邮件将为收件人正确过滤,并且没有人会意外地“全部答复”整个组。

翻译自: https://opensource.com/article/19/8/sending-custom-emails-python

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章