zoukankan      html  css  js  c++  java
  • 支持ESMTP身份验证的邮件发送

    使用.NET Framework下的System.Net.Mail.SmtpClient可以很容易的实现邮件发送,但现在很多邮件服务器已经支持ESMTP协议。而ESMTP最大的区别在于发送时需要提供帐号密码做验证。ESMTP通过流的方式发送命令与服务器交互,完成邮件的发送与接受。更多关于SMTP的命令请参考:http://www.magicwinmail.com/technic_smtp.php

    下面是一个简单的示例:(没有做任何判断与封装,仅供参考)

    代码
    string smtp ="mail.com";
    string from ="send@mail.com";
    string pwd ="pwd";
    string to ="rec@mail.com";

    //建立链接
    TcpClient tc =new TcpClient(smtp,25);
    byte[] b =newbyte[1024];
    tc.GetStream().Read(b,
    0,b.Length);
    Response.Write(Encoding.UTF8.GetString(b)
    +"<br/>");

    //标识身份
    WriteMsg(tc.GetStream(), "HELO xxxx\r\n");
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //身份验证开始
    WriteMsg(tc.GetStream(), "AUTH LOGIN\r\n");
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //帐号 base64编码
    byte[] bTxt=newbyte[1024];
    bTxt
    =Encoding.UTF8.GetBytes(from);
    WriteMsg(tc.GetStream(), Convert.ToBase64String(bTxt)
    +"\r\n");
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //密码base64编码
    bTxt=Encoding.UTF8.GetBytes(pwd);
    WriteMsg(tc.GetStream(), Convert.ToBase64String(bTxt)
    +"\r\n");
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");
    //身份验证结束

    //发送邮件地址
    WriteMsg(tc.GetStream(), string.Format("MAIL FROM:{0}\r\n", from));
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //接受邮件地址,可以有多个RCPT TO
    WriteMsg(tc.GetStream(), string.Format("RCPT TO:{0}\r\n", to));
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //初如化
    WriteMsg(tc.GetStream(), "DATA \r\n");
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //邮件内容
    StringBuilder sb =new StringBuilder();
    sb.AppendFormat(
    "From:{0}\r\n", from);//发信人
    sb.AppendFormat("To:{0}\r\n", to);//收信人,可以有多个,用分号隔开, 这两行可以与上面的MAIL FROM和RCPT TO不同(显示在邮件内容里的)
    sb.AppendFormat("Date:{0}\r\n",DateTime.Now.ToString());//时间
    sb.AppendFormat("Subject:{0}\r\n", "测试");//主题
    sb.Append("\r\n");
    sb.Append(
    "内容"); //正文
    sb.Append("\r\n.\r\n");

    WriteMsg(tc.GetStream(), sb.ToString());
    Response.Write(ReadMsg(tc.GetStream())
    +"<br/>");

    //结束会话
    WriteMsg(tc.GetStream(), "QUIT");

    //关闭链接
    tc.Close();
    代码
    privatevoid WriteMsg(NetworkStream ns,string msg)
    {
    byte[] bw = Encoding.UTF8.GetBytes(msg);
    ns.Write(bw,
    0,bw.Length);
    }
    privatestring ReadMsg(NetworkStream ns)
    {
    byte[] br =newbyte[1024];
    ns.Read(br,
    0,br.Length);
    return Encoding.UTF8.GetString(br);
    }

    如果运行正常,上面的返回状态依次为:

    220 mail.com ESMTP CMailServer 5.4.6 SMTP Service Ready
    250 welcome here
    334 VXNlcm5hbWU6
    334 UGFzc3dvcmQ6
    235 OK
    250 OK
    250 OK
    354 send the mail data, end with .
    250 OK

    主要还是要熟悉SMTP协议及相关命令,按其格式发送数据与服务端交互。注意命令中间的space(空格)及结尾处的CRLF(回车换行)。

    标签:SMTP,ESMTP,Email,发邮件,身份验证
    http://chy710.cnblogs.com
  • 相关阅读:
    Leetcode Valid Sudoku
    Leetcode Surrounded Regions
    LeetCode Sqrt
    LeetCode POW
    LeetCode Next Permutation
    ACK-Ackermann, 阿克曼函数
    再不懂时序就 OUT 啦!,DBengine 排名第一时序数据库,阿里云数据库 InfluxDB 正式商业化!
    阿里云提供全托管 ZooKeeper
    性能压测中的SLA,你知道吗?
    第一个入驻阿里云自营心选商城,如今它已经是营收过亿的SaaS独角兽
  • 原文地址:https://www.cnblogs.com/chy710/p/1656877.html
Copyright © 2011-2022 走看看