zoukankan      html  css  js  c++  java
  • 试用阿里云邮件推送服务

    最近有一个程序的邮件通知功能出问题了。自己搭建邮件服务器虽然不难,但是可靠性很难保证,邮件发送功能的服务化是趋势,看到阿里云正在公测邮件推送服务,正好借遇到邮件发送问题的机会试用一下,看能否解决我们的实际问题。

    首先在阿里云邮件推送控制台添加域名,然后在自己的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无法使用阿里云邮件推送服务的问题

  • 相关阅读:
    SQL创建索引
    SQLServer最耗资源时间的SQL语句
    C# Linq删除父级的同时删除子级
    C# 根据类名创建类的实例对象
    C#利用反射实现两个类的对象之间相同属性的值的复制
    linq时间筛选以及list时间筛选
    为什么watch机制不是银弹?
    我们的前端模版引擎更新总结
    小矮人Javascript模块加载器
    Javascript模版引擎简介
  • 原文地址:https://www.cnblogs.com/dudu/p/5099621.html
Copyright © 2011-2022 走看看