本文分享了如何搭建邮箱服务器以及发送通知类邮件

1. 选型

针对不同的发送邮件需求,有不同的方案选择

  1. 少量系统邮件发送,可寻找邮箱服务商,设置开启smtps等服务发送,一般会有条数等限制,如每日500条
  2. 云服务,如aws的ses服务可以提供发送邮件服务,使用aws sdk或者smtps调用,申请比较费劲
  3. 自己搭建邮箱服务器,需自己机房或者计算机搭建,不能使用云服务器,如aws,申请开端口比ses更加费劲
  4. 搭建服务器可以使用postfix + Dovecot + Roundcube或者是iRedMail。推荐使用iRedMailiRedMail集成了这些组件。前一种方法需要自己部署的组件,证书太多,无用功太多。

简单的说,需要有一个完整的域名并使用非云服务器完成以下三步即可完成邮件服务器的搭建,其他问题也可以参考iRedMail文档

  • Install iRedMail ,查看iRedMail官方的文档完成安装
  • iRedMail是自己生成的ssl证书,手动替换一下
  • Setup DNS ,DNS(A, PTR, MX, SPF, DKIM, DMARC)的设置很重要,使邮件安全,并不会被视为垃圾,欺诈邮件。

2. 邮箱服务搭建

以下环境是使用的Ubuntu24,使用的域名是mail.sevndata.com,发邮件的邮箱地址是nepoly@sevndata.com

  1. 为服务器设置一个完整域名(FQDN)的主机名
  • 查看主机名

    hostname -f
  • 修改主机名

    • 修改/etc/hostname

      mail
    • 修改/etc/hosts

      127.0.0.1   mail.sevndata.com mail localhost localhost.localdomain
    • 重启

      reboot
  1. 更新apt安装targzip
    sudo apt-get install tar gzip
  2. 下载iRedMail软件包下载页面,并上传到服务器,解压,进入目录
    tar zxf iRedMail-1.7.1.tar.gz
    cd iRedMail-1.7.1
  3. 执行iRedMail安装脚本
    bash iRedMail.sh
  4. 弹出安装界面
    • 欢迎界面,按Enter确认
    • 存储用户邮箱地址默认/var/vmail,可选修改并确认
    • 指定web容器,可选nginx
    • 指定数据库,可选mysql空格选择,Enter确认
    • 如果选择mysql输入密码
    • 输入域名
    • 设置总管理密码也就是postmaster@sevndata.com的密码
  5. 安装成功提示web访问目录等内容,也可以访问iRedMail.tips查看,需要先看第七步安装自己的ssl证书
    https://mail.sevndata.com/iredadmin/ #iRedAdmin的管理端admin界面,用户postmaster@sevndata.com
    https://mail.sevndata.com/mail/ #Roundcube的web界面,可在admin创建邮箱用户在这里登录收发邮件
    https://mail.sevndata.com/netdata/ #netdata服务器监控界面,用户postmaster@sevndata.com
  6. 安装ssl证书,重启
    #iRedMail生成的证书备份
    mv /etc/ssl/certs/iRedMail.crt{,.bak}
    mv /etc/ssl/private/iRedMail.key{,.bak}
    #把自己的证书替换过来
    cp /nginx_web/mail.sevndata.com/cert/private.key /etc/ssl/private/iRedMail.key
    cp /nginx_web/mail.sevndata.com/cert/fullchain.cer /etc/ssl/certs/iRedMail.crt
  7. 其他一些操作,iRedMail集成了这些组件,所以可以单独管理这些组件
    systemctl restart nginx #stop start status
    systemctl restart postfix
    systemctl restart dovecot.service
    systemctl restart mariadb.service
    systemctl restart iredapd.service

3. DNS配置

这个步骤很重要,以域名mail.sevndata.com,ip是111.111.111.111为例

  1. 添加A记录

    A   mail    111.111.111.111 
  2. 在你的域名服务商添加prt记录,将域名映射到 IP 地址是正向解析,反向解析是从 IP 地址到域名的映射

  3. 添加MX记录

    MAX    sevndata.com    mail.sevndata.com
  4. 设置autodiscover

  5. 添加SPF记录,发出邮件的服务器ip

    TXT    sevndata.com    v=spf1 ip4:111.111.111.111 -all
  6. 添加DKIM记录

    • 执行命令显示DKIM KEY
      amavisd showkeys
      amavisd-new showkeys #有些系统用的这个,上面那个不能用可以用这个
      amavisd-new testkeys #测试key,测试通过显示pass
    • 拷贝显示的key,组成DKIM记录,并添加到DNS中
      TXT     dkim._domainkey v=DKIM1; p=MIIBdsadsadsadsa
  7. 添加DMARC记录

    rua,ruf等具体配置可以看Setup DNS

    TXT    _dmarc    v=DMARC1; p=reject; rua=mailto:support@sevndata.com; ruf=mailto:support@sevndata.com
  8. 如果你安装了Prosody作为Jabber/XMPP服务,你还需要配置_xmpp-client,_xmpp-server,不需要就忽略,步骤二和四需要域名服务商,可以先忽略,尝试测试是否正常

4. 调用测试

  1. 测试

    • 在管理端web上添加测试邮箱用户
    • 在邮件收发web上登录测试邮箱用户,测试邮件收发是否正常
  2. 调用

    package api_libUtils
    
    import (
    "crypto/tls"
    "github.com/jordan-wright/email"
    "net/smtp"
    )
    
    func SendMail(subject string, mail string, context string) error {
        mailUserName := "noreply@sevndata.com"
        mailPassword := "password"
        addr := "mail.sevndata.com:465"
        host := "mail.sevndata.com"
        e := email.NewEmail()
        e.From = "Sevndata Mail Center<noreply@sevndata.com>"
        e.To = []string{mail}
        e.Subject = subject
        e.HTML = []byte(context)
        err := e.SendWithTLS(addr, smtp.PlainAuth("", mailUserName, mailPassword, host),
        &tls.Config{InsecureSkipVerify: true, ServerName: host})
    return err
    }
  3. 其他一些内容

    允许用户无需身份验证发送邮件