使用c#操作邮箱
网上翻了一下资料,基本上用到了System.Net.Mail里的System.Web.Mail.SmtpClient和System.Web.Mail.MailMessage两个类
- System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
- msg.To.Add(a@a.com); //to:收信地址
- /*
- * msg.To.Add("b@b.com");
- * msg.To.Add("b@b.com");
- * msg.To.Add("b@b.com");可以发送给多人
- */
- msg.CC.Add(c@c.com); //抄送地址
- /*
- * msg.CC.Add("c@c.com");
- * msg.CC.Add("c@c.com");可以抄送给多人
- */
- msg.From = new MailAddress("a@a.com", "AlphaWu", System.Text.Encoding.UTF8); //写信人
- /* 上面3个参数分别是发件人地址(可以随便写),发件人姓名,编码*/
- msg.Subject = "这是测试邮件";//邮件标题
- msg.SubjectEncoding = System.Text.Encoding.UTF8;//邮件标题编码
- msg.Body = "邮件内容";//邮件内容
- msg.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码
- msg.IsBodyHtml = false;//是否是HTML邮件
- msg.Priority = MailPriority.High;//邮件优先级
- SmtpClient client = new SmtpClient();
- client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
- //上述写你的GMail邮箱和密码
- client.Port = 587;//Gmail使用的端口
- client.Host = "smtp.gmail.com";
- client.EnableSsl = true;//经过ssl加密
- object userState = msg;
- try
- {
- client.SendAsync(msg, userState);
- //简单一点儿可以client.Send(msg);
- MessageBox.Show("发送成功");
- }
- catch (System.Net.Mail.SmtpException ex)
- {
- MessageBox.Show(ex.Message, "发送邮件出错");
- }
使用不同邮箱只要把SmtpClient的几个参数(port:端口号,host:smtp地址,EnableSsl:是否使用ssl)以及Credentials :用户名及密码 修改一下即可。
不过以上方法在QQ邮箱上面会出现几个问题,现在我把自己碰到的问题写下来给各位参考一下:
1.没有开启qq的POP3/SMTP服务
-
进入邮箱后点击顶部的设置按钮
-
点击二级目录“账户” 拉到中下部 POP3/SMTP服务开启
-
如果是设置POP3和SMTP的SSL加密方式,则端口如下:
POP3服务器(端口995)
SMTP服务器(端口465或587)。
服务开启后会给我们一个授权码,登录验证时使用授权码替代密码。
2. 命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !
开启服务后我又碰到了上面这个验证失败的错误,我检查了半天发现自己smtp的端口号是默认的25,(在这里我翻了不少论坛,发现以前qq邮箱的端口号确实是25而且也没有ssl加密,不过后面升级后端口号改为了465)
3. 连接超时
密码用户名端口号都改正确后,在我以为大功告成的时候,报了连接超时的错。而且无论怎么调试都不成功,最后在一篇博客里翻到了下面这段内容:
System.Net.Mail支持Explicit SSL但是不支持Implicit SSL,然后查了下关于这两个模式的资料,我按照我理解的说一下: Explicit SSL 发起于未加密的25,然后进行一个starttl握手,最终切换到加密的连接。 Implicit SSL 直接从指定的端口发起starttl握手。 既然指定了端口,那么应该就是使用了Implicit SSL,不知道微软什么时候能更新下System.net.mail,System.net.mail能在邮件中嵌入图片的。 问题到了这里,那是不是就没有办法利用腾讯邮箱发邮件了呢?答案肯定是否定的,foxmail不久可以配置发送邮件吗?我们可以利用CDO.Message和System.web.mail发送邮件。
465端口是SSL/TLS通讯协议的 内容一开始就被保护起来了 是看不到原文的。
587端口是STARTTLS协议的 属于TLS通讯协议 只是他是在STARTTLS命令执行后才对之后的原文进行保护的。
解决办法:
1.使用CDO.Message
2.使用System.web.mail
3.依旧使用System.Net.mail,不过把端口号改为587;(System.Net.Mail好像不支持通过465端口)