Update 20190808 Sending custom emails with Python.md

This commit is contained in:
silentdawn-zz 2020-07-24 12:00:49 +08:00 committed by GitHub
parent 0feac10cb5
commit f37a9be0b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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 没有。