使用iRedMail 在阿里云上搭建邮件服务器
本地部署
- 先本地环境部署:
docker run --privileged -p 80:80 -p 443:443 \
-e "DOMAIN=fen.com" -e "HOSTNAME=mail" \
-e "MYSQL_ROOT_PASSWORD=123456" \
-e "SOGO_WORKERS=1" \
-e "TZ=Asia/Shanghai" \
-e "POSTMASTER_PASSWORD={PLAIN}hello123456" \
-e "IREDAPD_PLUGINS=['reject_null_sender', 'reject_sender_login_mismatch', 'greylisting', 'throttle', 'amavisd_wblist', 'sql_alias_access_policy']" \
-v /www/redmail/mysql:/var/lib/mysql \
-v /www/redmail/vmail:/var/vmail \
-v /www/redmail/clamav:/var/lib/clamav \
--name=iredmail lejmr/iredmail:mysql-0.9.7
tag使用的是mysql-0.9.7; 如果使用的是mysql-latest的话,在本地无法正常的运转起来;
- 本地部署完后,可以正常发邮件;因为本地没有对外固定ip;所以无法设置dns的mx记录,进行收邮件;
阿里云部署
- 阿里云使用k8s服务;把镜像push到阿里云ecr服务里面;
- 创建一个无状态的服务;数据卷映射到本地目录;
- 因为业务占用的内存比较大;这里设置了cpu:500m;内存2048M;
- 增加访问方式:端口映射对外暴露出:80:80;443:443; 587:587; 25:25; (这里端口映射重要)
- 域名解析增加如下解析:
主机记录 记录类型 记录值
@ MX mail.fen.com
mail A ip (增加端口映射后,就可以看到访问ip)
- 域名访问: mail.fen.com; 使用容器启动的设置的密码来登录;登录名: postmaster@fen.com 密码:容器启动的时候设置的密码来登录:hello123456
- 如果要增加邮箱账号,则访问: https://mail.fen.com/iredadmin ;使用postmaster@fen.com/hello123456 来登录;
- 登录 mai.fen.com 后,会经常碰到: Session invalid or expired (失效或者登录过期);原因主要是因为session的ip检测失败导致;修改为不检测
- 登录容器后;进入 cd /opt/www/roundcubemail; vim config/config.inc.php; 修改:$config[‘ip_check’] = false;
- 登录邮箱后,进行邮件发送;一直发送失败;因为在本地容器化是可以发送成功了,所以猜测代码是没问题,是云厂商的问题,telent smtp.163.com 25; 发现被屏蔽了 connect time out ; 无法连接上 25端口;
- 正常的邮件发送流程是这样子的; 客户端 ->(use 465 or 587 port)-> 源邮件服务器(xx@fen.com) ->(use 25 port)-> 目的地邮件服务器(dst@163.com)
- 问题出现在最后一层,就是云厂商封闭了出口的25端口;导致无法发送;
- 因为端口被封杀了,实际上是无解了,只能借助第三方的smtp relay服务来中转发送;
借助Mailjet 来进行邮件发送;
- https://www.mailjet.com 是一个邮件api服务,允许你使用587 端口和其对接,借助smtp relay的功能;进行中转;
- 首先你需要安装一下 postfix的辅助工具包libsasl2-modules
apt-get update
apt install libsasl2-modules
- 然后到 https://www.mailjet.com 注册下;获取stmp relay 接口所需要使用的server host,port,api key,api secret;
- 进行容器,对postfix进行配置:
vim /etc/postfix/main.cf (增加一下信息)
relayhost = in-v3.mailjet.com:587 (域名和port以注册mailjet获取的为准)
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
header_size_limit = 4096000
vim /etc/postfix/sasl_passwd (增加以下信息)
in-v3.mailjet.com:587 api-key:secret-key (这里以mailjet获取的key和secret为准)
postmap /etc/postfix/sasl_passwd (自动生成 /etc/postfix/sasl_passwd.db)
chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db (让所有用户可以读写)
- 把要发送的域名注册到 mailjet.com ;https://app.mailjet.com/account/sender
- 设置成功后,进行测试下,邮件发送,可以正常发送邮件;
- 注意,一天只能通过mailjet发送200封免费的邮件
- 来自 hidida 的的分享;引用请注明来自hidida的语雀:https://www.yuque.com/hidida
参考的资料
- 查看日志: tail -f /var/log/mail.log
- stmp relay; mailjet 配置:https://www.linuxbabe.com/mail-server/postfix-smtp-relay
- ip_check set 配置: https://github.com/roundcube/roundcubemail/issues/6617
- 查看端口情况: apt install net-tools; netstat -ntlp | grep ‘0.0’