标签 邮件 下的文章

最好的聊天应用是一个不属于聊天应用的应用。

 title=

请考虑一下,当用户的数据被发布到互联网上,或通过互联网发布时,他们的数据究竟去了哪里。古老的聊天应用是互联网通信领域的一个手工行业,似乎在潮流中起起落落。人们使用聊天应用进行各种形式的对话,大多数人不会想到机器人正在记录和监控他们所说的话,无论是为了有效地定位广告还是只是为了建立一个档案供将来使用。这使得聊天应用特别容易受到不良的隐私做法的影响,但幸运的是,现在有几个开源的、注重隐私的应用,如 SignalRocket.ChatMattermost。我运行过 Mattermost 和 Rocket.Chat,我也在使用 Signal,但我最兴奋的应用是 Delta Chat,这个聊天服务非常方便,甚至不使用聊天服务器。相反,Delta Chat 使用的是你已经使用的最大规模和最多样化的开放信息系统:它使用电子邮件,通过聊天应用发送和接收信息,并以 Autocrypt 的端到端加密为特色。

安装 Delta Chat

Delta Chat 使用标准的电子邮件协议作为它的后端,但对于作为普通用户的你和我来说,它的外观和行为完全像一个聊天应用。也就是说你需要安装一个开源的 Delta Chat 应用。

在 Linux 上,你可以从 Flatpak 包或你的软件库中安装 Delta Chat。

在 macOS 和 Windows 上,从 delta.chat/downloads 下载一个安装程序。

在安卓系统上,你可以从 Play Store 或开源的 F-droid 仓库 安装 Delta Chat。

在 iOS 系统中,从 App Store 安装 Delta Chat。

因为 Delta Chat 使用电子邮件来传递信息,所以如果你不在你的聊天应用中,你也可以在收件箱中收到信息。是的,即使没有安装 Delta Chat,你也可以使用 Delta Chat!

配置 Delta Chat

当你第一次启动 Delta Chat 时,你必须登录到你的电子邮件账户。这往往是 Delta Chat 最难的部分,因为它要求你了解你的电子邮件服务器的详细信息,或者在你的电子邮件提供商的安全设置中创建一个“应用密码”。

如果你使用的是自己的服务器,并且所有配置都是默认的(993 端口用于 IMAP 接收,465 端口用于 SMTP 发出,启用了 SSL/TLS),那么你可以直接输入你的电子邮件地址和密码,然后继续。

 title=

如果你运行自己的服务器,但你有自定义设置,那么点击“ 高级 Advanced ”按钮,输入你的设置。如果你使用一个不寻常的子域来用作你的邮件服务器,或一个自定义端口,或一个复杂的登录和密码配置,你可能需要这样做。

如果你使用的是 Gmail、Fastmail、Yahoo 或类似的电子邮件供应商,那么你必须创建一个应用密码,这样你就可以通过 Delta Chat 而不是网络浏览器登录到你的账户。许多电子邮件供应商限制登录,以避免无休止的机器人和脚本试图用暴力手段进入人们的账户,所以对你的供应商来说,Delta Chat 看起来很像机器人。当你授予 Delta Chat 特殊权限时,你就是在提醒你的电子邮件提供商,从一个远程应用发出大量的短信息是预期的行为。

每个电子邮件提供商都有不同的提供应用密码的方式,但 Fastmail(在我看来)是最简单的:

  1. 进入“ 设置 Settings
  2. 点击“ 密码和安全 Passwords & Security
  3. 在“ 第三方应用 Third-party apps ”的旁边,点击“ 添加 Add ”按钮

验证你的密码,并创建一个新的应用密码。使用你创建的应用密码登录 Delta Chat。

 title=

使用 Delta Chat 聊天

当你克服了登录的障碍,剩下的就很容易了。因为 Delta Chat 只使用电子邮件,你可以通过电子邮件地址而不是通过聊天程序的用户名或电话号码来添加朋友。从技术上讲,你可以在 Delta Chat 上添加任何电子邮件地址。毕竟,它只是一个有特定使用场景的电子邮件应用。不过,告诉你的朋友 Delta Chat 是很有礼貌的,而不是期望他们通过他们的电子邮件客户端与你进行随意的聊天。

无论你是在手机还是在电脑上运行这个应用,其外观都与你所期望的聊天应用完全一样。你可以发起聊天,发送消息,并通过加密文本与朋友闲聊。

 title=

开始聊天

Delta Chat 是去中心化的、完全加密的,并依赖于一个成熟的基础设施。多亏 Delta Chat,你可以选择你和你的联系人之间的服务器,你可以在私下里交流。没有需要安装的复杂的服务器,没有需要维护的硬件。这是一个看似复杂问题的简单解决方案,而且是开源的。我们有充分的理由去尝试它。


via: https://opensource.com/article/22/1/delta-chat-software-privacy-day

作者:Alan Smithee 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

OpenPGP.js 是一个实现了 OpenPGP 标准的密码学库,最常用于电子邮件加密。

 title=

OpenPGP.js 是一个实现了 OpenPGP 标准 的密码学库,最常用于电子邮件加密。ProtonMail、Mailvelope 和 FlowCrypt 都使用 OpenPGP.js,这还仅仅是其中一些。也就是说 OpenPGP.js 库对数百万用户的信息进行了加密。

OpenPGP 标准首次发布于 20 世纪 90 年代,像几乎任何东西一样,需要维护和更新,以保证安全和可用性。该标准的“加密刷新” 正在进行中,它增加了现代的加密算法并废除了过时的算法。为了提高可用性,各种电子邮件应用程序现在允许用户无缝加密他们的通信,用户无需管理他们的密钥或他们的联系人的密钥。

OpenPGP.js 于 2014 年首次发布,开始基于一个名为 GPG4Browsers 的早期原型,该原型基于 Herbert Hanewinkel(以及其他贡献者)的几个脚本。OpenPGP.js 的第二个版本于 2016 年发布,完全重新设计,使用 Uint8Arrays 而不是字符串(这大大增加了其性能),并在内部使用现代 ES6 模块而不是 CommonJS 模块。第 3 和第 4 版都是在 2018 年发布的,分别增加了对椭圆曲线加密法(ECC)和流的支持。

我和我的团队继续在 OpenPGP.js 上工作,以确保其发展为一个易于使用的强加密库。

1、默认的椭圆曲线加密

在 OpenPGP.js 第 4 版中,生成新密钥时默认使用 RSA。虽然 ECC 更快、更安全,但 Curve25519 还没有在 OpenPGP 规范中得到标准化。加密刷新草案包括了 Curve25519,并且预计它将“按原样”包含在下一版本的 OpenPGP 规范中,因此 OpenPGP.js 第 5 版现在默认使用 ECC 生成密钥。

2、只导入你需要的模块

同样,虽然 OpenPGP.js 内部使用 ES6 模块多年,但第 4 版仍然没有发布一个合适的 ES6 模块。相反,它只发布了一个 通用模块定义 Univeral Module Definition (UMD)模块,可以在浏览器和 Node.js 上运行。在第 5 版中,这种情况有所改变,为浏览器和 Node.js 发布了单独的模块(包括 ES6 和非 ES6),使库用户更容易在所有平台上导入 OpenPGP.js ,且(当使用 ES6 模块时)只导入他们需要的部分。这在很大程度上是通过将构建系统切换到 rollup 来实现的。

3、拒绝弱加密技术

还有许多其他的安全改进。例如,1024 位 RSA 密钥、ElGamal 和 DSA 密钥被认为是不安全的,并被默认拒绝。此外,第 4 版已经默认使用 AES 加密,第 5 版现在完全默认拒绝使用较弱的算法进行加密,即使公钥声称只支持较弱的算法。相反,它假定所有的 OpenPGP 实现都支持 AES(这种情况已经存在很长时间了)。

OpenPGP.js 的下一步是什么?

展望未来,有一些安全方面的改进要做。用于识别公钥的密钥指纹仍然使用 SHA-1,尽管在加密技术更新中计划对此进行修复。同时,建议使用不同的方法来确定用于加密的任何公钥的真实性,例如使用提议的 网络密钥目录 Web Key Directory (WKD)标准直接从收件人的域中获取整个密钥,这已经由各种 电子邮件提供商 实现。WKD 支持内置于 OpenPGP.js 第 4 版,但在第 5 版中是一个单独的模块,以保持主库的精简。

同样,当用密码而不是公钥加密信息或文件时(例如:在使用 OpenPGP 进行电子邮件加密时不常见,但在用于加密备份时更常见),密码会使用相对较弱的 密钥衍生函数 Key Derivation Function (KDF)转换为对称密钥。因此,建议应用在将用户的密码传递给 OpenPGP.js 之前,先通过一个强大的 KDF,如 Argon2scrypt。希望加密刷新草案会包括这些算法中的一种,以便在未来的 OpenPGP.js 版本中实现。

如何使用 OpenPGP.js 第 5 版

不过现在,OpenPGP.js 第 5 版已经 发布 到 npm 仓库。如果你喜欢,可以随时试用!欢迎在 GitHub 的 讨论版 中进行反馈。然而,请注意,虽然 OpenPGP.js 是一个通用的加密库,但它的主要使用情况是在需要与 OpenPGP 规范兼容的情况下(例如,在发送或接收 PGP 加密的电子邮件时)。对于其他的使用情况,不同的库可能是一个更合适或性能更好的选择。当然,总的来说,在尝试使用任何加密技术时都要小心。

感谢阅读,这里是保护电子邮件的未来!


via: https://opensource.com/article/21/10/openpgpjs

作者:Daniel Huigens 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

特斯拉投资比特币的 15 亿美元账面收益再次化为乌有

根据 CoinDesk 的数据,7 月 20 日,比特币的价格再度跌至 29600 美元,在 24 小时内下跌超过 5%。自 4 月中旬创下近 65000 美元的历史新高以来,其价格已暴跌了 50% 以上。比特币今年以来上涨了 1.87%。

今年 2 月,特斯拉宣布投资 15 亿美元购买比特币,平均价格为 32600 美元。截至一季度末,特斯拉在比特币上账面收益总计为 14.51 亿美元。6 月 22 日,比特币一度跌至 28900 美元,使特斯拉的比特币投资的账面亏损达 1.33 亿美元。7 月 20 日,比特币的价格再度跌至 29600 美元后,如果特斯拉今天卖掉这些比特币,其 15 亿美元的投资也只能做到盈亏相抵。

你猜马一龙会不会马上抛售比特币呢?

Gmail 启用 BIMI 安全功能

邮件认证品牌标识(BIMI)是一项行业标准,旨在为电子邮件生态系统带来更强大的发件人身份验证。认证品牌标识的设计是当一个组织向你发送使用 DMARC 标准认证的电子邮件时,该组织的标志将显示在你的收件箱中。使用发件人政策框架(SPF)或域密钥识别邮件(DKIM)认证其电子邮件并部署 DMARC 的组织可以通过验证标记证书(VMC)向谷歌提供其验证的商标标识。

这只是使 DMARC 更用户友好而已,本质上还是依靠 DMARC 的机制。

存在 6 年的 systemd 安全漏洞被披露

Qualys 发现了一个新的 systemd 安全漏洞,使任何非特权的用户能够通过内核恐慌造成拒绝服务。几乎所有现代 Linux 发行版都使用 systemd。这个特殊的安全漏洞于 2015 年 4 月出现在 systemd 代码中。这种攻击可以由本地攻击者在很长的路径上挂载一个文件系统来实现。这将导致 systemd 堆栈中使用过多的内存空间,从而导致系统崩溃。systemd 的开发者已经修补了这个漏洞。

这是一个严重的安全漏洞,请尽快注意并升级。

即使你用的是诸如 Gmail 的托管邮件服务,你也可以通过 Mutt 在终端里收发电子邮件。

 title=

我喜欢在 Linux 终端上读写电子邮件的便捷,因此我是 Mutt 这个轻量简洁的电子邮件客户端的忠实用户。对于电子邮件服务来说,不同的系统配置和网络接入并不会造成什么影响。这个客户端通常隐藏在我 Linux 终端的 某个标签页或者某个终端复用器的面板 上,需要用的时候随时可以调出来,不需要使用的时候放到后台,就不需要在桌面上一直放置一个电子邮件客户端的应用程序。

当今我们大多数人使用的都是托管电子邮件账号,在这种使用场景中并不会与电子邮件协议发生过多的直接交互。而 Mutt(以及更早的 ELM)是在更简单的时代创建的,那时候检查邮件只是对 uucp 的调用,以及对 /var/mail 的读取。当然 Mutt 也很与时俱进,随着各种流行的协议(如 POP、IMAP、LDAP)出现,它都实现了良好的支持。因此,即使我们使用的是 Gmail 这种邮件服务,也可以与 Mutt 无缝衔接。

如今在大多数情况下,用户都不会拥有自己的电子邮件服务器,大部分用户都会选择 Gmail,因此下文会以 Mutt + Gmail 为例作介绍。如果你比较注重电子邮件隐私,不妨考虑 ProtonMail 或者 Tutanota,它们都提供完全加密的电子邮件服务。其中 Tutanota 包含很多 开源组件,而 ProtonMail 则为付费用户提供 IMAP 桥接,简化了在非浏览器环境下的邮件访问。不过,很多公司、学校和组织都没有自己的电子邮件服务,而是使用 Gmail 提供的邮件服务,这样一来,大部分用户都会有一个 Gmail 邮箱。

当然,如果你自己就 拥有电子邮件服务器,那么使用 Mutt 就更简单了。下面我们开始介绍。

安装 Mutt

在 Linux 系统上,一般可以直接从发行版提供的软件库中安装 Mutt,另外需要在家目录中创建一个 .mutt 目录以存放配置文件:

$ sudo dnf install mutt
$ mkdir ~/.mutt

在 MacOS 上,可以通过 MacPorts 或者 Homebrew 安装;在 Windows 上则可以使用 Chocolatey 安装。

Mutt 是一个 邮件用户代理 Mail User Agent (MUA),因此它的作用是读取、编写以及向外部邮件池发送邮件。向邮件服务器实际传输邮件是其它应用或邮件服务的工作,尽管它们可以和 Mutt 进行协作,让我们看起来是 Mutt 完成了所有功能,但实际上并非如此。在弄懂了两者之间的区别之后,我们会对 Mutt 的配置更加清楚。

这也是为什么除了 Mutt 之外,我们还需要视乎进行通信的服务种类选择一些辅助应用程序。在本文中我使用的是 IMAP 服务,这可以让我本地的电子邮件副本与电子邮件服务提供商的远程邮件副本保持同步。如果你选择 POP 服务,配置的难度就更下一个台阶了,也无需依赖其它外部工具。我们需要 OfflineIMAP 这个 Python 应用程序来实现 IMAP 的集成,这个应用程序可以在 它的 GitHub 存储库 获取。

OfflineIMAP 目前仍然在从 Python 2 移植到 Python 3,目前需要手动安装,但以后你也可以通过 python3 -m pip 命令进行安装。

OfflineIMAP 依赖于 imaplib2 库,这个库也在努力开发当中,所以我更喜欢手动安装。同样地,也是通过 Git 将代码库克隆到本地,进入目录后使用 pip 安装。

首先安装 rfc6555 依赖:

$ python3 -m pip install --user rfc6555

然后从源码安装 imaplib2

$ git clone [email protected]:jazzband/imaplib2.git
$ pushd imaplib2.git
$ python3 -m pip install --upgrade --user .
$ popd

最后从源码安装 OfflineIMAP:

$ git clone [email protected]:OfflineIMAP/offlineimap3.git
$ pushd offlineimap3.git
$ python3 -m pip install --upgrade --user .
$ popd

如果你使用的是 Windows 上的 Cygwin,那么你还需要安装 Portlocker

配置 OfflineIMAP

OfflineIMAP 默认使用 ~/.offlineimaprc 这个配置文件,在它的代码库中会有一个名为 offlineimap.conf 的配置模板,可以直接将其移动到家目录下:

$ mv offlineimap3.git/offlineimap.conf ~/.offlineimaprc`

你可以使用任何文本编辑器打开浏览这个配置文件,它的注释很完善,便于了解各个可用的配置项。

以下是我的 .offlineimaprc 配置文件,为了清晰起见,我把其中的注释去掉了。对于你来说其中有些配置项的值可能会略有不同,但或许会为你的配置带来一些启发:

[general]
ui = ttyui
accounts = %your-gmail-username%
pythonfile = ~/.mutt/password_prompt.py
fsync = False

[Account %your-gmail-username%]
localrepository = %your-gmail-username%-Local
remoterepository = %your-gmail-username%-Remote
status_backend = sqlite
postsynchook = notmuch new

[Repository %your-gmail-username%-Local]
type = Maildir
localfolders = ~/.mail/%your-gmail-username%-gmail.com
nametrans = lambda folder: {'drafts':  '[Gmail]/Drafts',
                            'sent':    '[Gmail]/Sent Mail',
                            'flagged': '[Gmail]/Starred',
                            'trash':   '[Gmail]/Trash',
                            'archive': '[Gmail]/All Mail',
                            }.get(folder, folder)

[Repository %your-gmail-username%-Remote]
maxconnections = 1
type = Gmail
remoteuser = %your-gmail-username%@gmail.com
remotepasseval = '%your-gmail-API-password%'
## remotepasseval = get_api_pass()
sslcacertfile = /etc/ssl/certs/ca-bundle.crt
realdelete = no
nametrans = lambda folder: {'[Gmail]/Drafts':    'drafts',
                            '[Gmail]/Sent Mail': 'sent',
                            '[Gmail]/Starred':   'flagged',
                            '[Gmail]/Trash':     'trash',
                            '[Gmail]/All Mail':  'archive',
                            }.get(folder, folder)
folderfilter = lambda folder: folder not in ['[Gmail]/Trash',
                                             '[Gmail]/Important',
                                             '[Gmail]/Spam',
                                             ]

配置文件里有两个可以替换的值,分别是 %your-gmail-username%%your-gmail-API-password%。其中第一个值需要替换为 Gmail 用户名,也就是邮件地址中 @gmail.com 左边的部分。而第二个值则需要通过双因素身份验证(2FA)后从 Google 获取(即使你在查收邮件时不需要使用 2FA)。

为 Gmail 设置双因素身份验证(2FA)

Google 希望用户通过 Gmail 网站收发电子邮件,因此当你在 Gmail 网站以外操作电子邮件时,实际上是被 Google 作为“开发者”看待(尽管你没有进行任何开发工作)。也就是说,Google 会认为你正在创建一个应用程序。要获得开发者层面的应用程序密码,就必须设置双因素身份验证。完成了这个过程以后,就可以获得一个应用程序密码,Mutt 可以通过这个密码在浏览器以外的环境登录到你的电子邮箱中。

为了安全起见,你还可以在 Google 的 账号安全 页面中添加一个用于找回的电子邮件地址。

在账号安全页面中,点击“ 两步验证 2-step Verification ”开始设置 2FA,设置过程中需要用到一部手机。

激活 2FA 之后,账号安全页面中会出现“ 应用程序密码 App Passwords ”选项,点击就可以为 Mutt 创建一个新的应用程序密码。在 Google 生成密码之后,将其替换 .offlineimaprc 配置文件中的 %your-gmail-API-password% 值。

直接将应用程序密码记录在 .offlineimaprc 文件中,这种以纯文本形式存储的做法有一定的风险。长期以来我都是这样做的,而且感觉良好,因为我的家目录是加密的。但出于安全考虑,我现在已经改为使用 GnuPG 加密应用程序密码,这部分内容不在本文的讨论范围,关于如何设置 GPG 密码集成,可以参考我的 另一篇文章

在 Gmail 启用 IMAP

在你永远告别 Gmail 网页界面之前,还有最后一件事:你必须启用 Gmail 账户的 IMAP 访问。

在 Gmail 网站页面中,点击右上角的“cog”图标,选择“ 查看所有设置 See all settings ”。在 Gmail 设置页面中,点击“POP/IMAP”标签页,并选中“ 启用 IMAP enable IMAP ”,然后保存设置。

现在就可以在浏览器以外访问你的 Gmail 电子邮件了。

配置 Mutt

Mutt 的配置过程相对简单。和 .bashrc.zshrc.emacs 这些配置文件一样,网络上有很多优秀的 .muttrc 配置文件可供参照。我自己的 .muttrc 配置文件则借鉴了 Kyle RankinPaul Frields 等人的配置项和想法。下面列出我的配置文件的一些要点:

set ssl_starttls=yes
set ssl_force_tls=yes

set from='[email protected]'
set realname='Tux Example'

set folder = imaps://imap.gmail.com/
set spoolfile = imaps://imap.gmail.com/INBOX
set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"
set smtp_url="smtp://smtp.gmail.com:25"
set move = no
set imap_keepalive = 900
set record="imaps://imap.gmail.com/[Gmail]/Sent Mail"

# Paths
set folder           = ~/.mail
set alias_file       = ~/.mutt/alias
set header_cache     = "~/.mutt/cache/headers"
set message_cachedir = "~/.mutt/cache/bodies"
set certificate_file = ~/.mutt/certificates
set mailcap_path     = ~/.mutt/mailcap
set tmpdir           = ~/.mutt/temp
set signature        = ~/.mutt/sig
set sig_on_top       = yes

# Basic Options
set wait_key = no
set mbox_type = Maildir
unset move               # gmail does that

# Sidebar Patch
set sidebar_visible = yes
set sidebar_width   = 16
color sidebar_new color221 color233

## Account Settings
# Default inbox
set spoolfile = "+example.com/INBOX"

# Mailboxes to show in the sidebar.
mailboxes +INBOX \
          +sent \
          +drafts

# Other special folder
set postponed = "+example.com/drafts"

# navigation
macro index gi "<change-folder>=example.com/INBOX<enter>" "Go to inbox"
macro index gt "<change-folder>=example.com/sent" "View sent"

整个配置文件基本是开箱即用的,只需要将其中的 Tux Exampleexample.com 替换为你的实际值,并将其保存为 ~/.mutt/muttrc 就可以使用了。

启动 Mutt

在启动 Mutt 之前,需要先启动 offlineimap 将远程邮件服务器上的邮件同步到本地。在首次启动的时候耗时可能会比较长,只需要让它整晚运行直到同步完成就可以了。

在同步完成后,启动 Mutt:

$ mutt

Mutt 会提示你打开用于管理电子邮件的目录权限,并展示收件箱的视图。

 title=

学习使用 Mutt

在学习使用 Mutt 的过程中,你可以找到最符合你使用习惯的 .muttrc 配置。例如我的 .muttrc 配置文件集成了使用 Emacs 编写邮件、使用 LDAP 搜索联系人、使用 GnuPG 对邮件进行加解密、链接获取、HTML 视图等等一系列功能。你可以让 Mutt 做到任何你想让它做到的事情,你越探索,就能发现越多。


via: https://opensource.com/article/21/7/gmail-linux-terminal

作者:Seth Kenlon 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Mailmerge 是一个可以定制群发邮件的命令行程序,它可以处理简单和复杂的邮件。

电子邮件还是生活的一部分,尽管有种种不足,它仍然是大多数人发送信息的最佳方式,尤其是在按队列将邮件发送给收件人的自动化方式中。

作为 Fedora 社区行动和影响协调员,我的工作之一就是给人们发送资助旅行相关的好消息,我经常通过电子邮件做这些事。这里,我将给你展示如何使用 Mailmerge 向一群人发送定制邮件的,Mailmerge 是一个可以处理简单和复杂的邮件的命令行程序。

安装 Mailmerge

在 Fedora 中,Mailmerge 已经打包可用,你可以通过在命令行中运行 sudo dnf install python3-mailmerge 来安装它。你还可以使用 pip 命令从 PyPi 中安装,具体可以参阅该项目的 README

配置 Mailmerge

三个配置文件控制着 Mailmerge 的工作模式。运行 mailmerge --sample,将生成配置文件模板。这些文件包括:

  • mailmerge_server.conf: 这里保存着 SMTP 服务端邮件发送相关详细配置,但你的密码 在这里保存。
  • mailmerge_database.csv: 这里保存每封邮件的定制数据,包括收件人的电子邮件地址。
  • mailmerge_template.txt: 这里保存电子邮件的文本,文本中包含占位符,这些占位符会使用 mailmerge_database.csv 中的数据替换。

Server.conf

配置模板文件 mailmerge_server.conf 包含几个大家应该很熟悉的例子。如果你曾经往手机上添加过电子邮件或者设置过桌面电子邮件客户端,那你就应该看到过这些数据。需要提醒的是要记得把你的用户名更新到这个文件中,尤其是在你使用模板所提供的配置时。

Database.csv

mailmerge_database.csv 这个配置文件稍微有点复杂。最起码要将邮件接收者的电子邮件地址保存在这里,其它在电子邮件中任何需要替换的定制信息也要保存在这里。推荐在创建本文件的占位符列表时,同步编辑 mailmerge_template.txt 文件。我发现一个有效的做法是,使用电子表格软件录入这些数据,完成后导出为 CSV 文件。使用下面的示例文件:

email,name,number
[email protected],"Myself",17
[email protected],"Bob",42

可以你向这两个人发送电子邮件,使用他们的名字并告诉他们一个数字。这个示例文件虽然不是特别有趣,但应用了一个重要的原则,那就是:始终让自己处于邮件接收列表的首位。这样你可以在向列表全员发送邮件之前,先给自己发送一个测试邮件,以验证邮件的效果是否如你预期。

任何包含半角逗号的值,都 必须 以半角双引号(")封闭。如果恰好在半角双引号封闭的区域需要有一个半角双引号,那就在同一行中连续使用两个半角双引号。引号的规则比较有趣,去 Python 3 中关于 CSV 的内容中 一探究竟吧。

Template.txt

我的工作之一,就是为我们 Fedora 贡献者会议 Flock 发送与旅行基金有关的信息。通过简单的邮件告诉有关的人,他被选中为旅行基金支持的幸运者,以及相应基金支持的详细信息。与接收者相关的具体信息之一就是我们可以为他的旅行提供多少资助。下面是一份我的节略后的模板文件(为了简洁,已经移除大量的文本):

$ cat mailmerge_template.txt
TO: {{Email}}
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <[email protected]>


Hi {{Name}},


I am writing you on behalf of the Flock funding committee.  You requested funding for your attendance at Flock.  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,[email protected],1000
PersonA,[email protected],1500
PèrsonB,[email protected],500

注意,我把自己的信息放在了首条,这是为了测试方便。除了我,还有另外两个人的信息在文档中。列表中的第二个人 PèrsonB,他的名字中有一个包含变音符号的字母,Mailmerge 会对这类字母自动编码。

以上包含了模板的全部知识点:写上你自己的电子邮件信息,并编写好以双大括弧封闭的占位符。接下来创建用来提供前述占位符具体值的数据文件。现在测试一下电子邮件的效果。

测试并发送简单邮件

试运行

测试从邮件的试运行开始,试运行就是讲邮件内容显示出来,所有的占位符都会被具体值取代。默认情况下,如果你运行不带参数的命令 mailmerge,它将对收件列表中的第一个人进行试运行:

$ mailmerge
>>> encoding ascii
>>> message 0
TO: [email protected]
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <[email protected]>
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.  You requested funding for your attendance at Flock.  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.  To remove the limit, use the --no-limit option.
>>> This was a dry run.  To send messages, use the --no-dry-run option.

从试运行生成的邮件中(列表中的 message 0 ,和计算机中很多计数场景一样,计数从 0 开始),可以看到我的名字及旅行预算是正确的。如果你想检视所有的邮件,运行 mailmerge --no-limit,告诉 Mailmerge 不要仅仅处理第一个收件人的信息。下面是第三个收件人邮件的试运行结果,用来测试特殊字符的编码:

>>> message 2
TO: [email protected]
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <[email protected]>
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: [email protected]
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <[email protected]>
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.  You requested funding for your attendance at Flock.  After careful consideration we are able to offer you the following funding:


Travel Budget: 1000


<<snip>>


>>> Read SMTP server configuration from mailmerge_server.conf
>>>   host = smtp.gmail.com
>>>   port = 587
>>>   username = [email protected]
>>>   security = STARTTLS
>>> password for [email protected] on smtp.gmail.com:
>>> sent message 0
>>> No attachments were sent with the emails.
>>> Limit was 1 messages.  To remove the limit, use the --no-limit option.

在倒数第 4 行,它将要求你输入你的密码。如果你使用的是双因素认证或者域控制登录,那就需要创建应用密码来绕过这些控制。如果你使用的是 Gmail 或者类似的系统,可以直接在界面上完成密码验证。如果不行的话,联系你的邮件系统管理员。上述这些操作不会影响邮件系统的安全性,但是仍然有必要采用复杂的安全性好的密码。

我在我的邮件收件箱中,看到了这封格式美观的测试邮件。如果测试邮件看起来没有问题,那就可以运行 mailmerge --no-dry-run --no-limit 发送所有的邮件了。

发送复杂邮件

只有充分了解了 Jinja2 模板 ,你才可能充分领略 Mailmerge 真正的威力。在邮件模板中使用条件语句及附带附件,是很有用的。下面就是一个复杂邮件的模板及对应的数据文件:

$ cat mailmerge_template.txt
TO: {{Email}}
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <[email protected]>
ATTACHMENT: attachments/{{File}}


Hi {{Name}},


I am writing you on behalf of the Flock funding committee.  You requested funding for your attendance at Flock.  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,[email protected],1000,Yes,visa_bex.pdf
PersonA,[email protected],1500,No,visa_person_a.pdf
PèrsonB,[email protected],500,Yes,visa_person_b.pdf

在这个邮件中有两项新内容。首先是附件,我需要向参加国际旅行的人发送签证邀请信,帮助他们来 Flock,文件头的 ATTACHMENT 部分说明了要包含什么文件;为了保持我的文档目录清晰,我将所有需要作为附件的文档保存于附件子目录下。其次是包含了关于宾馆的条件信息,因为有些人的旅行资金包含了住宿费用,我需要对涉及住宿的人员诉及相关信息,而这是通过 if 判断实现的:

{% if Hotel == "Yes" -%}
Lodging: Lodging in the hotel Wednesday-Sunday (4 nights)
{%- endif %}

这和大多数编程语言中的 if 判断是一样的。Jinja2 实力非凡,可以实现多级判断。通过包含数据元素控制邮件内容,能大大简化相关的日常工作。空格的正确使用对邮件的易读性很重要。ifendif 语句中的短线( - )是 Jinja2 控制 空白字符 的一部分。这里面选项很多,所以还是要通过试验找到最适合自己的方式。

在上面的例子中,我在数据文件扩充了 HotelFile 两个字段,这些字段的值控制着宾馆信息和附件文件名。另外,在上例中,我和 PèrsonB 有住宿资助,但 PersonA 没有。

对于简单邮件和复杂邮件而言,试运行及正式发送邮件的操作都是相同的。快去试试吧!

你还可以尝试在邮件头中使用条件判断( ifendif ),比如你可以使发送给在数据库中的某人的邮件包含附件,或者改变对部分人改变发送人的信息。

Mailmerge 的优点

Mailmerge 是用来批量发送定制邮件的简洁而高效的工具。每个人只接受到他需要的信息,其它额外的操作和细节都是透明的。

我还发现,即使是在发送简单的集团邮件时,相对于使用 CC 或者 BCC 向一组受众发送一封邮件,采用 Mailmerge 也是非常高效的。很多人使用了邮件过滤,那些不是直接发给他们的邮件,他们一律不会立刻处理。使用 Mailmerge 保证了每名接收者收到的就是自己的邮件。所有的信息会对接收者进行正确过滤,再也不会有人无意间回复到整个邮件组。


via: https://opensource.com/article/19/8/sending-custom-emails-python

作者:Brian "bex" Exelbierd 选题:lujun9972 译者:silentdawn-zz 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过理解安全证书来保护你的 Linux 邮件服务。

通常,不管你是通过 简单邮件传输协议 Simple Mail Transport Protocol (SMTP)或者 互联网消息访问协议 Internet Message Access Protocol (IMAP)或 邮局协议 Post Office Protocol (POP)发送或者接受邮件,邮件服务默认都是以无保护的明文来传输数据。近来随着数据加密成为越来越多程序的共识,你需要 安全套接层 Secure Sockets Layer / 传输层安全性 Transport Layer Security (SSL/TLS)的安全证书来保护你的邮件服务。

首先,快速回顾一下邮件服务和协议的基本流程。邮件通过 SMTP 从 TCP 端口 25 发出。这个协议依靠 DNS 邮件交换服务器 Mail eXchanger (MX)记录的地址信息来传输邮件。当邮件到达邮件服务器后,可以被以下两种服务中的任意一种检索:使用 TCP 端口 143 的 IMAP,或者使用 TCP 端口 110 的 POP3(邮局协议第 3 版)。然而,以上服务都默认使用明文传输邮件和认证信息。这非常的不安全!

为了保护电子邮件数据和认证,这些服务都增加了一个安全功能,使它们可以利用 SSL/TLS 证书对数据流和通讯进行加密封装。SSL/TLS 是如何加密数据的细节不在本文讨论范围,有兴趣的话可以阅读 Bryant Son 关于互联网安全的文章了解更多细节。概括的说,SSL/TLS 加密是一种基于公钥和私钥的算法。

通过加入这些安全功能后,这些服务将监听在新的 TCP 端口:

服务默认 TCP 端口SSL/TLS 端口
SMTP25587
IMAP143993
POP3110995

生成 SSL/TLS 证书

OpenSSL 可以生成免费的 SSL/TLS 证书,或者你也可以从公共 证书颁发机构 Certificate Authoritie (CA)购买。过去,生成自签发证书十分简单而且通用,但是由于安全被日益重视,大部分的邮件客户端是不信任自签发证书的,除非手动设置。

如果你只是自己使用或者做做测试,那就使用自签发证书省点钱吧。但是如果很多人或者客户也需要使用的话,那最好还是从受信任的证书颁发机构购买。

不管是哪种情况,开始请求新证书的过程是使用 Linux 系统上的 OpenSSL 工具来创建一个 证书签发请求 Certificate Signing Request (CSR):

$ openssl req -new -newkey rsa:2048 -nodes -keyout mail.mydomain.key -out mail.mydomain.csr

这个命令会为你想保护的服务同时生成一个新的 CSR 文件和一个私匙。它会询问你一些证书相关的问题,如:位置、服务器的 完全合规域名 Fully Qualified Domain Name (FQDN)、邮件联系信息等等。当你输入完这些信息后,私钥和 CSR 文件就生成完毕了。

如果你想生成自签发证书

如果你想要生成自签发证书的话,在运行以上 CSR 命令之前,你必须先创建一个自己的根 CA。你可以通过以下方法创建自己的根 CA。

$ openssl genrsa -des3 -out myCA.key 2048

命令行会提示你输入一个密码。请输入一个复杂点的密码而且不要弄丢了,因为这将会是根 CA 私钥的密码,正如其名称所示,它是你的证书中所有信任关系的根。

接下来,生成根 CA 证书:

$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

在回答完一些问题后,你就拥有一个有效期为 5 年的根 CA 证书了。

用之前生成的 CSR 文件,你可以请求生成一个新证书,并由您刚才创建的根 CA 签名。

$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256

输入你的根 CA 私钥的密码来创建和签署证书。

现在你有了配置电子邮件服务以增强安全性所需的两个文件:私匙文件 mail.mydomain.key 和公开证书文件 mail.mydomain.pem

如果你愿意购买证书

如果你愿意从机构购买证书,则需要上传 CSR 文件到证书颁发机构的系统中,它将会被用于生成 SSL/TLS 证书。证书可作为文件下载,比如 mail.mydomain.pem。很多 SSL 机构也需要你下载一个中间证书。如果是这样的话,你必须把这个两个证书合并成一个,这样电子邮件服务就可以将这两个证书结合起来处理。可以使用以下命令把你的证书和第三方中间证书合并在一起:

$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem

值得一提的是 .pem 文件后缀代表 隐私增强邮件 Privacy-Enhanced Mail

现在你就有全部的设置邮件服务安全所需文件了:私匙文件 mail.mydomain.key 和组合的公开证书文件 mail.mydomain.pem

为你的文件生成一个安全的文件夹

不管你是的证书是自签发的或者从机构购买,你都需要生成一个安全的,管理员拥有的文件夹用于保存这两个文件。可以使用以下命令来生成:

$ mkdir /etc/pki/tls
$ chown root:root /etc/pki/tls
$ chmod 700 /etc/pki/tls

在复制文件到 /etc/pki/tls 后,再次设置这些文件的权限:

$ chmod 600 /etc/pki/tls/*

配置你的 SMTP 和 IMAP 服务

接下来,让 SMTP 和 IMAP 服务使用新的安全证书。我们用 postfixdovecot 来作为例子。

用你顺手的编辑器来编辑 /etc/postfix/main.cf 文件。添加以下几行:

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pem
smtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key

自定义选项

以下选项可以启用或禁用各种加密算法,协议等等:

smtpd_tls_eecdh_grade = strong
smtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_security_level=may
smtpd_tls_ciphers = high
tls_preempt_cipherlist = yes
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

编辑 /etc/dovecot/dovecot.conf 文件,添加以下三行:

ssl = required
ssl_cert = &lt;/etc/pki/tls/mail.mydomain.pem
ssl_key = &lt;/etc/pki/tls/mail.mydomain.key

添加下列更多选项来启用或禁用各种加密算法、协议等等(我把这些留给你来理解):

ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1
ssl_min_protocol = TLSv1.2

设置 SELinux 上下文

如果你的 Linux 发行版启用了 SELinux,请为你的新证书文件设置正确的 SELinux 上下文。

对于 Postfix 设置 SELinux:

$ chcon -u system_u -t cert_t mail.mydomain.*

对于 Dovecot 设置 SELinux:

$ chcon -u system_u -t dovecot_cert_t mail.mydomain.*

重启这些服务,并与你相应更新过的电子邮件客户端配置连接。有些电子邮件客户端会自动探测到新的端口,有些则需要你手动更新。

测试配置

openssl 命令行和 s_client 插件来简单测试一下:

$ openssl s_client -connect mail.mydomain.com:993
$ openssl s_client -starttls imap -connect mail.mydomain.com:143
$ openssl s_client -starttls smtp -connect mail.mydomain.com:587

这些测试命令会打印出很多信息,关于你使用的连接、证书、加密算法、会话和协议。这不仅是一个验证新设置的好方法,也可以确认你使用了适当的证书,以及在 postfix 或 dovecot 配置文件中定义的安全设置正确。

保持安全!


via: https://opensource.com/article/20/4/securing-linux-email

作者:Marc Skinner 选题:lujun9972 译者:Acceleratorrrr 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出