`
tiandirensoon
  • 浏览: 597864 次
文章分类
社区版块
存档分类
最新评论

C# MAIL CLASS

 
阅读更多
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections;

namespace lion_office.Data.Library.MailClass
{
public class ESmtpMail
{
private string enter="/r/n";
/// <summary>
/// 设定语言代码,默认设定为GB2312,如不需要可设置为""
/// </summary>
public string Charset="GB2312";
/// <summary>
/// 发件人地址
/// </summary>
public string From="";
/// <summary>
/// 发件人姓名
/// </summary>
public string FromName="";
/// <summary>
/// 回复邮件地址
/// </summary>
//public string ReplyTo="";
/// <summary>
/// 收件人姓名
/// </summary>
public string RecipientName="";
/// <summary>
/// 收件人列表
/// </summary>
private Hashtable Recipient=new Hashtable();
/// <summary>
/// 邮件服务器域名
/// </summary>
private string mailserver="";
/// <summary>
/// 邮件服务器端口号
/// </summary>
private int mailserverport=25;
/// <summary>
/// SMTP认证时使用的用户名
/// </summary>
private string username="";
/// <summary>
/// SMTP认证时使用的密码
/// </summary>
private string password="";
/// <summary>
/// 是否需要SMTP验证
/// </summary>
private bool ESmtp=false;
/// <summary>
/// 是否Html邮件
/// </summary>
public bool Html=false;
/// <summary>
/// 邮件附件列表
/// </summary>
private System.Collections.ArrayList Attachments;
/// <summary>
/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"
/// </summary>
private string priority="Normal";
/// <summary>
/// 邮件主题
/// </summary>
public string Subject="";
/// <summary>
/// 邮件正文
/// </summary>
public string Body="";
/// <summary>
/// 收件人数量
/// </summary>
private int RecipientNum=0;
/// <summary>
/// 最多收件人数量
/// </summary>
private int recipientmaxnum=1;
/// <summary>
/// 密件收件人数量
/// </summary>
//private int RecipientBCCNum=0;
/// <summary>
/// 错误消息反馈
/// </summary>
private string errmsg;
/// <summary>
/// TcpClient对象,用于连接服务器
/// </summary>
private TcpClient tc;
/// <summary>
/// NetworkStream对象
/// </summary>
private NetworkStream ns;
/// <summary>
/// SMTP错误代码哈希表
/// </summary>
private Hashtable ErrCodeHT = new Hashtable();
/// <summary>
/// SMTP正确代码哈希表
/// </summary>
private Hashtable RightCodeHT = new Hashtable();
public ESmtpMail()
{
Attachments = new System.Collections.ArrayList();
}
/// <summary>
/// 邮件服务器域名和验证信息
/// 形如:"user:pass@www.server.com:25",也可省略次要信息。如"user:pass@www.server.com"或"www.server.com"
/// </summary>
public string MailDomain
{
set
{
string maidomain=value.Trim();
int tempint;

if(maidomain!="")
{
tempint=maidomain.IndexOf("@");
if(tempint!=-1)
{
string str=maidomain.Substring(0,tempint);
MailServerUserName=str.Substring(0,str.IndexOf(":"));
MailServerPassWord=str.Substring(str.IndexOf(":")+1,str.Length-str.IndexOf(":")-1);
maidomain=maidomain.Substring(tempint+1,maidomain.Length-tempint-1);
}

tempint=maidomain.IndexOf(":");
if(tempint!=-1)
{
mailserver=maidomain.Substring(0,tempint);
mailserverport=System.Convert.ToInt32(maidomain.Substring(tempint+1,maidomain.Length-tempint-1));
}
else
{
mailserver=maidomain;

}


}

}
}



/// <summary>
/// 邮件服务器端口号
/// </summary>
public int MailDomainPort
{
set
{
mailserverport=value;
}
}



/// <summary>
/// SMTP认证时使用的用户名
/// </summary>
public string MailServerUserName
{
set
{
if(value.Trim()!="")
{
username=value.Trim();
ESmtp=true;
}
else
{
username="";
ESmtp=false;
}
}
}

/// <summary>
/// SMTP认证时使用的密码
/// </summary>
public string MailServerPassWord
{
set
{
password=value;
}
}

/// <summary>
/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"
/// </summary>
public string Priority
{
set
{
switch(value.ToLower())
{
case "high":
priority="High";
break;

case "1":
priority="High";
break;

case "normal":
priority="Normal";
break;

case "3":
priority="Normal";
break;

case "low":
priority="Low";
break;

case "5":
priority="Low";
break;

default:
priority="Normal";
break;
}
}
}


/// <summary>
/// 错误消息反馈
/// </summary>
public string ErrorMessage
{
get
{
return errmsg;
}
}



/// <summary>
/// 服务器交互记录
/// </summary>
private string logs="";

/// <summary>
/// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我(lion-a@sohu.com),我将尽快查明原因。
/// </summary>
public string Logs
{
get
{
return logs;
}
}




/// <summary>
/// SMTP回应代码哈希表
/// </summary>
private void SMTPCodeAdd()
{
ErrCodeHT.Add("500","邮箱地址错误");
ErrCodeHT.Add("501","参数格式错误");
ErrCodeHT.Add("502","命令不可实现");
ErrCodeHT.Add("503","服务器需要SMTP验证");
ErrCodeHT.Add("504","命令参数不可实现");
ErrCodeHT.Add("421","服务未就绪,关闭传输信道");
ErrCodeHT.Add("450","要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)");
ErrCodeHT.Add("550","要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)");
ErrCodeHT.Add("451","放弃要求的操作;处理过程中出错");
ErrCodeHT.Add("551","用户非本地,请尝试<forward-path>");
ErrCodeHT.Add("452","系统存储不足,要求的操作未执行");
ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行");
ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)");
ErrCodeHT.Add("432","需要一个密码转换");
ErrCodeHT.Add("534","认证机制过于简单");
ErrCodeHT.Add("538","当前请求的认证机制需要加密");
ErrCodeHT.Add("454","临时认证失败");
ErrCodeHT.Add("530","需要认证");

RightCodeHT.Add("220","服务就绪");
RightCodeHT.Add("250","要求的邮件操作完成");
RightCodeHT.Add("251","用户非本地,将转发向<forward-path>");
RightCodeHT.Add("354","开始邮件输入,以<enter>.<enter>结束");
RightCodeHT.Add("221","服务关闭传输信道");
RightCodeHT.Add("334","服务器响应验证Base64字符串");
RightCodeHT.Add("235","验证成功");
}


/// <summary>
/// 将字符串编码为Base64字符串
/// </summary>
/// <param name="estr">要编码的字符串</param>
private string Base64Encode(string str)
{
byte[] barray;
barray=Encoding.Default.GetBytes(str);
return Convert.ToBase64String(barray);
}


/// <summary>
/// 将Base64字符串解码为普通字符串
/// </summary>
/// <param name="dstr">要解码的字符串</param>
private string Base64Decode(string str)
{
byte[] barray;
barray=Convert.FromBase64String(str);
return Encoding.Default.GetString(barray);
}


/// <summary>
/// 得到上传附件的文件流
/// </summary>
/// <param name="FilePath">附件的绝对路径</param>
private string GetStream(string FilePath)
{
//建立文件流对象
System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open);
byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)];
FileStr.Read(by,0,by.Length);
FileStr.Close();
return(System.Convert.ToBase64String(by));
}


/// <summary>
/// 添加邮件附件
/// </summary>
/// <param name="path">附件绝对路径</param>
public void AddAttachment(string path)
{
Attachments.Add(path);
}



/// <summary>
/// 添加一个收件人
/// </summary>
/// <param name="str">收件人地址</param>
public bool AddRecipient(string str)
{
str=str.Trim();
if(str==null||str==""||str.IndexOf("@")==-1)
return true;
if(RecipientNum<recipientmaxnum)
{
Recipient.Add(RecipientNum,str);
RecipientNum++;
return true;
}
else
{
errmsg+="收件人过多";
return false;
}
}


/// <summary>
/// 最多收件人数量
/// </summary>
public int RecipientMaxNum
{
set
{
recipientmaxnum = value;
}
}


/// <summary>
/// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组
/// </summary>
/// <param name="str">保存有收件人地址的字符串数组(不超过recipientmaxnum个)</param>
public bool AddRecipient(string[] str)
{
for(int i=0;i<str.Length;i++)
{
if(!AddRecipient(str[i]))
{
return false;
}
}
return true;
}

/// <summary>
/// 发送SMTP命令
/// </summary>
private bool SendCommand(string str)
{
byte[] WriteBuffer;
if(str==null||str.Trim()=="")
{
return true;
}
logs+=str;
WriteBuffer = Encoding.Default.GetBytes(str);
try
{
ns.Write(WriteBuffer,0,WriteBuffer.Length);
}
catch
{
errmsg="网络连接错误";
return false;
}
return true;
}

/// <summary>
/// 接收SMTP服务器回应
/// </summary>
private string RecvResponse()
{
int StreamSize;
string ReturnValue = "";
byte[] ReadBuffer = new byte[1024] ;
try
{
StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length);
}
catch
{
errmsg="网络连接错误";
return "false";
}

if (StreamSize==0)
{
return ReturnValue ;
}
else
{
ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);
logs+=ReturnValue;
return ReturnValue;
}
}


/// <summary>
/// 与服务器交互,发送一条命令并接收回应。
/// </summary>
/// <param name="Command">一个要发送的命令</param>
/// <param name="errstr">如果错误,要反馈的信息</param>
private bool Dialog(string str,string errstr)
{
if(str==null||str.Trim()=="")
{
return true;
}
if(SendCommand(str))
{
string RR=RecvResponse();
if(RR=="false")
{
return false;
}
string RRCode=RR.Substring(0,3);
if(RightCodeHT[RRCode]!=null)
{
return true;
}
else
{
if(ErrCodeHT[RRCode]!=null)
{
errmsg+=(RRCode+ErrCodeHT[RRCode].ToString());
errmsg+=enter;
}
else
{
errmsg+=RR;
}
errmsg+=errstr;
return false;
}
}
else
{
return false;
}

}


/// <summary>
/// 与服务器交互,发送一组命令并接收回应。
/// </summary>

private bool Dialog(string[] str,string errstr)
{
for(int i=0;i<str.Length;i++)
{
if(!Dialog(str[i],""))
{
errmsg+=enter;
errmsg+=errstr;
return false;
}
}

return true;
}



private bool SendEmail()
{
//连接网络
try
{
tc=new TcpClient(mailserver,mailserverport);
}
catch(Exception e)
{
errmsg=e.ToString();
return false;
}

ns = tc.GetStream();
SMTPCodeAdd();

//验证网络连接是否正确
if(RightCodeHT[RecvResponse().Substring(0,3)]==null)
{
errmsg="网络连接失败";
return false;
}


string[] SendBuffer;
string SendBufferstr;

//进行SMTP验证
if(ESmtp)
{
SendBuffer=new String[4];
SendBuffer[0]="EHLO " + mailserver + enter;
SendBuffer[1]="AUTH LOGIN" + enter;
SendBuffer[2]=Base64Encode(username) + enter;
SendBuffer[3]=Base64Encode(password) + enter;
if(!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。"))
return false;
}
else
{
SendBufferstr="HELO " + mailserver + enter;
if(!Dialog(SendBufferstr,""))
return false;
}

//
SendBufferstr="MAIL FROM:<" + From + ">" + enter;
if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空"))
return false;

//
SendBuffer=new string[recipientmaxnum];
for(int i=0;i<Recipient.Count;i++)
{

SendBuffer[i]="RCPT TO:<" + Recipient[i].ToString() +">" + enter;

}
if(!Dialog(SendBuffer,"收件人地址有误"))
return false;

SendBufferstr="DATA" + enter;
if(!Dialog(SendBufferstr,""))
return false;

SendBufferstr="From:" + FromName + "<" + From +">" +enter;

SendBufferstr += "To:=?"+Charset.ToUpper()+"?B?"+Base64Encode(RecipientName)+"?="+"<"+Recipient[0]+">"+enter;
SendBufferstr+="CC:";
for(int i=0;i<Recipient.Count;i++)
{
SendBufferstr+=Recipient[i].ToString() + "<" + Recipient[i].ToString() +">,";
}
SendBufferstr+=enter;


if(Charset=="")
{
SendBufferstr+="Subject:" + Subject + enter;
}
else
{
SendBufferstr+="Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) +"?=" +enter;
}

SendBufferstr+="X-Priority:" + priority + enter;
SendBufferstr+="X-MSMail-Priority:" + priority + enter;
SendBufferstr+="Importance:" + priority + enter;
SendBufferstr+="X-Mailer: Huolx.Pubclass" + enter;
SendBufferstr+="MIME-Version: 1.0" + enter;

SendBufferstr += "Content-Type: multipart/mixed;"+enter;//内容格式和分隔符
SendBufferstr += " boundary=/"----=_NextPart_000_00D6_01C29593.AAB31770/""+enter;
SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter;

if(Html)
{
SendBufferstr+="Content-Type: text/html;" + enter;
}
else
{
SendBufferstr+="Content-Type: text/plain;" + enter;
}

if(Charset=="")
{
SendBufferstr+=" charset=/"iso-8859-1/"" + enter;
}
else
{
SendBufferstr+=" charset=/"" + Charset.ToLower() + "/"" + enter;
}
//SendBufferstr += "Content-Transfer-Encoding: base64"+enter;

SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter;

SendBufferstr+= Base64Encode(Body) + enter;
if(Attachments.Count!=0)
{
foreach(string filepath in Attachments)
{

SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter;
SendBufferstr += "Content-Type: application/octet-stream"+enter;
SendBufferstr += " name=/"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf("//")+1))+"?=/""+enter;
SendBufferstr += "Content-Transfer-Encoding: base64"+enter;
SendBufferstr += "Content-Disposition: attachment;"+enter;
SendBufferstr += " filename=/"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf("//")+1))+"?=/""+enter+enter;
SendBufferstr += GetStream(filepath)+enter+enter;
}
}
SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770--"+enter+enter;


SendBufferstr += enter + "." + enter;

if(!Dialog(SendBufferstr,"错误信件信息"))
return false;


SendBufferstr="QUIT" + enter;
if(!Dialog(SendBufferstr,"断开连接时错误"))
return false;


ns.Close();
tc.Close();
return true;
}


/// <summary>
/// 发送邮件方法,所有参数均通过属性设置。
/// </summary>
public bool Send()
{
if(Recipient.Count==0)
{
errmsg="收件人列表不能为空";
return false;
}

if(mailserver.Trim()=="")
{
errmsg="必须指定SMTP服务器";
return false;
}

return SendEmail();

}


/// <summary>
/// 发送邮件方法
/// </summary>
/// <param name="smtpserver">smtp服务器信息,如"username:password@www.smtpserver.com:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
public bool Send(string smtpserver)
{

MailDomain=smtpserver;
return Send();
}


/// <summary>
/// 发送邮件方法
/// </summary>
/// <param name="smtpserver">smtp服务器信息,如"username:password@www.smtpserver.com:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
/// <param name="from">发件人mail地址</param>
/// <param name="fromname">发件人姓名</param>
/// <param name="to">收件人地址</param>
/// <param name="toname">收件人姓名</param>
/// <param name="html">是否HTML邮件</param>
/// <param name="subject">邮件主题</param>
/// <param name="body">邮件正文</param>
public bool Send(string smtpserver,string from,string fromname,string to,string toname,bool html,string subject,string body)
{
MailDomain=smtpserver;
From=from;
FromName=fromname;
AddRecipient(to);
RecipientName=toname;
Html=html;
Subject=subject;
Body=body;
return Send();
}


}
}
分享到:
评论

相关推荐

    C# class source code for email handler

    A class to hanle System.Mail.Net

    C# 成功发送邮件

    using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.... /// C# 发送邮件,通过测试sina,smtp服务器成功发送

    C# Primer 中文版随书源码

    There are eight directories, representing the eight chapters of the C# Primer text, in which Visual Studio.NET projects are stored. These have all been compiled under a post-Release Candidate, but ...

    C#学习的101个经典例子

    #学习的101个经典例子,例子个个经典,涵盖C#的方方面面,带有说详尽的注释 Advanced - Multithreading - How-To Async Calls Advanced - Remoting - How-To TCP Remoting Advanced - Serialization - How-To ...

    c#写的.NET 类库 (Utility.dll) using Utility.Popup

    c#写的.NET 类库 (Utility.dll) 可以缓缓由底向上弹出窗口提示框 调用代码: /* * Author: zhg工作室 * E-mail: wudazhg@163.com */ using System; using System.Collections.Generic; using System.Drawing; ...

    C#字符串加密源代码(加密截密类)

    注意:提高分值是为了保护大家,让大家采用了这种加密... &lt;br&gt;【注意】本代码紧供参考,如有好注意,新思路,新方法,请联系本人,本人联系方式: QQ:280820560 MSN:grearo@live.cn&lt;br&gt;Mail:grearo@163.com

    C#浏览器编程,学习使用

    在“新建项目”对话框的项目类型窗口中选中“Visual C#”作为项目开发语言,在模板窗口中选中“Windows 应用程序”作为项目开发模板,在“名称”、“位置”编辑框中输入自己设定的项目名字和项目存储位置,本讲义...

    几个C#常用正则表达式的总结

     ///  public class RegexLib { //验证Email地址 public static bool IsValidEmail(string strIn) { // Return true if strIn is in valid e-mail format. return Regex.IsMatch(st

    C#实现QQ邮箱发送邮件

    闲着蛋疼。计划着改善公司的邮件服务。怎料公司网络封闭的太厉害了。我只能在家里利用开放点的网络来测试发送邮件; 利用qq邮箱发送到公司的企业邮箱上; ... ...using System.Net.Mail;...namespace mail ... class Progr

    c# SendMail发送邮件实例代码

    代码如下:using System;...namespace Common{ ///  /// 基于system.net.mail发送邮件,支持附件 ///  public class NetSendMail { public static void MailSend(string mailFrom, string maiFromlAcco

    C#简单邮件群发通用类

    本文实例为大家介绍了C#邮件群发通用类,供大家参考,具体内容如下 public static class Email { /// /// 发件人 /// public static string mailFrom { get; set; } /// /// 收件人 /// public static...

    C#编程实现发送邮件的方法(可添加附件)

    本文实例讲述了C#编程实现发送邮件的方法。分享给大家供大家参考,具体如下: using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; ...

    C#实现的自定义邮件发送类完整实例(支持多人多附件)

    本文实例讲述了C#实现的自定义邮件发送类。分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Mail; using System.Net....

    DFrame后台框架、ORM、C# ORM

    3:ImageClass 图片操作; 4:Json json操作; 5:ListComparer 按实体字段去重; 6:Mail 电子邮件操作; 7:QRCode 生成二维码和解读二维码; 8:SMS 短信接口 阿里云; 9:Tools 其他工具包; 10:UserInfo 获取用户信息。 ...

    C#.NET发送邮件的实例代码

    代码如下:using System;...namespace MyQuery.Utils{ ///  /// 封装邮件处理 /// by 贾世义 2011-6-3 ///  public static class MailHelper { private static string smtpHost = null; pri

    c#利用system.net发送html格式邮件

    namespace LeeStudio.Basic{/// &lt;summary&gt;/// 邮件发送类/// &lt;/summary&gt;public class SendEmail{private MailMessage mailMessage = new MailMessage(); //实例化一个邮件类 #region 构造函数/// &lt;summary&gt;/// 构造...

    c#判断email地址是否为合法

    class Program { static void Main(string[] args) { Console.WriteLine(请输入正确的邮箱地址,以 @sina.com 结尾); string us =Convert.ToString(Console.ReadLine()); string str1 = us.Replace(@, ); int count ...

    C#使用MailAddress类发送html格式邮件的实例代码

    1.首先引入命名空间using System.Net.Mail;2.将发送的邮件的功能封装成一个类... 代码如下:public class Email { ///  /// 发送者 ///  public string mailFrom { get; set; }  ///  /// 收件人 /// &lt;/summary&gt;

    C#判断是否为合法的email地址

    class Program { static void Main(string[] args) { Console.WriteLine("请输入正确的邮箱地址,以 @sina.com 结尾"); string us =Convert.ToString(Console.ReadLine()); string str1 = us.Replace("@", ...

    CSharp 3.0 With the .NET Framework 3.5 Unleashed(english)

    Sending SMTP Mail 704 Summary 705 31 Building Windows Service Applications 708 Creating Windows Service Projects in VS2008 709 Coding Windows Services 712 Installing a Windows Service 717 ...

Global site tag (gtag.js) - Google Analytics