前期环境准备
先准备一个域名,我这边推荐的是挂载到Cloudflare
DNS配置
1.首先创建一个mail.xxx.com的域名解析
2.邮箱服务器需要用到MX记录,将xxx.com指向mail.xxx.com
3.设置spf防伪,一般可防止邮件被当做垃圾邮件,给google的mail邮件发邮件时,必须得使用有效的spf
a: 域名
mx: 邮箱服务器
include: 第三方代理 这里填谷歌
开放端口
这里需要打开25端口,使用nmap可以查看当前端口是否打开
安装环境
sudo apt-get install make
# postfix编译依赖包
sudo apt-get install libmysqlclient-dev libpq-dev db*-devel libdb-dev gcc m4 libsasl2-dev
-y
Postfix
Postfix 是一种电子邮件服务器是一个开放源代码的软件. Postfix 是MTA邮件传输代理软件.是sendmail提供替代品,每天投递上亿封邮件,Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性.
巴拉巴拉一大堆,没办法用的人多学习的快,官方文档有点难懂
安装postfix
我这里使用的是编译安装,Postfix安装包下载,我这里使用的是3.9稳定版
先下载cyrus-sasl
cyrus-sasl 下载地址,因为编译时指定使用sasl认证需要用到
cd /usr/local
wget https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-2.1.28/cyrus-sasl-2.1.28.tar.gz
tar -xvf cyrus-sasl-2.1.28.tar.gz
cd cyrus-sasl-2.1.28
./configure --enable-plain --enable-login --enable-cram --enable-digest --with-saslauthd=/var/run/saslauthd
make
make install
ln -s /usr/local/include/sasl/ /usr/include/sasl
ln -s /usr/local/lib/sasl2 /usr/lib/sasl2
echo /usr/local/lib/sasl2 >> /etc/ld.so.conf
ldconfig
# 进入/usr/local 下载文件
cd /usr/local
wget http://ftp.porcupine.org/mirrors/postfix-release/official/postfix-3.9.0.tar.gz
# 创建postfix用户和组
groupadd -g 2333 postfix
useradd -g postfix -u 2334 -s /sbin/nologin -M postfix
groupadd -g 2444 postdrop
useradd -g postdrop -u 2445 -s /sbin/nologin -M postdrop
# 解压postfix
tar -xvf postfix-3.9.0.tar.gz
# 进入postfix
cd postfix-3.9.0
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lrt -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
make && make install
配置了用户和用户组直接回车到安装完成即可!
配置Postfix
postfix的核心配置文件在/etc/postfix/main.cf
1.设置myhostname为我们DNS解析的mail.xxx.com域名
2.设置mydomain为DNS解析的xxx.com
3.设置myorigin为myhostname设置的域名
4.设置inet_interfaces
ipv4: 只使用ipv4
ipv6: 只使用ipv6
all: 全部使用
5.设置mydestination,可访问链接的域名地址
6.设置mynetworks,运行访问的客户端,设置为0.0.0.0表示可以任意外部客户端进行访问
7.设置relay_domains,设置为mx指向的域名地址
8.设置relayhost为空,如果有需要中继服务器可以设置指向中继
官方的使用规范
9.设置inet_protocols为all
postfix命令
# 启动
postfix start
# 停止
postfix stop
# 重新加载
postfix reload
postfix可以使用两种sasl认证方式
Cyrus
Dovecot
因为Cyrus不支持LOGIN登录验证,导致JavaMail不能使用
postfix配置使用dovecot进行sasl认证
在/etc/postfix/main.cf的最下方配置即可
vim /etc/postfix/main.cf
# dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtp_sasl_security_options = noanonymous
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_sasl_authenticated_header = yes
Dovecot
Dovecot安装
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d
配置Dovecot
vim /etc/dovecot/dovecot.conf
# 如果不使用IPv6,请修改为*
listen = *
vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login
vi /etc/dovecot/conf.d/10-master.conf
# Postfix smtp验证
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
# 重启postfix 和 dovecot
sudo postfix reload
systemctl restart dovecot
生成TLS
下载openssl来生成自证书
sudo apt-get install openssl
mkdir /usr/local/postfix-ssl
cd /usr/local/postfix-ssl
# 生成秘钥
openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048
# 生成证书签发请求
openssl req -new -key private.key -out cert.csr
# 生成自签名证书
openssl x509 -req -days 365 -in cert.csr -signkey private.key -out certificate.pem
Postfix配置TLS证书
vim /etc/postfix/main.cf
# 文件最下面添加
smtp_tls_note_starttls_offer = yes
smtpd_tls_received_header = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# TLS
smtpd_tls_cert_file = /usr/local/postfix-ssl/certificate.pem
smtpd_tls_key_file = /usr/local/postfix-ssl/private.key
smtpd_tls_security_level = may
smtp_tls_CApath= /usr/local/postfix-ssl/cert.csr
smtp_tls_security_level = may
启动SMTPS服务
打开master.cf文件添加以下配置
vim /etc/postfix/master.cf
smtps inet n - n - - smtpd
重启postfix
sudo postfix reload
踩坑提示
由于有很多服务器供应商都不开放25端口出去使用,这里我们需要测试一下当前的服务器是否可以使用25端口
nmap 域名
我使用了另一台服务器测试当前的25端口,发现是关闭的,这里我们需要为smtp增加两个端口
我这里将普通请求使用587端口,TLS请求使用465端口
1.修改postfix的配置文件
# 打开master.cf文件增加一个smtp2
vim /etc/postfix/master.cf
smtp2 inet n - n - - smtpd
2.修改/etc/services文件,增加smtp2和smtps监听端口
vim /etc/services
smtp2 587/tcp mail2
smtp2 587/udp mail2
smtps 465/tcp mail3
smtps 465/udp mail3
3.重启postfix
sudo postfix reload
测试邮件
1.创建测试用户
useradd -g 2333 -s /sbin/nologin -M user1
useradd -g 2333 -s /sbin/nologin -M user2
2.设置密码,敲下面命令回车后输入两次密码即可
passwd user1
passwd user2
3.我这里使用python来进行测试
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
def sendmail(email_, header, content):
from_addr = 'user1@kdac.top'
passwd = '123456'
# 邮件内容
message = MIMEMultipart()
message.attach(MIMEText(content, 'plain', 'utf-8'))
# 设置发件人和主题
message['From'] = f'user1<{from_addr}>' # 发件人
message['To'] = email_ #
message['Subject'] = Header(header, 'utf-8') # 主题
message['Date'] = formatdate(localtime=True)
smtp = smtplib.SMTP("mail.kdac.top", 587) # 创建安全的smtp对象,依赖smtp服务器的安全配置
smtp.login("user1", passwd)
# smtp.login(from_addr, passwd)
smtp.sendmail(from_addr, to_addrs=email_, msg=message.as_string())
smtp.quit()
content = '''
我想吃个肯德基
'''
sendmail('xxxxx@qq.com','认识你真好,V我50',content)
收到短信说明已经配置完毕
DKIM
由于Google邮箱相关的平台,需要验证Message-ID,我们得需要加固认证,我这里使用的是Postfix + Opendkim
1.安装opendkim
# 安装opendkim依赖环境
sudo apt-get install libmilter-dev libssl-dev libbsd-dev -y
mkdir /usr/local/dkim
cd /usr/local/dkim
wget https://onboardcloud.dl.sourceforge.net/project/opendkim/opendkim-2.10.3.tar.gz
tar -xvf opendkim-2.10.3.tar.gz
cd opendkim-2.10.3
# 构建
./configure --with-openssl=/usr/bin/openssl --disable-shared
# 安装
make && make install
2.配置opendkim
域名更改成自己的域名
mkdir /etc/opendkim/keys/域名 -p
mkdir /var/run/opendkim/ -p
新增以下文件配置
vim /etc/opendkim.conf
AutoRestart Yes
AutoRestartRate 10/1h
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
LogWhy Yes
MinimumKeyBits 1024
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SigningTable refile:/etc/opendkim/SigningTable
Socket inet:15151@localhost
Syslog Yes
SyslogSuccess Yes
LogWhy Yes
TemporaryDirectory /var/tmp
UMask 022
UserID opendkim:opendkim
vim /etc/opendkim/TrustedHosts
*
vim /etc/opendkim/KeyTable
域名更改为自己的域名
域名._domainkey.域名 域名:default:/etc/opendkim/keys/域名/域名.private
vim /etc/opendkim/SigningTable
域名更改为自己的域名
*@域名 域名._domainkey.域名
2.配置postfix
vim /etc/postfix/main.cf
# milter
smtpd_milters = inet:localhost:15151
non_smtpd_milters = inet:localhost:15151
internal_mail_filter_classes = bounce
milter_protocol = 6
milter_default_action = accept
3.生成秘钥
将域名改为自己的域名
opendkim-genkey -D /etc/opendkim/keys/kdac.top/ -d kdac.top -s kdac_top #生成随机密钥
# 添加一个用户,不属于任何
useradd -s /usr/sbin/nologin opendkim
chown opendkim.opendkim /etc/opendkim -R
chown opendkim.opendkim /etc/opendkim.conf
4.将opendikm配置成service
vim /etc/systemd/system/opendikm.service
[Unit]
Description=OpenDKIM DomainKeys Identified Mail (DKIM) Milter
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/sbin/opendkim -Dx /etc/opendkim.conf
ExecReload=/bin/kill -USR1 $MAINPID
ExecStop=/bin/kill -15 $MAINPID
[Install]
WantedBy=multi-user.target
5.配置DNS TXT记录
cat /etc/opendkim/keys/kdac.top/kdac_top.txt
主机记录:kdac_top._domainkey ,上图文中的内容。
记录值:上图所示()里的内容,记得把换行符删掉,双引号不要,分号保留。
6.重启postfix
sudo systemctl daemon-reload
sudo systemctl enable opendkim
sudo systemctl start opendkim
sudo postfix reload