diff --git a/sources/tech/20190808 Sending custom emails with Python.md b/sources/tech/20190808 Sending custom emails with Python.md index 81331ea9df..5fc4b9dee1 100644 --- a/sources/tech/20190808 Sending custom emails with Python.md +++ b/sources/tech/20190808 Sending custom emails with Python.md @@ -14,7 +14,7 @@ Mailmerge 是一个可以处理简单邮件和复杂邮件的命令行程序, 电子邮件还是生活的一部分,尽管有种种不足,它仍然是大多数人发送信息的最佳方式,尤其是在以自动化群发方面。 -我作为 [Fedora 社区行动和影响协调员 ][2] 的工作之一就是给人们发送资助旅行相关的好消息,我经常通过电子邮件做这些事。这里,我将给你展示如何使用 [Mailmerge][3] ,一个可以处理简单邮件及复杂邮件的命令行程序,向一群人发送定制信息。 +我作为 [Fedora 社区行动和影响协调员][2] 的工作之一就是给人们发送资助旅行相关的好消息,我经常通过电子邮件做这些事。这里,我将给你展示如何使用 [Mailmerge][3],一个可以处理简单邮件及复杂邮件的命令行程序,向一群人发送定制信息。 ### 安装 Mailmerge @@ -22,7 +22,7 @@ Mailmerge 是一个可以处理简单邮件和复杂邮件的命令行程序, ### 配置 Mailmerge -三个配置文件控制着 Mailmerge 的工作模式。运行 **mailmerge --sample** ,将生成配置文件模板。这些文件包括: +三个配置文件控制着 Mailmerge 的工作模式。运行 **mailmerge --sample**,将生成配置文件模板。这些文件包括: * **mailmerge_server.conf:** 这里保存着SMTP服务端邮件发送相关详细配置,但你的密码 _不_ 在这里保存。 * **mailmerge_database.csv:** 这里保存每封邮件的个性数据,包括收件人电子邮件地址。 @@ -47,7 +47,7 @@ email,name,number 你可以使用他们的名字,给这两个人发送邮件,并各告诉他们一个数字。这个示例文件虽然不是特别有趣,但应用了一个重要的原则,那就是:始终让自己处于邮件接收列表的首位。这样你可以在向列表全员发送邮件之前,先给自己发送一个测试邮件,以验证邮件的效果是否如你预期。 -任何包含半角逗号的值,都 _**必须**_ 以半角双引号( **"** )封闭。如果恰好在半角双引号封闭的区域需要有一个半角双引号,那就在同一行中使用两个半角双引号。引用的定义规则比较有趣,去 [Python3中的CSV][7] 一探究竟吧。 +任何包含半角逗号的值,都 _**必须**_ 以半角双引号( **"** )封闭。如果恰好在半角双引号封闭的区域需要有一个半角双引号,那就在同一行中使用两个半角双引号。引用的定义规则比较有趣,去 [Python 3 中的 CSV][7] 一探究竟吧。 #### Template.txt @@ -80,7 +80,7 @@ PersonA,[persona@fedoraproject.org][10],1500 PèrsonB,[personb@fedoraproject.org][11],500 ``` -注意,我把自己放在了第一个,这是为了测试方便。除了我,还有另外两个人的信息在文档中。列表中的第二个人 PèrsonB ,他的名字中有一个包含变音符号的字母, Mailmerge 会对这类字母自动编码。 +注意,我把自己的信息放在了首条,这是为了测试方便。除了我,还有另外两个人的信息在文档中。列表中的第二个人 PèrsonB,他的名字中有一个包含变音符号的字母,Mailmerge 会对这类字母自动编码。 以上包含了模板的全部知识点:写上你自己的电子邮件信息,并编写好以双大括弧封闭的占位符。接下来创建用来提供前述占位符具体值的数据文件。现在测试一下电子邮件的效果。 @@ -88,7 +88,7 @@ PèrsonB,[personb@fedoraproject.org][11],500 #### 试运行 -测试从邮件的试运行开始,试运行就是讲邮件内容显示出来,所有的占位符都会被具体值取代。默认情况下,如果你运行不带参数的命令 **mailmerge** ,它将对收件列表中的第一个人进行试运行: +测试从邮件的试运行开始,试运行就是讲邮件内容显示出来,所有的占位符都会被具体值取代。默认情况下,如果你运行不带参数的命令 **mailmerge**,它将对收件列表中的第一个人进行试运行: ``` @@ -117,7 +117,7 @@ Travel Budget: 1000 >>> This was a dry run.  To send messages, use the --no-dry-run option. ``` -从试运行生成的邮件中(列表中的 **第 0 条信息** ,和计算机中很多计数场景一样,计数从 0 开始),可以看到我的名字及旅行预算是正确的。如果你想检视所有的邮件,运行 **mailmerge --no-limit** ,告诉 Mailmerge 不要仅仅处理第一个收件人的信息。下面是第三个收件人邮件的试运行结果,用来测试特殊字符的编码: +从试运行生成的邮件中(列表中的 **第 0 条信息** ,和计算机中很多计数场景一样,计数从 0 开始),可以看到我的名字及旅行预算是正确的。如果你想检视所有的邮件,运行 **mailmerge --no-limit**,告诉 Mailmerge 不要仅仅处理第一个收件人的信息。下面是第三个收件人邮件的试运行结果,用来测试特殊字符的编码: ``` @@ -133,11 +133,11 @@ Date: Sat, 20 Jul 2019 18:22:48 -0000 Hi P=E8rsonB, ``` -没有问题, **P=E8rsonB** 是 **PèrsonB** 的编码形式。 +没有问题,**P=E8rsonB** 是 **PèrsonB** 的编码形式。 #### 发送测试信息 -现在,运行 **mailmerge --no-dry-run** , Mailmerge 将向收件人列表中的第一个人发送电子邮件: +现在,运行 **mailmerge --no-dry-run**,Mailmerge 将向收件人列表中的第一个人发送电子邮件: ``` @@ -171,13 +171,13 @@ Travel Budget: 1000 >>> Limit was 1 messages.  To remove the limit, use the --no-limit option. ``` -在倒数第4行,它将要求你输入你的密码。如果你使用的是双因素认证或者域控制登录,那就需要创建应用密码来绕过这些控制。如果你使用的是 Gmail 或者类似的系统,可以直接在界面上完成密码验证。如果不行的话,联系你的邮件系统管理员。 上述这些操作不会影响邮件系统的安全性,但是仍然有必要采用复杂的安全性好的密码。 +在倒数第 4 行,它将要求你输入你的密码。如果你使用的是双因素认证或者域控制登录,那就需要创建应用密码来绕过这些控制。如果你使用的是 Gmail 或者类似的系统,可以直接在界面上完成密码验证。如果不行的话,联系你的邮件系统管理员。 上述这些操作不会影响邮件系统的安全性,但是仍然有必要采用复杂的安全性好的密码。 我在我的邮件收件箱中,看到了这封格式美观的测试邮件。如果测试邮件看起来没有问题,那就可以运行 **mailmerge --no-dry-run --no-limit** 发送所有的邮件了。 ### 发送复杂邮件 -只有充分了解了 [Jinja2 templating][12] ,你才可能充分领略 Mailmerge 真正的威力。在邮件模板中使用条件语句及附带附件,是很有用的。下面就是一个复杂邮件的模板及对应的数据文件: +只有充分了解了 [Jinja2 模板][12] ,你才可能充分领略 Mailmerge 真正的威力。在邮件模板中使用条件语句及附带附件,是很有用的。下面就是一个复杂邮件的模板及对应的数据文件: ``` @@ -214,7 +214,7 @@ Lodging: Lodging in the hotel Wednesday-Sunday (4 nights) {%- endif %} ``` -这和大多数编程语言中的 **if** 判断是一样的。Jinja2 实力非凡,可以实现多级判断。通过包含数据元素控制邮件内容,能大大简化相关的日常工作。空格的正确使用对邮件的易读性很重要。**if** 和 **endif** 语句中的短线( **-** )是 Jinja2 控制 [空歌字符][13] 的一部分。这里面选项很多,所以还是要通过试验找到最适合自己的方式。 +这和大多数编程语言中的 **if** 判断是一样的。Jinja2 实力非凡,可以实现多级判断。通过包含数据元素控制邮件内容,能大大简化相关的日常工作。空格的正确使用对邮件的易读性很重要。**if** 和 **endif** 语句中的短线( **-** )是 Jinja2 控制 [空白字符][13] 的一部分。这里面选项很多,所以还是要通过试验找到最适合自己的方式。 在上面的例子中,我在数据文件扩充了 **Hotel** 和 **File** 两个字段,这些字段的值控制着宾馆信息和附件文件名。另外,在上例中,我和 PèrsonB 有住宿资助,但 PersonA 没有。