最近想搭建一个个人邮箱,结果发现vps服务商把25端口的出站封掉了,但是入站还没封。想起自己有Azure的学生订阅,就打算用Azure Email Communicate Service来作为SMTP服务器。

发件服务器搭建

添加ECS和域名

首先,打开Azure,创建一个Email Communicate Service资源,在设置->预配域中添加你的域名

在DNS里面添加用于验证的TXT记录,验证成功后,就可以添加SPF和DKIM记录了

在Domain Status下面点Configure或者配置,添加一个SPF(TXT记录)和两个DKIM(CNAME记录),确认之后状态变成已验证就好了

为了让收件方知道我们有SPF和DKIM,避免域名伪造,可以设置一个DMARC记录,像这样

参数p代表邮件放行,隔离或者拒绝,如果确认有人伪造发件,可以将其设为reject,这里我设成none,代表放行所有。

在ACS内关联ECS

在Azure中,新建ACS(通信服务)资源,在电子邮件->域中点连接域,选择刚刚添加的域名,这里大概就可以发信了,点击试用电子邮件,给自己发一封邮件试下(虽然大概率在垃圾箱)

添加用于SMTP的身份验证

在ACS的访问控制里,点击角色,克隆一个读者,把他的权限改成CommunicateServices/Read和EmailServices/Write,之后点击创建

进入Microsoft Entra,确保你是(全局)管理员角色,点击应用程序->应用注册->新注册,注册几个应用。这里我注册了wordpress用于博客发邮件和personalClient用于在手机上发送邮件。重定向URI可以为空,受支持的账户类型选择仅此组织目录就好。

点击你创建好的应用,转到证书和密码,新建一个客户端密码。回到ACS的访问控制,给刚刚注册的应用程序分配上刚才创建的角色。

这个时候已经可以发件了,服务器信息如下

Hostsmtp.azurecomm.net
Port587
TLS / StartTLSEnabled
Username<ACS资源的名称>.<应用程序的应用程序(客户端)ID>.<应用程序的目录(租户)ID>
Password创建的客户端密码
SMTP连接信息

配置MailFrom

可现在我们还只能通过DoNotReply@exmale.com发信。在Powershell或者随便什么你喜欢的能连的上Azure的命令行里面,执行

New-AzEmailServiceSenderUsername -ResourceGroupName 资源组名称 -EmailServiceName ECS资源名称 -SenderUsername 发送者用户名 -Username 和SenderUsername一样 -DisplayName 收件时候显示的名字

就像这样

现在就可以用<SenderUsername>@example.com发送邮件啦

收件服务器搭建

DNS配置

新建一个MX记录

数据库配置

参考:超完整详细的Postfix Dovecot电子邮件服务器配置指南

由于收件箱是采用了虚拟用户,所以要有一个Database来存用户信息

先创建一个mailuser给dovecot访问db使用

GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'password';

之后进入到mailserver数据库中,创建虚拟用户表

CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

添加用户

INSERT INTO `mailserver`.`virtual_users`
  (`id`, `domain_id`, `password` , `email`)
VALUES
  ('1', '1', ENCRYPT('password114', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'me@example.com'),
  ('2', '1', ENCRYPT('password514', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'wordpress@example.com');

Dovecot配置

安装dovecot

sudo apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

创建vmail用户和虚拟用户的邮箱

sudo mkdir -p /var/mail/vhosts/example.com
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail/
sudo chown -R vmail:vmail /var/mail/

配置服务和监听,编辑文件/etc/dovecot/dovecot.conf

protocols = imap pop3 lmtp
listen = *, ::

配置邮箱,编辑文件/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail

配置登录鉴权,编辑文件/etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
!include auth-sql.conf.ext

配置邮箱数据和用户数据,编辑文件/etc/dovecot/conf.d/auth-sql.conf.ext

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
 
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

配置SQL密码查询,创建/etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=sqlpassword
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

配置主配置文件/etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    #mode = 0666i
    mode = 0600
    user = postfix
    group = postfix
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}

配置SSL

生成证书

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install letsencrypt
letsencrypt certonly --standalone -d example.com

编辑SSL配置文件/etc/dovecot/conf.d/10-ssl.conf

ssl = required

ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pemssl_key = </etc/letsencrypt/live/example.com/privkey.pem

开放端口

POP3 110 POP3 SSL 995 IMAP 143 IMAP SSL 993

sudo ufw allow 110
sudo ufw allow 995
sudo ufw allow 143
sudo ufw allow 993

客户端登录

Email Address<SenderUsername>@example.com
Display NameMailFrom里的Display Name
Description随便填啦
IMAP Hostname你的域名
IMAP Port993
Port SecuritySSL
IMAP Username<SenderUsername>@example.com一样的
IMAP Password在SQL insert那会设置的密码
SMTP Hostnamesmtp.azurecomm.net
SMTP Port587
Port SecuritySTARTTLS
SMTP Username<ACS资源的名称>.<应用程序的应用程序(客户端)ID>.<应用程序的目录(租户)ID>
SMTP Password创建的客户端密码

恭喜,现在你应该能成功搭建自己的邮箱啦~~


D3bug the w0r1d