• ASP.NET MVC 发送邮件(异步)


    最近写邮件发送搞死人了,最后的结果,真是醉了,现整理如下:

    网上一搜一大把,到处都是.NET发送邮件的方法,我这里也大同小异的写了一个。

    准备一个MailHelper.cs通用类,如下所示:

    重要的命名空间:

    using System.Net;
    using System.Net.Mail;

    其余代码如下:

    public void Send(string to, string subject, string content, string from, string name, string password)
    {
        // 构造邮件体(按照常规构造即可)
        var mail = new MailMessage();
        mail.From = new MailAddress(from.Trim(), name.Trim(), Encoding.UTF8);
        mail.To.Add(new MailAddress(to.Trim()));
        mail.Subject = subject.Trim();
        mail.SubjectEncoding = Encoding.UTF8;
        mail.Body = content.Trim();
        mail.BodyEncoding = Encoding.UTF8;
        mail.IsBodyHtml = true;
        mail.Priority = MailPriority.Normal;
    
        // 构造SMTP服务器(很重要!!!)
        var client = new SmtpClient();
        client.UseDefaultCredentials = true;   // 在最终发送成功的代码中,本属性必须在 Credentials 之前赋值
        client.Credentials = new NetworkCredential(from, password);   // 本属性必须在 UseDefaultCredentials 之后赋值
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.Host = "SMTP 服务器 IP 或 域名";
        client.Port = 25;   // 注意打开系统防火墙相应的端口
        //client.EnableSsl = true;   // 要看 SMTP 服务器是否支持
        client.SendCompleted += SMTPSendCompleted;   // 邮件发送完毕的回调方法
    
        try
        {
            client.SendAsync(mail, Guid.NewGuid());
        }
        catch (Exception e)
        { }
    }
    
    private void SMTPSendCompleted(object sender, AsyncCompletedEventArgs e)
    {
        var result = string.Empty;
    
        if (e.Cancelled)
        {
            result = "已取消发送邮件";
        }
        else if (e.Error != null)
        {
            result = "失败:" + e.UserState.ToString() + e.Error.Message;
        }
        else
        {
            result = "邮件发送成功";
        }
    
        // 记录 result
    }

    上面就是一个发送邮件的通用类。

    特别需要注意的就是:在实例化 SMTP 服务器属性的时候,顺序很重要!!!

    下面在页面的 Controller 里面写具体调用的方法。

    注意,一定要采用异步的方式来发送,我这里用的是 asyncawait 方式来写(采用这个方式来写,至少在页面上就不用添加 async = true 等代码了,其它多的就不说了)具体的 Action 代码如下:

    public async Task<ActionResult> SendEmail()
    {
        ViewBag.Title = "发送邮件";
    
        // 异步发送邮件
        await Task.Run(() => { new MailHelper().SendByAccount("{收件人邮箱地址}", "测试邮件标题", "测试邮件内容,测试邮件内容"); });
    
        return View();
    }

    至此,邮件发送的全部功能就实现了,并且已经成功发送了。

    网上到处都有,但是都没有提到 SMTP 服务属性赋值时有顺序的问题,不知道是不是我的代码有问题,才会有顺序的问题,这里先记录下来,后面再看吧。

    总之,我是在本机上和服务器上面测试通过了。

    开发环境:Win 7 Pro 64(本机)+ VS2013 + .NET Framework 4.6 + MVC 5.2.3.0

    发布环境:Win 2008 R2 SP1 Ent(服务器)+ IIS + .NET Framework 4.6

    SMTP:阿里云邮(原万网企业邮件)

    收件人:163、qq、sina、gmail,全部测试成功!

  • 相关阅读:
    工作流程在线编辑
    利用IIS导出,导入快速部署 web站点
    调用CRM自己的Dialogue
    简单粗爆的解决同时布CRM引起的死锁问题
    CRM 2013 自动发送报表
    CRM 2013 中业务流程的
    调试CRM JS开发
    CRM ribbon按钮上引用JS库
    CRM Look Up 解决方案
    Windows Azure 上传 VM
  • 原文地址:https://www.cnblogs.com/jacksonwj/p/5033234.html
Copyright © 2020-2023  润新知