C#发邮件正文

liao_ken 2014-08-19 05:09:13
我用C# tcpclient写了个163邮件发送的程序,邮件是发送成功了,但内容显示很奇怪,发送DATA命令后,发出去的内容全部显示在邮件标题上,正文显示不出内容,求解,代码如下:

StringBuilder mailhead = new StringBuilder();
mailhead.Append("SUBJECT:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
.Append("\r\nDATE:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))
.Append("\r\nFROM:" + config.SendAddr + ":<" + config.SendAddr + ">;")
.Append("\r\nTO:" + config.MailTo[0] + ":<" + config.MailTo[0] + ">;");
mailhead.Append("<html><body>" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + msg+"</body></html>");

发送结果:
XXX
发给 XXX, <body>2014-08-19 16:27:21this is test mail, come from XXX@163.com</html>
隐藏信息2014-08-20 08:27
发件人:
XXX<XXX@163.com>
收件人:
XXX<XXX@163.com>, <body>2014-08-19 16:27:21this is test mail<html>, come from XXX@163.com</html></body>
时间:
2014年8月20日 (周三) 08:27
大小:
757 B

正文框内无内容

其中上面<body>2014-08-19 16:27:21this is test mail<html>, come from XXX@163.com</html></body>为正文
...全文
394 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao_ken 2014-08-28
  • 打赏
  • 举报
回复
问题已解决,涉及MIME协议,结贴
threenewbee 2014-08-20
  • 打赏
  • 举报
回复
.Append("\r\nTO:" + config.MailTo[0] + ":<" + config.MailTo[0] + ">;"); -> .Append("\r\nTO:" + config.MailTo[0] + ":<" + config.MailTo[0] + ">;\r\n");
liao_ken 2014-08-20
  • 打赏
  • 举报
回复
上面几位兄弟,因为我是在IE代理环境下发邮件的,没用使用smtpClient,而是直接使用tcpClient向smtp.163.com发送指令的,经过Connect、EHLO、AUTH LOGIN、再发送DATA指令,然后向服务器发送正文内容的指令,以\r\n.\r\n结束与smtp服务通信,所以没办法用到C# 的MailMessage类,而是需要以指令的方式让服务器识别哪部分是主题、时间、发送人、接收人、正文等。。
liao_ken 2014-08-20
  • 打赏
  • 举报
回复
其实向服务器发送DATA命令后,smtp服务器返回354 End data with <CR><LF>.<CR><LF> 然后我的代码如下,就是显示不出正文来,求求高手解释一下:

            WriteToNetStream(ref stream, "Data:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), true);
            WriteToNetStream(ref stream, "Subject:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm"), true);
            WriteToNetStream(ref stream, "From:" + config.SendAddr + ":<" + config.SendAddr + ">;", true);
            WriteToNetStream(ref stream, "To::" + config.MailTo[0] + ":<" + config.MailTo[0] + ">;", true);
            WriteToNetStream(ref stream, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"), true);
            WriteToNetStream(ref stream, “this is test mail, come from XXX@163.com”, true);
            WriteToNetStream(ref stream, “\r\n.\r\n”, false);
其中WriteToNetStream的代码如下

private void WriteToNetStream(ref NetworkStream NetStream, string message, bool isNewLine)
        {
            string stringToSend = isNewLine ? message + "\r\n" : message;
            byte[] arrayToSend = Encoding.Default.GetBytes(stringToSend.ToCharArray());
            NetStream.Write(arrayToSend, 0, arrayToSend.Length);
        }
发送完毕后,服务器发回 250 Mail OK 证明邮件发出去了,事实也接收到了,但其中的内容this is test mail, come from XXX@163.com却显示不出来,求解,问题还是如贴子开头的一样
liao_ken 2014-08-20
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
.Append("\r\nTO:" + config.MailTo[0] + ":<" + config.MailTo[0] + ">;"); -> .Append("\r\nTO:" + config.MailTo[0] + ":<" + config.MailTo[0] + ">;\r\n");
谢谢你的回复,不过我加了这个换行符后,正文内容在To上面是不显示了,但在正文下面还是没显示出来,就像直接消失了,很奇怪
ZhongGuanYao 2014-08-19
  • 打赏
  • 举报
回复
调用下面代码即可 /// <summary> /// 发送163邮件,不包括抄送和附件功能 /// </summary> /// <param name="fromAddr">发件人163邮箱</param> /// <param name="fromName">发件人名称</param> /// <param name="password">发件人163邮箱密码</param> /// <param name="messageTo">收件人邮箱(多个邮箱用分号;隔开)</param> /// <param name="messageSubject">邮件主题</param> /// <param name="messageBody">邮件内容</param> /// <returns></returns> public static bool SendEmail_163(string fromAddr, string fromName,string password, string messageTo, string messageSubject,string messageBody) { MailAddress messageFrom = new MailAddress(fromAddr, fromName); MailMessage message = new MailMessage(); message.From = messageFrom; //收件人邮箱(可以群发,多个邮箱通过分号隔开) string[] mails = messageTo.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < mails.Length; i++) { message.To.Add(mails[i]); } message.Subject = messageSubject;//邮件主题 message.Body = messageBody;//邮件内容 message.BodyEncoding = System.Text.Encoding.UTF8; message.IsBodyHtml = true;//支持HTML格式 message.Priority = MailPriority.High;//优先级别:最高 SmtpClient sc = new SmtpClient(); sc.UseDefaultCredentials = false; //收件人信息163用户名和密码 sc.Credentials = new System.Net.NetworkCredential(fromAddr.Substring(0,fromAddr.IndexOf('@')), password);//发件人邮箱 sc.DeliveryMethod = SmtpDeliveryMethod.Network; sc.Host = "smtp.163.com";//163邮箱 sc.Port = 25;//协议端口 try{ sc.Send(message);//发送 }catch(Exception ex){ return false; } return true; }
ZhongGuanYao 2014-08-19
  • 打赏
  • 举报
回复
MailMessage message = new MailMessage(); message.From = messageFrom; //收件人邮箱(可以群发,多个邮箱通过分号隔开) string[] mails = messageTo.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < mails.Length; i++) { message.To.Add(mails[i]); } message.Subject = messageSubject;//邮件主题 message.Body = messageBody;//邮件内容 message.BodyEncoding = System.Text.Encoding.UTF8; message.IsBodyHtml = true;//支持HTML格式 message.Priority = MailPriority.High;//优先级别:最高
md5e 2014-08-19
  • 打赏
  • 举报
回复
一般我们的mail有直接的内部类System.Net里面,二是mail.body默认为Text纯文本,要设置属性将其可为html
sunny906 2014-08-19
  • 打赏
  • 举报
回复

MailMessage mail = new MailMessage();
mail.From="";
mail.To = "";
mail.Subject ="";
mail.Body ="";

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧