最近有一個程序的郵件通知功能出問題了。自己搭建郵件服務器雖然不難,但是可靠性很難保證,郵件發送功能的服務化是趨勢,看到阿里雲正在公測郵件推送服務,正好借遇到郵件發送問題的機會試用一下,看能否解決我們的實際問題。
首先在阿里雲郵件推送控制台添加域名,然后在自己的dns服務器中添加如下的解析(根據控制台中的“配置”):
- 一個主機名為aliyundm的TXT記錄,用於驗證域名所有權
- 一個主機名為空、值為
v=spf1 include:spf1.dm.aliyun.com -all
的TXT記錄,用於防止被當作垃圾郵件 - 一個MX記錄
在mac上可以通過nslookup -query=TXT 域名
與nslookup -query=MX 域名
命令查看DNS設置是否生效。
接着在阿里雲控制台驗證一下域名,驗證成功之后,添加一下發信地址(發件地址),並設置一下SMTP密碼。
然后通過下面的C#代碼使用阿里雲郵件推送服務的SMTP就可以發送郵件了。
var mailMsg = new MailMessage();
mailMsg.From = new MailAddress("控制台創建的發信地址", "顯示名稱");
mailMsg.To.Add("收件人郵箱");
mailMsg.Subject = "Hello aliyun dm";
mailMsg.Body = "Send from aliyun dm";
mailMsg.IsBodyHtml = true;
var smtp = new SmtpClient("smtp.dm.aliyun.com", 25);
smtp.Credentials = new NetworkCredential("控制台創建的發信地址", "SMTP密碼");
smtp.Send(mailMsg);
很輕松地解決了郵件發送問題。
[2016-7-9更新]
在.NET Core中使用MailKit通過阿里雲郵件推送服務(directmail)發送郵件的C#代碼:
private static async Task SendEmailAsync(
string fromName, string fromEmail,
string toName, string toEmail,
string title, string body)
{
var mailMessage = new MimeMessage();
mailMessage.From.Add(new MailboxAddress(fromName, fromEmail));
mailMessage.To.Add(new MailboxAddress(toName, toEmail));
mailMessage.Subject = title;
mailMessage.Body = new TextPart("plain") { Text = body };
using (var smtpClient = new SmtpClient())
{
await smtpClient.ConnectAsync("smtp.dm.aliyun.com", 25, SecureSocketOptions.None).ConfigureAwait(false);
smtpClient.Authenticate(new NetworkCredential("username", "password"));
await smtpClient.SendAsync(mailMessage).ConfigureAwait(false);
await smtpClient.DisconnectAsync(true).ConfigureAwait(false);
}
}
但使用上面的代碼發送郵件時,阿里雲郵件推送服務會返回錯誤"503 Bad sequence of commands",詳見 http://q.cnblogs.com/q/84031/
這個問題是MailKit的問題,詳見 解決.NET Core中MailKit無法使用阿里雲郵件推送服務的問題