FreeBSD下配置sendmail收外部郵件
Created 2018-07-27 / Updated 2022-05-17先為你的域名添加一條A記錄,指向你的郵件服務器。然後添加一條MX記錄,指向前面的A記錄,優先度設為10。最後再添加一條TXT記錄。全部如下:
Name Type Content Priority
mail A 服务器ip地址
@ MX mail.example.com 10
@ TXT v=spf1 -all
(TXT記錄的內容表示,該域名只用來收郵件,不發郵件)
要想讓FreeBSD的sendmail支持收取外部郵件,需要在/etc/rc.conf裏啟用sendmail的全部功能,順便把hostname設置成你的域名:
# vi /etc/rc.conf
sendmail_enable="YES"
hostname="example.com"
讓hostname即時生效:
# hostname example.com
然後開放服務器的25端口(只允許in):
# ipfw -q add 編號 allow tcp from any to me 25 in setup limit src-addr 2
重啟sendmail:
# service sendmail restart
用外部郵箱給root@example.com發一封郵件,看root能不能收到。
郵件如果能順利收到的話,可以先關閉25端口,再為sendmail做一些安全配置:
# ipfw delete 編號
啟用STARTTLS
# cd /etc/mail
# make
這時會在該目錄下生成<hostname>.mc和<hostname>.submit.mc兩個文件。這裏主要修改<hostname>.mc這個文件,該文件每經修改,都要運行一次make install-cf
以覆蓋舊有的sendmail.cf。然後再運行service sendmail restart
重啟sendmail。
# vi <hostname>.mc
dnl Enable STARTTLS for receiving email.
define(`CERT_DIR', `/usr/local/etc/letsencrypt/live/example.com')dnl
define(`confSERVER_CERT', `CERT_DIR/cert.pem')dnl
define(`confSERVER_KEY', `CERT_DIR/privkey.pem')dnl
define(`confCLIENT_CERT', `CERT_DIR/cert.pem')dnl
define(`confCLIENT_KEY', `CERT_DIR/privkey.pem')dnl
define(`confCACERT', `CERT_DIR/chain.pem')dnl
define(`confCACERT_PATH', `/usr/local/etc/mail/certs/ROOT')dnl
define(`confDH_PARAMETERS', `/usr/local/etc/mail/certs/dh.param')dnl
(使用服務器上的Let’s Encrypt證書,把example.com替換成你自己的)
# mkdir -p /usr/local/etc/mail/certs/ROOT
# vi ~/split.sh
### 內容開始 ###
#!/bin/sh
RCert=/usr/local/etc/ssl/cert.pem
DESTDIR=/usr/local/etc/mail/certs/ROOT
cd $DESTDIR
rm -f *
cat $RCert | sed -E '/^(Certificate:|SHA1 Fingerprint|#| |$)/d' | split -p '-----BEGIN CERTIFICATE-----'
for a in `ls $DESTDIR`
do
mv $a `openssl x509 -hash -noout < $a`.0
done
### 內容結束 ###
執行:
# sh ~/split.sh
(上面的腳本運行後,收外部郵件時log裏就不會出現「unable to get local issuer certificate」這種情況了)
生成DH parameters:
# openssl dhparam -out /usr/local/etc/mail/certs/dh.param 2048
如果sendmail啟動時log裏提示:
file …/privkey.pem unsafe: Group readable file
在<hostname>.mc裏加上一句:
define(`confDONT_BLAME_SENDMAIL', `groupreadablekeyfile')dnl
然後:
# chmod 640 /usr/local/etc/letsencrypt/archive/example.com/privkey1.pem
即可解決。
測試STARTTLS是否生效:
# telnet localhost 25
EHLO localhost <-輸入這一行
如果能看到「STARTTLS」一行,則說明STARTTLS已經生效了。(按Ctrl+]
再輸入q
回車退出)
其它一些個人配置
define(`confMAX_MESSAGE_SIZE', `1024000')dnl
define(`confSMTP_LOGIN_MSG', `unknown')dnl
define(`confPRIVACY_FLAGS', `goaway')dnl
Dwlocalhost
Dmmy.domain
define(`confDOMAIN_NAME', `$w.$m')dnl
參考:
Categories: [FreeBSD] [mail]