sendmail 使用外部 smtp 服务发送邮件

linux上,想要让 sendmail使用外部 smtp服务发送邮件,需要完成以下两件事情:

  • 生成 authinfo文件,用于存储登录外部 smtp服务器的用户信息
  • 配置 sendmail.mc文件

1. 生成 authinfo
1)进入 /etc/mail目录,创建 /etc/mail/authinfo文件,并添加如下内容:

AuthInfo:smtp.domain.cn "U:USERNAME" "P:PASSWORD" "M:PLAIN"

或者是:

AuthInfo:mail.domain.cn "U:USERNAME" "P:PASSWORD" "M:PLAIN"

下面有讲 smtp.domain.cnmail.domain.cn区别。

2)创建 hash map文件

$ makemap hash authinfo < authinfo

执行完上述命令后,可以看到在 /etc/mail目录下生成了一个名为 authinfo.db的二进制文件,后面会将其路径配置在 sendmail.mc文件中。

2. 配置 sendmail.mc文件
还是在 /etc/mail目录下,打开 sendmail.mc文件,进行如下修改:

2.1 取消下面这一行的注释,并配置你自己的外部 smtp服务器地址:
"dnl define(`SMART_HOST', `smtp.your.provider')dnl"
如下所示:

define(`SMART_HOST', `smtp.domain.cn')dnl

或者是:

define(`SMART_HOST', `mail.domain.cn')dnl

到底是 smtp.domain.cn,还是mail.domain.cn,这个需要和你的邮件服务提供商进行确认。我之前遇到一个问题是,一开始配置为 smtp.domain.cn,可以正常使用。但过了几个月之后,突然不可用了,发不出去邮件了,日志显示SMART_HOST这个配置有问题,导致邮件发送失败,最后和邮件服务提供商确认,他们说应该是mail.domain.cn,不知道为啥变了,但是改过来就好了,所以说最好还是确认一下。

在上述配置行下面添加如下几行内容:

define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
FEATURE(`authinfo', `hash -o /etc/mail/authinfo.db')dnl

注意: 上面指定的 smtp端口是 587,如果与实际情况不符,应进行更改,比如,改为 25或其他。

2.2 取消下面这几行的注释:

define(`confAUTH_OPTIONS', `A p')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

2.3 安装 sendmail-cf工具,用于重新生成配置文件

$ yum install -y sendmail-cf

2.4 重新生成配置文件

$ /etc/mail/make

2.5 重启 sendmail服务

$ systemctl restart sendmail

3 邮件发送示例

$ sendmail -f"user@domain.cn" -t
Subject: Hello
From: user@domain.cn
To: person@xxx.cn

This is a test.
.

上面指定了 -f参数,我认为是有必要的,因为从 sendmail的运行日志来看,如果不指定的话,可能会出现外部 smtp服务器无响应的情况。

若在执行上述命令发送邮件时出现卡住的感觉,则需查看 sendmail运行日志来确认问题,如下所示:

$ systemctl status sendmail
● sendmail.service - Sendmail Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/sendmail.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-10-26 08:03:45 CST; 6s ago
  Process: 16736 ExecStart=/usr/sbin/sendmail -bd $SENDMAIL_OPTS $SENDMAIL_OPTARG (code=exited, status=0/SUCCESS)
  Process: 16731 ExecStartPre=/etc/mail/make aliases (code=exited, status=0/SUCCESS)
  Process: 16728 ExecStartPre=/etc/mail/make (code=exited, status=0/SUCCESS)
 Main PID: 16745 (sendmail)
    Tasks: 1 (limit: 832684)
   Memory: 8.8M
   CGroup: /system.slice/sendmail.service
           └─16745 sendmail: accepting connections

1026 08:02:45 CentOS-8 systemd[1]: Starting Sendmail Mail Transport Agent...
1026 08:02:45 CentOS-8 sendmail[16736]: My unqualified host name (CentOS-8) unknown; sleeping for retry
1026 08:03:45 CentOS-8 sendmail[16736]: unable to qualify my own domain name (CentOS-8) -- using short name
...

从上述日志中可以发现,sendmail有报错信息,即:

1026 08:02:45 CentOS-8 sendmail[16736]: My unqualified host name (CentOS-8) unknown; sleeping for retry
1026 08:03:45 CentOS-8 sendmail[16736]: unable to qualify my own domain name (CentOS-8) -- using short name

该问题的解决方法是在 /etc/hosts文件中加入主机名 'CentOS-8'的解析配置项,即:

127.0.0.1		localhost.localdomain localhost CentOS-8

参考资料

  1. https://community.webcore.cloud/tutorials/how_to_configure_sendmail_to_use_an_smtp_relay/
  2. https://help.thorntech.com/docs/sftp-gateway-classic/routing-sendmail-through-external-smtp-relay/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值