Mailmerge是一个可以自定义群发电子邮件的命令行程序,它可以处理简单和复杂的电子邮件。电子邮件仍然是生活的一部分,尽管存在种种缺点,但它仍然是大多数人发送信息的最佳方式,尤其是在自动向队列中的收件人发送消息的方式中。作为Fedora社区行动和影响协调员,我的工作之一是向人们发送有关赞助旅行的好消息,我经常通过电子邮件这样做。在这里,我将向您展示如何使用Mailmerge向一组人发送自定义电子邮件,Mailmerge是一个可以处理简单和复杂电子邮件的命令行程序。安装Mailmerge在Fedora中,Mailmerge已经打包并可用,您可以通过在命令行运行sudodnfinstallpython3-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包含几个您应该熟悉的示例。如果您曾在手机上添加过电子邮件或设置过桌面电子邮件客户端,那么您就会看到这些数据。提醒是要记住将您的用户名更新到此文件,尤其是如果您使用模板提供的配置。配置文件Database.csvmailmerge_database.csv有点复杂。至少,在此处存储收件人的电子邮件地址,以及需要在电子邮件中替换的任何自定义信息。建议在为此文件创建占位符列表时同时编辑mailmerge_template.txt文件。我发现效果很好的方法是使用电子表格软件输入这些数据,并在完成后将其导出为CSV文件。使用以下示例文件:email,name,numbermyself@mydomain.com,"Myself",17bob@bobdomain.com,"Bob",42您可以向这两个人发送电子邮件,使用他们的名字并告诉他们一个号码。这个示例文件不是特别有趣,但它应用了一个重要原则:始终将自己放在邮件列表的顶部。通过这种方式,您可以向自己发送一封测试电子邮件,以在将其发送到整个列表之前验证该电子邮件是否按预期工作。任何包含逗号的值都必须用双引号(")括起来。如果用双引号括起来的区域需要用双引号,则在同一行连续使用两个双引号。引号规则很有趣,查看Python3部分中的CSV。Template.txt我的工作之一是为我们的Fedora贡献者会议Flock发送与旅行补助金相关的信息。简单地发邮件给那个人,他被选为旅行基金支持的幸运接收者,以及相应资金支持的详细信息。与收件人相关的具体信息之一是我们可以为他的旅行提供多少。下面是我的删节模板文件的副本(为简洁起见删除了很多文本):$catmailmerge_template。txtTO:{{Email}}SUBJECT:Flock2019FundingOfferFROM:BrianExelbierd嗨,{{Name}},我代表Flock资助委员会给你写信。你申请了资助参加蜂拥而至之后经过仔细考虑,我们可以为您提供以下资助:旅行预算:{{Travel_Budget}}<>模板的开头定义了邮件的收件人、发件人和主题。空行之后是邮件的内容。电子邮件需要从database.csv文件中获取收件人的电子邮件、姓名和Travel_Budget。请注意,上面的占位符是用双大括号({{,}})括起来的。对应的mailmerge_database.csv如下:$catmailmerge_database.csvName,Email,Travel_BudgetBrian,bexelbie@redhat.com,1000PersonA,persona@fedoraproject.org,1500PèrsonB,personb@fedoraproject.org,500注意,我把我的信息放在First,这是为了方便测试。除了我之外,还有另外两个人的信息在文档中。名单上的第二个人PèrsonB在他的名字中有一个包含变音符号的字母,Mailmerge会自动对其进行编码。这就是关于模板的全部知识:编写您自己的电子邮件消息,并用双花括号括起您的占位符。接下来创建将为上述占位符提供准确值的数据文件。现在测试邮件的效果。测试并发送一封简单的电子邮件。试运行测试从邮件的试运行开始。试运行意味着显示邮件内容,所有占位符将被替换为特定值。默认情况下,如果您不带任何参数运行命令mailmerge,它将对收件箱中的第一个人进行试运行:$mailmerge>>>encodingascii>>>message0TO:bexelbie@redhat.comSUBJECT:Flock2019FundingOfferFROM:BrianExelbierdMIME版本:1.0Content-Type:text/plain;charset="us-ascii"Content-Transfer-Encoding:7bitDate:Sat,20Jul201918:17:15-0000你好Brian,我代表Flock资助委员会给你写信。您申请了参加Flock的资金。经过仔细考虑,我们可以为您提供以下资助:旅行预算:1000<>>>>已发送消息0DRYRUN>>>电子邮件中未发送任何附件。>>>限制为1条消息。要删除限制,请使用--no-limit选项。>>>这是试运行。要发送消息,请使用--no-dry-run选项。从试运行生成的邮件中(列表中0号邮件,和电脑中很多计数场景一样,从0开始计数),可以看到我的名字和差旅预算是正确的。如果您想查看所有邮件,请运行mailmerge--no-limit以告诉Mailmerge不要只处理第一个收件人的邮件。以下是第三封收件人电子邮件的试运行结果,以测试特殊字符的编码:>>>message2TO:personb@fedoraproject.orgSUBJECT:Flock2019FundingOfferFROM:BrianExelbierdMIME-Version:1.0内容类型:文本/纯文本;charset="iso-8859-1"Content-Transfer-Encoding:quoted-printableDate:Sat,20Jul201918:22:48-0000HiP=E8rsonB,没问题,P=E8rsonB是PèrsonB的编码形式。发送测试消息现在,运行mailmerge--no-dry-run,Mailmerge将向收件人列表中的第一个人发送一封电子邮件:$mailmerge--no-dry-run>>>encodingascii>>>message0TO:bexelbie@redhat.comSUBJECT:Flock2019FundingOfferFROM:BrianExelbierdMIME-Version:1.0Content-Type:text/plain;charset="us-ascii"Content-Transfer-Encoding:7bitDate:Sat,20Jul201918:25:45-0000嗨,Brian,我代表Flock资助委员会给你写信。您申请了参加Flock的资金。经过仔细考虑,我们可以为您提供以下资助:旅行预算:1000<>>>>从mailmerge_server.conf读取SMTP服务器配置>>>host=smtp.gmail.com>>>port=587>>>username=bexelbie@redhat.com>>>security=STARTTLS>>>smtp.gmail.com上bexelbie@redhat.com的密码:>>>已发送消息0>>>没有发送附件电子邮件。>>>限制为1条消息。要删除限制,请使用--no-limit选项。在最后一行的第四行,如果您使用双因素身份验证或域控制,它将要求您输入密码要登录,您需要创建一个应用程序密码以绕过这些控制。如果您使用的是Gmail或类似系统,则可以直接在界面上进行密码验证。如果这不起作用,请联系您的邮件系统管理员。以上操作不会影响邮件系统的安全,但仍然需要使用复杂安全的密码。我在我的电子邮件收件箱中发现了这封格式精美的测试电子邮件。如果测试邮件看起来没问题,运行mailmerge--no-dry-run--no-limit发送所有邮件。发送复杂的邮件只有充分理解Jinja2模板,您才能充分领略Mailmerge的真正威力。在带附件的电子邮件模板中使用条件语句很有用。以下是一个复杂的电子邮件模板和相应的数据文件:$catmailmerge_template.txtTO:{{Email}}SUBJECT:Flock2019FundingOfferFROM:BrianExelbierdATTACHMENT:attachments/{{File}}Hi{{Name}},我代表Flock资助委员会给你写信。您申请了参加Flock的资金。经过慎重考虑,我们可以为您提供以下资金:旅行预算:{{Travel_Budget}}{%ifHotel=="Yes"-%}住宿:周三至周日入住酒店(4晚){%-endif%<>$catmailmerge_database.csvName,Email,Travel_Budget,Hotel,FileBrian,bexelbie@redhat.com,1000,Yes,visa_bex.pdfPersonA,persona@fedoraproject.org,1500,No,visa_person_a.pdfPèrsonB,personb@fedoraproject.org,500,Yes,visa_person_b.pdf这封邮件中有两个新项目。首先是附件,我需要给参加国际旅行的人发签证邀请函,帮助他们来Flock,文件头的ATTACHMENT部分解释了要包含哪些文件;为了保持我的文档目录清晰,我把所有需要附加的文档都存放在attachment子目录中。二是包括酒店的条件信息,因为有些人的旅游资金包括住宿费用,我需要呼吁涉及住宿和相关信息的人,这是通过if判断来实现的:{%ifHotel=="Yes"-%}住宿:周三-周日在酒店住宿(4晚){%-endif%}这个和大多数编程语言中的if判断是一样的。Jinja2实力不凡,可以实现多级判断。通过包含数据元素来控制电子邮件的内容,可以大大简化相关的日常工作。正确使用空格对于电子邮件的易读性很重要。if和endif语句中的破折号(-)是Jinja2控制空白字符的一部分。这里有很多选项,因此仍然需要通过试验来找到最适合您的选项。在上面的例子中,我在数据文件中扩展了Hotel和File这两个字段,这些字段的值控制了酒店信息和附件文件名。另外,在上面的例子中,PèrsonB和我有住宿资金,但PersonA没有。对于简单邮件和复杂邮件,试运行和正式邮件发送的操作是一样的。去试试吧!你也可以尝试在邮件头中使用条件判断(if...endif),比如你可以让发送给数据库中某人的邮件包含附件,或者为某些人更改发件人信息。Mailmerge的优点Mailmerge是一个简单高效的批量发送自定义电子邮件的工具。每个人只收到他需要的信息,其他额外的操作和细节都是透明的。我还发现,即使在发送简单的群组邮件时,与使用CC或BCC向一组受众发送一封电子邮件相比,使用Mailmerge也非常有效。很多人使用邮件过滤,那些不是直接发给他们的邮件不会立即处理。使用Mailmerge可确保每个收件人收到他们自己的邮件。所有邮件都将针对收件人进行适当过滤,没有人会无意中回复整个邮件列表。