【IT168微软云计算博客征文活动专稿】
背景:电子邮件和Windows Azure
发送电子邮件比你想象的要复杂得多,直接从云,如Windows Azure中发送邮件的挑战更大,因为你没有一个专用IP地址,并且垃圾邮件发送者可以使用Windows Azure发送大量的垃圾邮件,如果那样,垃圾邮件黑名单很快就会将Windows Azure数据中心的IP地址范围列为垃圾邮件源,这意味着以后合法的邮件也将被列为垃圾邮件。
解决这个挑战最好的办法是禁止直接使用Windows Azure发送邮件,所有邮件全部使用第三方SMTP服务发送(如 SendGrid 或 AuthSMTP ),它们一般都有自己的反垃圾邮件规则和独立的IP地址。
注意接收邮件与发送邮件完全不是一回事,只要你在Windows Azure中监听了SMTP 25端口,你就会接收到人家发给你的邮件。
使用第三方服务发送邮件
首先我在 SendGrid 免费注册了一个账号,免费账号每天可以发送200封邮件,但许多高级功能不能使用,如果你打算成为付费用户,我建议你购买银级版本。
图 1 SendGrid 邮件服务的五种版本
快速注册后,需要完善一下账号和相关配置信息。
图 2 账号信息
实际上使用 System.Net.Mail 命名空间发送邮件是相当简单的,下面就是发送邮件的代码:
var reply = new MailMessage(RoleEnvironment.GetConfigurationSettingValue("EmailAddress"),
msg.FromAddress)
{
Subject = msg.Subject.StartsWith("RE:", StringComparison.InvariantCultureIgnoreCase)
? msg.Subject : string.Format("RE: " + msg.Subject),
Body = body,
IsBodyHtml = msg.HasHtmlBody // send HTML if we got HTML
};
if (!reply.IsBodyHtml) reply.BodyEncoding = Encoding.UTF8;
// make it a proper reply
reply.Headers["References"] = msg.MessageID;
reply.Headers["In-Reply-To"] = msg.MessageID;
// use our SMTP server, port, username, and password to send the mail
(new SmtpClient(RoleEnvironment.GetConfigurationSettingValue("SmtpServer"),
int.Parse(RoleEnvironment.GetConfigurationSettingValue("SmtpPort")))
{
Credentials = new NetworkCredential(RoleEnvironment.GetConfigurationSettingValue("SmtpUsername"),
RoleEnvironment.GetConfigurationSettingValue("SmtpPassword"))
}).Send(reply);
msg.FromAddress)
{
Subject = msg.Subject.StartsWith("RE:", StringComparison.InvariantCultureIgnoreCase)
? msg.Subject : string.Format("RE: " + msg.Subject),
Body = body,
IsBodyHtml = msg.HasHtmlBody // send HTML if we got HTML
};
if (!reply.IsBodyHtml) reply.BodyEncoding = Encoding.UTF8;
// make it a proper reply
reply.Headers["References"] = msg.MessageID;
reply.Headers["In-Reply-To"] = msg.MessageID;
// use our SMTP server, port, username, and password to send the mail
(new SmtpClient(RoleEnvironment.GetConfigurationSettingValue("SmtpServer"),
int.Parse(RoleEnvironment.GetConfigurationSettingValue("SmtpPort")))
{
Credentials = new NetworkCredential(RoleEnvironment.GetConfigurationSettingValue("SmtpUsername"),
RoleEnvironment.GetConfigurationSettingValue("SmtpPassword"))
}).Send(reply);