• 使用C#发送电子邮件


    前几天学生问怎样用C#发送电子邮件,网上文章很多,随手找了一篇,给学生,让他自己去看下。结果,搞了一天没有搞定,只好来仔细看一下。用C#发送电子邮件,网上介绍的很多文章都是使用SmtpClient,也有System.Web.Mail ,但是,System.Web.Mail 已经是不推荐使用的了。以下是在网上常见的一种发送电子邮件的代码:

     1MailMessage MyEmilMessage=new MailMessage();
     2string attachFile;        //用于构造附件的字符串变量
     3
     4MyEmailMessage.From="Writer@sadf.com";
     5MyEmailMessage.To="Geter@dff.com;tome@asd.com";
     6MyEmailMessage.Subject="邮件发送的一个简单例子";
     7MyEmailMessage.body="猫王呼叫耗子,收到请回答!!!";
     8MyEmailMessage.BodyFormat=MailFormat.Text;
     9MyEmailMessage.Priority=MailPriority.High;
    10
    11//构造添加附件
    12attachFile=@"D:\test\test.txt";
    13MailAttachment mailAttach=new MailAttachment(attachFile);
    14MyEmailMessage.Attachments.Add(mailAttach);
    15
    16//发送电子邮件
    17SmtpMail.SmtpServer="发送电子邮件的SMTP地址或者IP";// 指定smtp服务器
    18SmtpMail.Send(MyEmailMessage);//发送电子邮件
    19

    这些代码基本上都没有任何错误,编译也都会通过,但是,如果使用这种方式发送,基本上可以保证,你的电子邮件发送不成功。然后,这里是缺少身份验证,而且比较麻烦就是这个身份验证。下面是我给学生写的一个示例:

     1           string mailContent="邮件内容";
     2
     3            MailMessage msg = new System.Net.Mail.MailMessage();
     4            msg.To.Add("******@gmail.com"); //收件人
     5
     6            //发件人信息
     7            msg.From = new MailAddress("*****@gmail.com""发送人姓名", System.Text.Encoding.UTF8);
     8            msg.Subject = "这是测试邮件";   //邮件标题
     9            msg.SubjectEncoding = System.Text.Encoding.UTF8;    //标题编码
    10            msg.Body = mailContent; //邮件主体
    11            msg.BodyEncoding = System.Text.Encoding.UTF8;
    12            msg.IsBodyHtml = true;  //是否HTML
    13            msg.Priority = MailPriority.High;   //优先级
    14
    15            SmtpClient client = new SmtpClient();
    16            //设置GMail邮箱和密码 
    17            client.Credentials = new System.Net.NetworkCredential("帐号@gmail.com""密码");
    18            client.Port = 587;
    19            client.Host = "smtp.gmail.com";
    20            client.EnableSsl = true;
    21            object userState = msg;
    22            try
    23            {
    24                client.Send(msg);
    25                MessageBox.Show("发送成功");
    26            }

    27            catch (Exception ex)
    28            {
    29                MessageBox.Show(ex.Message, "发送邮件出错");
    30            }
     
    31

    这里的重点是邮箱身份验证那个地方,一定不能写错,否则,邮件发送不出去。到这里,似乎是大功告成了,但是,你会发现,相同的程序,在某些机器上可以发送成功,在某些机器上发送总是失败,是系统的原因?似乎不是,因为相同的系统,也是有的发送成功,有的发送失败。那是,框架的原因?似乎也不是。
    这里就有一个很令人迷惑的现象出现,同样的系统,同样的框架,还是有的能发送成功,有的发送失败。失败的具体原因说是邮件标头编码有错误。那么,我们去掉Subject,不写,用默认的可以吗?也是一样的。这个问题很见鬼,于是使用EtherPeek进行抓包,发现了一个有趣的现象,这里有一个很重要的包:

    这里要注意的是红色划线的地方,“EHLO xqxPC”,我的机器名就是xqxPC,问题就在这里啦,SmtpClient发送电子邮件的时候,需要发送一条EHLO指令到邮件服务器,参数是机器名,如果机器名使用中文,就发送不成功了。



    简单总结一下:
    1、使用SmtpClient发送电子邮件是很简单的,只要正确创建了MailMessage对象和SmtpClient就可以很容易的发送出去电子邮件。
    2、如果电子邮件服务器需要身份验证【似乎现在都需要身份验证,除非自己配置的】,注意下面这句话:
    smtpClient.Credentials = new System.Net.NetworkCredential("帐号@gmail.com", "密码");
    3、机器名不能使用中文。
    PS:为什么这样一篇文章也有人反对呢?Why?莫非以后不能在这里写东西啦?呵呵……,一直在犹豫要不要在这里开博,继续犹豫吧……
  • 相关阅读:
    JVM调优-Java中的对象
    Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
    Navicat for MySQL 64位破解版
    Idea详细配置
    数据库--悲观锁【收藏,待尝试】
    性能问题分析
    java 反射机制之 getDeclaredMethod()获取方法,然后invoke执行实例对应的方法
    Mysql show indexes 查看索引状态
    基于(Redis | Memcache)实现分布式互斥锁
    彻底解决每次打开visio都提示windows正在配置visio的问题
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1539855.html
Copyright © 2020-2023  润新知