Sendmail

出自 ArchWiki

Sendmail 是经典的 Unix 世界的 邮件传输代理。本文建立在 邮件服务器 的基础上。

本文的目标是为本地用户帐户设置 Sendmail,无需使用 MySQL 或其他数据库,并允许创建仅邮件帐户

安装

本文或本章节的事实准确性存在争议。

理由: sendmail 可以与其他 MDA 一起使用,而不仅仅是 procmail。(在 Talk:Sendmail#MDA_compatibility 中讨论)

安装 sendmailAURprocmailAURm4 软件包。

添加用户

为每个想要在 username@your-domain.com 接收电子邮件的用户创建一个 Linux 用户。要添加仅邮件帐户,即可以接收电子邮件但不能拥有 shell 访问权限或登录 X 的用户,您可以像这样添加他们

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

配置

获取 TLS 证书

警告: 如果您部署 TLS,请务必遵循 weakdh.org 的指南禁用 SSLv3 以防止漏洞。有关更多信息,请参阅 服务器端 TLS

要获取证书,请参阅 OpenSSL#用法

sendmail.cf

本文或本章节的事实准确性存在争议。

理由: 这些引号是否正确,以及这些行尾 dnl 语句是否必要?(在 Talk:Sendmail 中讨论)

创建文件 /etc/mail/sendmail.mc。您可以在文件 /usr/share/sendmail-cf/README 上阅读配置 sendmail 的所有选项。

警告: 如果您创建自己的 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

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

aliases.db

编辑文件 /etc/mail/aliases 并取消注释行 #root: human being here 并将其更改为如下所示

/etc/mail/aliases
root:         your-username

您可以在此处为您的用户名添加别名,例如

/etc/mail/aliases
coolguy:      your-username
somedude:     your-username

然后用以下命令处理它

# newaliases

virtusertable.db

创建您的 virtusertable 文件,并将包含域名的别名放在那里(如果您的服务器托管多个域名,这将非常有用)

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

然后用以下命令处理它

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

开机启动

启用/启动 以下单元。

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

SASL 认证

向 SASL 数据库添加用户以进行 SMTP 身份验证。

# saslpasswd2 -c your-username

技巧与提示

将一个域的所有邮件转发给特定用户

要将发送到 my-other.tld 域中任何用户的所有邮件转发到 your-username@your-domain.com

/etc/mail/virtusertable
@my-other.tld        your-username@your-domain.com

不要忘记再次使用以下命令处理它

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