最近想搭建一个个人邮箱,结果发现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的访问控制,给刚刚注册的应用程序分配上刚才创建的角色。
这个时候已经可以发件了,服务器信息如下
| Host | smtp.azurecomm.net |
| Port | 587 |
| TLS / StartTLS | Enabled |
| Username | <ACS资源的名称>.<应用程序的应用程序(客户端)ID>.<应用程序的目录(租户)ID> |
| Password | 创建的客户端密码 |
配置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 Name | MailFrom里的Display Name |
| Description | 随便填啦 |
| IMAP Hostname | 你的域名 |
| IMAP Port | 993 |
| Port Security | SSL |
| IMAP Username | <SenderUsername>@example.com一样的 |
| IMAP Password | 在SQL insert那会设置的密码 |
| SMTP Hostname | smtp.azurecomm.net |
| SMTP Port | 587 |
| Port Security | STARTTLS |
| SMTP Username | <ACS资源的名称>.<应用程序的应用程序(客户端)ID>.<应用程序的目录(租户)ID> |
| SMTP Password | 创建的客户端密码 |
恭喜,现在你应该能成功搭建自己的邮箱啦~~






Comments | NOTHING