使用Azure通信服务(Communication Service)使用SMTP发送电子邮件
About
目前几个大厂提供了邮件发送服务,就是可以使用自己的域名发送邮件,目前AWS SNS(
Simple Notification Service)比较复杂,而且风控比较严格,还需要发工单才能提升配额,要么使用AWS Workmail单用户(4 USD/月)。而且滥用价格直接爆炸,不是特别推荐,这几天逛服务看到了Azure的communication service提供邮件发送服务,不提供接收邮件,但是可以使用CloudFlare的邮件转发来收取邮件,发送邮件价格(0.00025USD/email),也发不了几封邮件其实也无所谓,基本等于免费,但是注意有发送频率的限制,还有一些坑。
1.创建资源
有两个一个是通信服务,另一个是电子邮件通信服务,直接在Azure搜索就能搜索到这两个资源
2.创建资源
没有坑,选自资源组和资源名称就可以,按步骤深渊并创建
3.点开创建的"电子邮件通信服务资源"选择预配域(zH-ms流汗黄豆)
导航到添加域-> 自定义域
添加完会让你验证域名所有权,你需要按步骤在DNS托管商添加记录,一共是4个,首先是所有权认证,添加一个TXT记录类似“ms-domain-verification=xxxxxx”,这个一般很快就生效。
接下来是大头三个记录有个大坑分别是(SPF, DKIM, DKIM2)
SPF很简单直接添加TXT记录类似"sales.us.notification.azurecommtest.netv=spf1" "include:spf.protection.outlook.com -all"
DKIM有个大坑,如果你使用三级域名(xxx.sni.com)CNAME接入Azure,你需要在原本“selector1-azurecomm-prod-net._domainkey”后面添加
.xxx,变成“selector1-azurecomm-prod-net._domainkey.xxx”
Azure才会认为你的记录有效,DKMI2同理,等待几分钟,应该就全绿了。
4.添加别名
导航到通信服务的资源下会多出一个资源“电子通信服务域”->MailFrom address
你会发现这里的+Add按钮是灰色,这是Azure限制了直接添加,但是可以用Cloudshell添加目前没有限制,以后不知道会不会限制。
命令格式:
az communication email domain sender-username create --email-service-name "<资源名称>" --resource-group "<资源组名称>" --domain-name "<域名>" --sender-username "<别名@前>" --username "<别名@前>" --display-name "<收件人显示的名称>"
如果没有报错并返回一个JSON显示Successful则添加成功。
5.测试电子邮件
导航到通信服务创建的资源,在你的资源组下可以找到,导航到“电子邮件”->"使用电子邮件"
接下来是重头戏(配置SMTP中继)
因为Azure这一套玩意微软也没有一个标准,使用SMTP发信非常复杂。
## 新建一个应用程序(不是企业应用程序)
为了方便你我直接放链接https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps
1.路径Microsoft Entar ID -> 应用程序注册 -> 新注册
不需要变更什么东西,只需要选一个名称,这个app负责账户验证。
需要你记住应用程序(客户端)ID和目录(租户)ID后面需要用
导航到证书和密码->客户端密码->新建客户端密码
记住值Value,后面需要用
打开你的Azure订阅
<https://portal.azure.com/#view/Microsoft_Azure_Billing/SubscriptionsBladeV2>
你的订阅-> 访问控制(标识和访问管理) 英文叫IAM ->添加自定义角色
名字随意,权限选择克隆角色,克隆对象读者(Reader)~~我真服了Azure这个垃圾翻译
权限只需要这两个
添加-> 添加角色分配
搜索你刚刚添加角色的名称,点下一步成员,选择成员搜索你刚刚创建的应用程序名称,不要理会提示,选择应用,最后审阅分配。
随便找个支持smtp的应用测试发送邮件,我这里用RouterOS自带的Email功能
服务器地址:smtp.azurecomm.net
端口:587
TLS:允许加密
用户名:通信服务资源名称 . 应用程序(客户端)ID . 目录(租户)ID (这里使用英文句号分开,不需要空格)</br>
密码:App创建的密码值Value
理论上就可以发送成功了