使用iRedMail 在阿里云上搭建邮件服务器

本地部署
  • 先本地环境部署:
  1. docker run --privileged -p 80:80 -p 443:443 \
  2. -e "DOMAIN=fen.com" -e "HOSTNAME=mail" \
  3. -e "MYSQL_ROOT_PASSWORD=123456" \
  4. -e "SOGO_WORKERS=1" \
  5. -e "TZ=Asia/Shanghai" \
  6. -e "POSTMASTER_PASSWORD={PLAIN}hello123456" \
  7. -e "IREDAPD_PLUGINS=['reject_null_sender', 'reject_sender_login_mismatch', 'greylisting', 'throttle', 'amavisd_wblist', 'sql_alias_access_policy']" \
  8. -v /www/redmail/mysql:/var/lib/mysql \
  9. -v /www/redmail/vmail:/var/vmail \
  10. -v /www/redmail/clamav:/var/lib/clamav \
  11. --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; (这里端口映射重要)
  • 域名解析增加如下解析:
  1. 主机记录 记录类型 记录值
  2. @ MX mail.fen.com
  3. 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
  1. apt-get update
  2. apt install libsasl2-modules
  • 然后到 https://www.mailjet.com 注册下;获取stmp relay 接口所需要使用的server host,port,api key,api secret;
  • 进行容器,对postfix进行配置:
  1. vim /etc/postfix/main.cf (增加一下信息)
  2. relayhost = in-v3.mailjet.com:587 (域名和port以注册mailjet获取的为准)
  3. smtp_sasl_auth_enable = yes
  4. smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
  5. smtp_sasl_security_options = noanonymous
  6. smtp_tls_security_level = may
  7. header_size_limit = 4096000
  8. vim /etc/postfix/sasl_passwd (增加以下信息)
  9. in-v3.mailjet.com:587 api-key:secret-key (这里以mailjet获取的keysecret为准)
  10. postmap /etc/postfix/sasl_passwd (自动生成 /etc/postfix/sasl_passwd.db)
  11. chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db (让所有用户可以读写)

参考的资料