下面两个Class分别是基于WebMail和Socket:

  1using System;
  2using System.Web.Mail ;
  3using System.Collections;
  4using System.Text;
  5
  6namespace NewEgg.EmailRSM
  7{
  8    /// <summary>
  9    /// Summary description for SendEmailByNetWebMail.
 10    /// </summary>

 11    public class SendEmailByNetWebMail
 12    {
 13        private string m_server = "";
 14        private string m_userName = "";
 15        private string m_password = "";
 16        private EmailInfo m_emailinfo=null;
 17
 18        public SendEmailByNetWebMail()
 19        {
 20            //
 21            // TODO: Add constructor logic here
 22            //
 23        }

 24
 25        属性
 62
 63        /// <summary>
 64        /// 发送邮件
 65        /// </summary>

 66        public bool SendMail()
 67        {
 68            try
 69            {
 70                MailMessage mailObj =new MailMessage();
 71                mailObj.From =m_emailinfo.From ;
 72                mailObj.To =m_emailinfo.To ;
 73                mailObj.Subject =m_emailinfo.Subject ;
 74                mailObj.Body =m_emailinfo.Body;
 75                if(m_emailinfo.IsHtml)
 76                {
 77                    mailObj.BodyFormat=MailFormat.Html;
 78                }

 79                else
 80                {
 81                    mailObj.BodyFormat=MailFormat.Text ;
 82                }

 83                mailObj.Cc=m_emailinfo.CC ;
 84                mailObj.Bcc =m_emailinfo.BCC ;
 85
 86                switch(m_emailinfo.MailEncoding)
 87                {
 88                    case "GB2312":
 89                        mailObj.BodyEncoding=System.Text.Encoding.GetEncoding("GB2312");
 90                        break;
 91                    case "UTF-8":
 92                        mailObj.BodyEncoding=System.Text.Encoding.GetEncoding("UTF-8");
 93                        break;
 94                    default:
 95                        mailObj.BodyEncoding=Encoding.Default;
 96                        break;
 97                }

 98                switch(m_emailinfo.Priority)
 99                {
100                    case 1:
101                        mailObj.Priority=MailPriority.High ;
102                        break;
103                    case 2:
104                        mailObj.Priority=MailPriority.Normal  ;
105                        break;
106                    case 3:
107                        mailObj.Priority=MailPriority.Low  ;
108                        break;
109                    default:
110                        mailObj.Priority=MailPriority.Normal  ;
111                        break;
112                }

113                for (int i = 0; i < m_emailinfo.Attachments.Count; i++)
114                {
115                    MailAttachment myAttachment = new MailAttachment(m_emailinfo.Attachments[i].ToString() );
116                    mailObj.Attachments.Add(myAttachment);
117                }

118
119                mailObj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate""1");   //basic authentication 
120
121                mailObj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", m_userName); //set your username here 
122
123                mailObj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", m_password ); //set your password here 
124
125                mailObj.BodyFormat =MailFormat.Html;
126                mailObj.Priority = MailPriority.High;
127                SmtpMail.SmtpServer =m_server ;
128                SmtpMail.Send(mailObj);
129                return true;
130            }

131            catch
132            {
133                return false;
134            }

135        }

136
137        /// <summary>
138        /// 发送Email 
139        /// </summary>
140        /// <param name="email"></param>
141        /// <returns></returns>

142        public bool SendMail(EmailInfo email)
143        {
144            m_emailinfo=email;
145            return  SendMail();
146            
147        }

148
149        
150    }

151}

152

using System;
using System.Collections;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Threading;

namespace NewEgg.EmailRSM
{
    
/// <summary>
    
/// Summary description for SendEmailBySocket.
    
/// </summary>

    public class SendEmailBySocket
    
{
        
private string server = "";
        
private int port = 25;
        
private string userName = "";
        
private string password = "";
        
private EmailInfo emailinfo=null;
 
        
public SendEmailBySocket()
        
{
            
//
            
// TODO: Add constructor logic here
            
//
        }


        
属性

        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="mail"></param>
        
/// <returns></returns>

        public bool SendMail(EmailInfo mail)
        
{
            emailinfo 
=mail;
            
return SendMail();
        }



        
/// <summary>
        
/// 发送邮件
        
/// </summary>

        public bool SendMail()
        
{
            
// 创建TcpClient对象, 并建立连接
            TcpClient tcp = null;
            
try
            
{
                tcp 
= new TcpClient (server, port);
            }

            
catch (Exception)
            
{
                
throw new Exception ("无法连接服务器");
            }


            ReadString (tcp.GetStream());
//获取连接信息

            
// 开始进行服务器认证
            
// 如果状态码是250则表示操作成功
            if (!Command (tcp.GetStream(), "EHLO Localhost""250"))
                
throw new Exception ("登陆阶段失败");

            
if (userName != "")
            
{
                
// 需要身份验证
                if (!Command (tcp.GetStream(), "AUTH LOGIN""334"))
                    
throw new Exception ("身份验证阶段失败");
             
                
string nameB64 = ToBase64 (userName); // 此处将username转换为Base64码
                if (!Command (tcp.GetStream(), nameB64, "334"))
                    
throw new Exception ("身份验证阶段失败");
                 
                
string passB64 = ToBase64 (password); // 此处将password转换为Base64码
                if (!Command (tcp.GetStream(), passB64, "235"))
                    
throw new Exception ("身份验证阶段失败");
                
            }

            Thread.Sleep(
100);

            
// 准备发送
            WriteString (tcp.GetStream(), "mail From: " + emailinfo.From );
            WriteString (tcp.GetStream(), 
"rcpt to: " + emailinfo.ToPerson);
            WriteString (tcp.GetStream(), 
"data");

            
// 发送邮件头
            WriteString (tcp.GetStream(), "Date: " + DateTime.Now); // 时间
            WriteString (tcp.GetStream(), "From: " + emailinfo.FromName  + "<" + emailinfo.From  + ">"); // 发件人
            WriteString (tcp.GetStream(), "Subject: " + emailinfo.Subject ); // 主题
            WriteString (tcp.GetStream(), "To:" + emailinfo.ToName  + "<" + emailinfo.To  + ">"); // 收件人
            WriteString (tcp.GetStream(), "Cc:" + emailinfo.CC   + "<" + emailinfo.CC   + ">"); // 收件人
            WriteString (tcp.GetStream(), "Bcc:" + emailinfo.BCC   + "<" + emailinfo.BCC  + ">"); // 收件人

            
//邮件格式 
            WriteString (tcp.GetStream(), "Content-Type: multipart/mixed; boundary=\"unique-boundary-1\"");
            WriteString (tcp.GetStream(), 
"Reply-To:" + emailinfo.From ); // 回复地址
            WriteString (tcp.GetStream(), "X-Priority:" + emailinfo.Priority.ToString() ); // 优先级
            WriteString (tcp.GetStream(), "MIME-Version:1.0"); // MIME版本

            
// 数据ID,随意
            WriteString (tcp.GetStream(), "Content-Transfer-Encoding:" + emailinfo.MailEncoding ); // 内容编码
            WriteString (tcp.GetStream(), "X-Mailer:NewEgg.MailSender"); // 邮件发送者
            WriteString (tcp.GetStream(), "");

            
if(emailinfo.Attachments.Count>0)
            
{
                WriteString (tcp.GetStream(), ToBase64 (
"This is a multi-part message in MIME format.")); 
                WriteString (tcp.GetStream(), 
""); 

                
// 从此处开始进行分隔输入
                WriteString (tcp.GetStream(), "--unique-boundary-1");

                
// 在此处定义第二个分隔符
                
                WriteString (tcp.GetStream(), 
"Content-Type: multipart/alternative;Boundary=\"unique-boundary-2\"");
                
                WriteString (tcp.GetStream(), 
"");
            }

            
            Thread.Sleep(
100);
            
if(!emailinfo.IsHtml)
            
{
                
// 文本信息
                if(emailinfo.Attachments.Count>0)
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-2");
                }

                
else
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-1"); 
                }

                WriteString (tcp.GetStream(), 
"Content-Type: text/plain;charset=" + emailinfo.LanguageEncoding);
                WriteString (tcp.GetStream(), 
"Content-Transfer-Encoding:" + emailinfo.MailEncoding );
                WriteString (tcp.GetStream(), 
"");
                WriteString (tcp.GetStream(), emailinfo.Body );
                WriteString (tcp.GetStream(), 
"");//一个部分写完之后就写如空信息,分段
                if(emailinfo.Attachments.Count>0)
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了--
                }

                
else
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-1"); 
                }

                WriteString (tcp.GetStream(), 
"");
            }

            
else
            
{
                
//html信息

                
if(emailinfo.Attachments.Count>0)
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-2"); 
                }

                
else
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-1"); 
                }


                WriteString (tcp.GetStream(), 
"Content-Type: text/html;charset=" + emailinfo.LanguageEncoding ); 
                WriteString (tcp.GetStream(), 
"Content-Transfer-Encoding:" + emailinfo.MailEncoding ); 
                WriteString (tcp.GetStream(), 
""); 
                WriteString (tcp.GetStream(), emailinfo.HtmlBody ); 
                WriteString (tcp.GetStream(), 
""); 
                
if(emailinfo.Attachments.Count>0)
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- 
                    
                }

                
else
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-1"); 
                }

                WriteString (tcp.GetStream(), 
"");
            }


            
if(emailinfo.Attachments.Count>0)
            
{
                Thread.Sleep(
100);
                
// 发送附件
                
// 对文件列表做循环
                for (int i = 0; i < emailinfo.Attachments.Count; i++)
                
{
                    WriteString (tcp.GetStream(), 
"--unique-boundary-1"); // 邮件内容分隔符
                    WriteString (tcp.GetStream(), "Content-Type: application/octet-stream;name=\"" + ((EmailSender.AttachmentInfo)emailinfo.Attachments[i]).FileName + "\""); // 文件格式
                    WriteString (tcp.GetStream(), "Content-Transfer-Encoding: base64"); // 内容的编码
                    WriteString (tcp.GetStream(), "Content-Disposition:attachment;name=\"" + ((EmailSender.AttachmentInfo)emailinfo.Attachments[i]).FileName + "\""); // 文件名
                    WriteString (tcp.GetStream(), "");
                    WriteString (tcp.GetStream(), ((EmailSender.AttachmentInfo)emailinfo.Attachments[i]).Bytes); 
// 写入文件的内容
                    WriteString (tcp.GetStream(), "");
                }

            }

            Thread.Sleep(
100);
            Command (tcp.GetStream(), 
".""250"); // 最后写完了,输入"." 

            
// 关闭连接
            tcp.Close ();
            
return true;
        }


 
        
/// <summary>
        
/// 向流中写入字符
        
/// </summary>
        
/// <param name="netStream">来自TcpClient的流</param>
        
/// <param name="str">写入的字符</param>

        protected void WriteString (NetworkStream netStream, string str)
        
{
            str 
= str + "\r\n"// 加入换行符
            
// 将命令行转化为byte[]
            byte[] bWrite = Encoding.GetEncoding(emailinfo.LanguageEncoding).GetBytes(str.ToCharArray());

            
// 由于每次写入的数据大小是有限制的,那么我们将每次写入的数据长度定在75个字节,一旦命令长度超过了75,就分步写入。
            int start=0;
            
int length=bWrite.Length;
            
int page=0;
            
int size=75;
            
int count=size;
            
try
            
{
                
if (length>75)
                
{
                    
// 数据分页
                    if ((length/size)*size<length)
                        page
=length/size+1;
                    
else
                        page
=length/size;
                    
for (int i=0;i<page;i++)
                    
{
                        start
=i*size;
                        
if (i==page-1)
                            count
=length-(i*size);
                        netStream.Write(bWrite,start,count);
// 将数据写入到服务器上
                    }

                }

                
else
                
{
                    netStream.Write(bWrite,
0,bWrite.Length);
                }

            }

            
catch(Exception)
            
{
                
// 忽略错误
            }

        }


        
/// <summary>
        
/// 从流中读取字符
        
/// </summary>
        
/// <param name="netStream">来自TcpClient的流</param>
        
/// <returns>读取的字符</returns>

        protected string ReadString (NetworkStream netStream)
        
{
            
string sp = null;
            
byte[] by = new byte[1024];
            
int size = netStream.Read(by,0,by.Length);// 读取数据流
            if (size > 0)
            
{
                sp 
= Encoding.Default.GetString(by);// 转化为String
            }

            
return sp;
        }


        
/// <summary>
        
/// 发出命令并判断返回信息是否正确
        
/// </summary>
        
/// <param name="netStream">来自TcpClient的流</param>
        
/// <param name="command">命令</param>
        
/// <param name="state">正确的状态码</param>
        
/// <returns>是否正确</returns>

        protected bool Command (NetworkStream netStream, string command, string state)
        
{
            
string sp=null;
            
bool success=false;
            
try
            
{
                WriteString (netStream, command);
// 写入命令
                sp = ReadString (netStream);// 接受返回信息
                if (sp.IndexOf(state) != -1)// 判断状态码是否正确
                    success=true;
            }

            
catch(Exception)
            
{
                
// 忽略错误
            }

            
return success;
        }


        
/// <summary>
        
/// 字符串编码为Base64
        
/// </summary>
        
/// <param name="str">字符串</param>
        
/// <returns>Base64编码的字符串</returns>

        protected string ToBase64 (string str)
        
{
            
try
            
{
                
byte[] by = Encoding.Default.GetBytes (str.ToCharArray());
                str 
= Convert.ToBase64String (by);
            }

            
catch(Exception)
            
{
                
// 忽略错误
            }

            
return str;
        }

 
    }

}

posted on 2006-01-14 09:27  Jin  阅读(500)  评论(0编辑  收藏  举报