Sendmail (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Sendmail翻译。上次翻译日期:2016-08-26。如果英文版本有所更改,则您可以帮助同步翻译。

Tango-preferences-desktop-locale-modified.png这篇文章或章节的翻译不反映原文。Tango-preferences-desktop-locale-modified.png

原因:Last updated in 2016, out of sync with English page(在 Talk:Sendmail (简体中文)# 中讨论)

Sendmail 是来自 UNIX 世界的经典 SMTP 服务器。Arch Linux 还提供了 Postfix

本文的目的是为本地用户账户设置 Sendmail,不使用 mysql 或者其它数据库,同时允许建立所谓 mail-only 账户

本文仅描述了配置 Sendmail 的必需步骤;要添加 IMAP 与 POP3 服务,您可以考虑阅读 Dovecot 的内容。

安装

安装 软件包 sendmailAUR, procmailm4

DNS 记录

您应当拥有一个域名,并且编辑所拥有域名的 MX 记录指向你的服务器。请注意一些服务器在处理指向 CNAMEs 的 MX 记录时会出现问题,所以你应当考虑将 MX 记录指向一个 A 记录。

添加用户

为每个需要接收邮件的用户创建 Linux 用户,每个用户会拥有类似 username@your-domain.com 的电子邮件地址。但是如果你想要添加 mail-only 账户,即仅能处理电子邮件,但不能使用 shell 或 X 进行登录的账户,您可以按如下步骤添加该类账户:

# useradd -m -s /usr/bin/nologin username

注:在此之后,您可以随时通过修改 /etc/passwd 等方式更改账户类型与属性。

配置

创建 SSL 证书

警告: If you plan on implementing SSL/TLS, know that some variations and implementations are still vulnerable to attack. For details on these current vulnerabilities within SSL/TLS and how to apply appropriate changes to Sendmail, visit https://disablessl3.com/ and https://weakdh.org/sysadmin.html

生成一个 key 并对其签名,请阅读 OpenSSL[损坏的链接:无效的章节] 以了解更多信息,Let's Encrypt 提供了免费认证。

警告: 使用经过口令加密(具有 passphrase)的服务器的密钥文件可能导致 Sendmail 启用 TLS 失败。如果出现问题,请参考 这里 移除已有密钥文件的口令。
注意: 建议将服务器密钥与证书统一放在 /etc/mail/certs/ 目录下,并移除服务器密钥文件的组可读与其它可读权限。之后 sendmailconfig 工具可能会自动更改该文件夹下文件的属主、属组与权限。

sendmail.cf

创建文件 /etc/mail/sendmail.mc,并以此为基础使用 m4 工具生成 sendmail.cf 文件。

您可以由 /usr/share/sendmail-cf/README 文件了解配置 sendmail 的全部选项。

警告: 无论是从头创建自己的 sendmail.mc 文件,还是在已有的 sendmail.mc 文件基础上进行修改,请时刻牢记,在非 TLS 情况下使用明文验证是十分危险的行为。除非您明确了解自己行为的意义,请使用以下示例中的方法强制进行 TLS 验证以确保安全性。

下面是在 TLS 之上进行身份验证的配置文件示例。例子包含了解释工作原理的注释,这些注释以 dnl 这个单词起始。

/etc/mail/sendmail.mc
include(`/usr/share/sendmail-cf/m4/cf.m4')
define(`confDOMAIN_NAME', `your-domain.com')dnl
FEATURE(use_cw_file)
dnl  The following allows relaying if the user authenticates,
dnl  and disallows plaintext authentication (PLAIN/LOGIN) on
dnl  non-TLS links:
define(`confAUTH_OPTIONS', `A p y')dnl
dnl
dnl  Accept PLAIN and LOGIN authentications:
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
dnl
dnl Make sure this paths correctly point to your SSL cert files:
define(`confCACERT_PATH',`/etc/ssl/certs')
define(`confCACERT',`/etc/ssl/cacert.pem')
define(`confSERVER_CERT',`/etc/ssl/certs/server.crt')
define(`confSERVER_KEY',`/etc/ssl/private/server.key')
dnl
FEATURE(`virtusertable', `hash /etc/mail/virtusertable.db')dnl
OSTYPE(linux)dnl
MAILER(local)dnl
MAILER(smtp)dnl

然后使用使用

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

命令生成 sendmail.cf 文件。

注意: 如果您对 sendmail.cf 语法感兴趣,请参阅 这篇文章 了解详情。

sendmail.conf

sendmail.conf 文件,如果存在,则也是配置 Sendmail 并最终生成 sendmail.cf 的一个配置文件。请阅读文件内含的注释了解详细信息。

local-host-names

请将您的域名写入 local-host-names 文件:

/etc/mail/local-host-names
localhost
your-domain.com
mail.your-domain.com
localhost.localdomain

请确保您的域名可以被 /etc/hosts 文件解析。

access.db

创建文件 /etc/mail/access 然后写入规则以配置邮件转发、允许收信与拒信。假设你在 10.5.0.0/24 有一个 VPN,而且你希望转发来自该 IP 段的所有邮件:

/etc/mail/access
10.5.0 RELAY
127.0.0 RELAY

然后使用

# makemap hash /etc/mail/access.db < /etc/mail/access

命令处理生成 sendmail 可以使用的配置数据库。

aliases.db

编辑文件 /etc/mail/aliases ,反注释这一行: #root: human being here 并将其修改如下:

root:         your-username

你可以在此添加用户的别名。例如:

coolguy:      your-username
somedude:     your-username

然后使用

# newaliases

命令进行处理。

virtusertable.db

创建 virtusertable 文件并在其中写入含有域名的别名:(这项功能在您的服务器绑定多域名时十分有用)

/etc/mail/virtusertable
your-username@your-domain.com         your-username
joe@my-other.tk                       joenobody

然后使用

# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

命令进行处理。

开机自动启动

启用并启动下列服务。请阅读 守护进程 了解详情。

  • saslauthd.service
  • sendmail.service
  • sm-client.service

SASL 验证

将用户添加至 SASL 数据库并设置用于 SMTP 身份验证的密码。

# saslpasswd2 -c your-username

注:您可以设置使用异于 SASL 的身份验证途径。这需要进一步修改配置文件,这里不赘述。

小窍门

将某个域名的全部邮件转发至特定邮箱

若需将 my-other.tk 域名下所有用户的电子邮件转发到 your-username@your-domain.com,请在 /etc/mail/virtusertable 文件中添加以下一行:

@my-other.tk        your-username@your-domain.com

不要忘记再次使用如下命令更新配置数据库:

# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable