如何在代理环境下发送邮件?——C#实现Socket代理方式的邮件发送

本文介绍了一种在代理环境下使用C#通过Socket实现邮件发送的方法,包括TCPClient对象的创建、与SMTP服务器的交互过程,如身份验证、发送邮件头和内容等。同时,文中提到了不使用SMTPClient和CDO对象的原因,并提供了HTTP代理的实现示例,但未涵盖SOCKS4和SOCKS5代理方式。
摘要由CSDN通过智能技术生成

       前一阵子做项目的时候遇到一个功能需求:当程序异常或者重大事件时候,发送邮件通知管理员。按理说这是一个很简单的需求,但是在开发当中遇到了一个问题:因为客户那里的网络拓扑是一个需要设置代理才可以访问外网smtp服务器的网络环境,所以程序在直连外网时候好使,拿到内网就不能用了。于是我在网上找了很多关于使用C#程序发邮件的例子,但很少有关于使用代理方式,特别是支持审核代理方式发送的案例,我分别使用了SMTPClient对象,CDO对象来进行开发,发现.net framework提供的smtpclient对象不支持代理方式发送,cdo里面有些关于代理的设置,但是没有关于访问代理时候的用户名、密码、端口设置的地方,于是问题被搁置下来。后来也请求过微软方面的支持,也没有给出什么好的方案【想让我用webservice,因为那个支持代理的审核,但是既然我能在内网使用foxmail,outlook通过设置代理属性后正常的收发邮件,那为什么还要使用什么webservice呢?看来微软的这些所谓的专家也有很菜的方面】。既然高级的方式使用不了,于是考虑回到原点——使用socket方式发送邮件。废话少说吧,先把代码贴出来大家分享:

1.先声明一个TCPClient对象,用于Socket发送

  1. private TcpClient sendTcp = null;

2.写几个方法用于与SMTP服务器的交互

  1. private void MailSocketAlternation(string[] mailto,string subject, string msg, string attachpath)
  2.         {
  3.             bool check = false;
  4.             NetworkStream stream = sendTcp.GetStream();
  5.             #region 发送Hello握手
  6.             string hostName = Dns.GetHostName();
  7.             check = SendCommand(ref stream, "EHLO " + hostName, "EHLO""250");
  8.             int round = 0;
  9.             //失败重试
  10.             while (!check && round < 5)
  11.             {
  12.                 round++;
  13.                 check = SendCommand(ref stream, "EHLO " + hostName, "EHLO""250");
  14.             }
  15.             #endregion
  16.             #region 请求审核登录
  17.             check = SendCommand(ref stream, "AUTH LOGIN ""AUTH LOGIN""334");
  18.             round = 0;
  19.             while (!check && round < 5)
  20.             {
  21.                 round++;
  22.                 check = SendCommand(ref stream, "AUTH LOGIN ""AUTH LOGIN""334");
  23.             }
  24.             #endregion
  25.             #region 身份验证
  26.             check = SendCommand(ref stream, Convert.ToBase64String(Encoding.Default.GetBytes(clsParam.Param.SendMailAccount)), "用户名""334");
  27.             round = 0;
  28.             while (!check && round < 5)
  29.             {
  30.                 round++;
  31.                 check = SendCommand(ref stream, Convert.ToBase64String(Encoding.Default.GetBytes(clsParam.Param.SendMailAccount)), "用户名""334");
  32.             }
  33.             if (!check)
  34.             {
  35.                 throw new Exception("邮件帐户身份验证失败!");
  36.             }
  37.             check = SendCommand(ref stream, Convert.ToBase64String(Encoding.Default.GetBytes(clsParam.Param.SendMailPWD)), "密码""235");
  38.             round = 0;
  39.             while (!check && round < 5)
  40.             {
  41.                 round++;
  42.                 check = SendCommand(ref stream, "EHLO " + hostName, "EHLO""250");
  43.                 int round0 = 0;
  44.                 while (!check && round0 < 5)
  45.                 {
  46.                     round0++;
  47.                     check = SendCommand(ref stream, "EHLO " + hostName, "EHLO""250");
  48.                 }
  49.                 check = SendCommand(ref stream, "AUTH LOGIN ""AUTH LOGIN""334");
  50.                 check = SendCommand(ref stream, Convert.ToBase64String(Encoding.Default.GetBytes(clsParam.Param.SendMailAccount)), "用户名""334");
  51.                 check = SendCommand(ref stream, Convert.ToBase64String(Encoding.Default.GetBytes(clsParam.Param.SendMailPWD)), "密码""235");
  52.             }
  53.             if (!check)
  54.             {
  55.                 throw new Exception("邮件帐户身份验证失败!");
  56.             }
  57.             #endregion
  58.             #region 发件人
  59.             check = SendCommand(ref stream, "MAIL FROM:<" + clsParam.Param.SendMailAccount + ">""MAIL FROM""250");
  60.             round = 0;
  61.             while (!check && round < 5)
  62.             {
  63.                 round++;
  64.                 check = SendCommand(ref stream, "MAIL FROM:<" + clsParam.Param.SendMailAccount + ">""MAIL FROM""250");
  65.             }
  66.             #endregion            
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 310
    评论
评论 310
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值