求SMTP发信的完整例子!
要求 C# 编写,注视清楚!
包括服务器验证!
包括附件!
问题点数:100、回复次数:18Top
1 楼xiaxilin(彩色电脑)回复于 2005-12-30 19:21:25 得分 0
邮箱给我
Top
2 楼xiaxilin(彩色电脑)回复于 2005-12-30 19:23:37 得分 40
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections;
namespace Sinx.Common.Web.Mail
{
#region AspNetPager Server Control or Windows Server Control
/// <summary>
/// 邮件可以通过 Microsoft Windows 2000 中内置的 SMTP 邮件服务或任意 SMTP 服务器来传送
/// </summary>
public class SmtpMail
{
private string enter="\r\n";
/// <summary>
/// 设定语言代码,默认设定为GB2312,如不需要可设置为""
/// </summary>
private string _charset="GB2312";
/// <summary>
/// 发件人地址
/// </summary>
private string _from="";
/// <summary>
/// 发件人姓名
/// </summary>
private string _fromName="";
/// <summary>
/// 回复邮件地址
/// </summary>
///public string ReplyTo="";
/// <summary>
/// 收件人姓名
/// </summary>
private 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>
private bool _html=false;
/// <summary>
/// 邮件附件列表
/// </summary>
private IList Attachments;
/// <summary>
/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"
/// </summary>
private string priority="Normal";
/// <summary>
/// 邮件主题
/// </summary>
private string _subject;
/// <summary>
/// 邮件正文
/// </summary>
private string _body;
/// <summary>
/// 密送收件人列表
/// </summary>
///private Hashtable RecipientBCC=new Hashtable();
/// <summary>
/// 收件人数量
/// </summary>
private int RecipientNum=0;
/// <summary>
/// 最多收件人数量
/// </summary>
private int recipientmaxnum=5;
/// <summary>
/// 密件收件人数量
/// </summary>
///private int RecipientBCCNum=0;
/// <summary>
/// 错误消息反馈
/// </summary>
private string errmsg;
/// <summary>
/// TcpClient对象,用于连接服务器
/// </summary>
private TcpClient tc;
/// <summary>
/// NetworkStream对象
/// </summary>
private NetworkStream ns;
/// <summary>
/// 服务器交互记录
/// </summary>
private string logs="";
/// <summary>
/// SMTP错误代码哈希表
/// </summary>
private Hashtable ErrCodeHT = new Hashtable();
/// <summary>
/// SMTP正确代码哈希表
/// </summary>
private Hashtable RightCodeHT = new Hashtable();
/// <summary>
/// 初始化 <see cref="Lion.Web.Mail.SmtpMail"/> 类的新实例
/// </summary>
public SmtpMail()
{
Attachments = new System.Collections.ArrayList();
}Top
3 楼xiaxilin(彩色电脑)回复于 2005-12-30 19:24:00 得分 0
#region Properties
/// <summary>
/// 邮件主题
/// </summary>
public string Subject
{
get
{
return this._subject;
}
set
{
this._subject = value;
}
}
/// <summary>
/// 邮件正文
/// </summary>
public string Body
{
get
{
return this._body;
}
set
{
this._body = value;
}
}
/// <summary>
/// 发件人地址
/// </summary>
public string From
{
get
{
return _from;
}
set
{
this._from = value;
}
}
/// <summary>
/// 设定语言代码,默认设定为GB2312,如不需要可设置为""
/// </summary>
public string Charset
{
get
{
return this._charset;
}
set
{
this._charset = value;
}
}
/// <summary>
/// 发件人姓名
/// </summary>
public string FromName
{
get
{
return this._fromName;
}
set
{
this._fromName = value;
}
}
/// <summary>
/// 收件人姓名
/// </summary>
public string RecipientName
{
get
{
return this._recipientName;
}
set
{
this._recipientName = value;
}
}
/// <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>
/// 是否Html邮件
/// </summary>
public bool Html
{
get
{
return this._html;
}
set
{
this._html = value;
}
}
/// <summary>
/// 错误消息反馈
/// </summary>
public string ErrorMessage
{
get
{
return errmsg;
}
}
/// <summary>
/// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我(lion-a@sohu.com),我将尽快查明原因。
/// </summary>
public string Logs
{
get
{
return logs;
}
}
/// <summary>
/// 最多收件人数量
/// </summary>
public int RecipientMaxNum
{
set
{
recipientmaxnum = value;
}
}
#endregion
#region Methods
/// <summary>
/// 添加邮件附件
/// </summary>
/// <param name="FilePath">附件绝对路径</param>
public void AddAttachment(params string[] FilePath)
{
if(FilePath==null)
{
throw(new ArgumentNullException("FilePath"));
}
for(int i=0;i<FilePath.Length;i++)
{
Attachments.Add(FilePath[i]);
}
}
/// <summary>
/// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组
/// </summary>
/// <param name="Recipients">保存有收件人地址的字符串数组(不超过recipientmaxnum个)</param>
public bool AddRecipient(params string[] Recipients)
{
if(Recipient==null)
{
Dispose();
throw(new ArgumentNullException("Recipients"));
}
for(int i=0;i<Recipients.Length;i++)
{
string recipient = Recipients[i].Trim();
if(recipient==String.Empty)
{
Dispose();
throw(new ArgumentNullException("Recipients["+ i +"]"));
}
if(recipient.IndexOf("@")==-1)
{
Dispose();
throw(new ArgumentException("Recipients.IndexOf(\"@\")==-1","Recipients"));
}
if(!AddRecipient(recipient))
{
return false;
}
}
return true;
}
/// <summary>
/// 发送邮件方法,所有参数均通过属性设置。
/// </summary>
public bool Send()
{
if(mailserver.Trim()=="")
{
throw(new ArgumentNullException("Recipient","必须指定SMTP服务器"));
}
return SendEmail();
}Top
4 楼epaib(放下)回复于 2005-12-30 20:13:25 得分 0
public void SendMail()
{
try
{
MailMessage MM=new MailMessage();
MM.From=this.EmailFrom.Text; //发送方地址
MM.To=this.EmailTo.Text; //接收方地址
MM.Subject=this.EmailSubject.Text; //主题
MM.Body=this.EmailBody.Text; //内容
//设置为需要用户验证
MM.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
//设置验证用户名(把emailaddress改为你的验证用户名)
MM.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "emailaddress");
//设置验证密码(把password改为你的验证密码)
MM.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "password");
//MM.Fields.Add("http://
SmtpMail.SmtpServer = "smtp.163.com"; //邮件服务器地址
SmtpMail.Send(MM);
}
catch(Exception ex)
{
throw (ex);
}
Top
5 楼CMIC(大象)回复于 2005-12-30 20:18:01 得分 0
http://blog.joycode.com/joy/archive/2004/01/14/11405.aspxTop
6 楼zhzuo(秋枫)回复于 2005-12-30 20:29:20 得分 0
http://www.systemwebmail.com/default.aspx
Top
7 楼huing(缥缈孤风)回复于 2005-12-31 09:17:40 得分 0
看到这么多的高人指点 mark一下哈Top
8 楼zjlijunmin(hiahia)回复于 2005-12-31 09:40:40 得分 0
学习Top
9 楼xiaxilin(彩色电脑)回复于 2005-12-31 10:18:30 得分 20
http://blog.csdn.net/xiaxilin/archive/2005/12/30/566541.aspx
这个是我原来引用的别人的Top
10 楼z_hp()回复于 2005-12-31 10:21:20 得分 0
upTop
11 楼qzj(SoldierQ)回复于 2005-12-31 10:38:15 得分 0
http://www.codeproject.com/vb/net/QMailClient.asp
基于Socket实现的SMTP和POP3协议Top
12 楼koenemy(小妮她爹--给孩子起个名太费劲)回复于 2005-12-31 10:51:08 得分 0
糊一个我写的
public void SmtpSend(out bool _Succeed)
{
_Succeed = false;
// 创建TcpClient对象, 并建立连接
TcpClient tcp = null;
try{tcp = new TcpClient(_EmailParameters.server,EmailParameters.port);}
catch{return;}
if(ReadString (tcp.GetStream()).Substring(0,3)!="220")//获取连接信息
return;
if (!Command (tcp.GetStream(), "EHLO Localhost", "250"))// 开始进行服务器认证
return;
if (!Command (tcp.GetStream(), "AUTH LOGIN", "334"))// 需要身份验证
return;
if (!Command (tcp.GetStream(), ToBase64 (_EmailParameters.username), "334"))// 此处将username转换为Base64码
return;
if (!Command (tcp.GetStream(), ToBase64 (_EmailParameters.password), "235"))// 此处将password转换为Base64码
return;
// 准备发送
WriteString (tcp.GetStream(), "mail From: " + _EmailParameters.from);
WriteString (tcp.GetStream(), "rcpt to: " + _EmailParameters.to);
WriteString (tcp.GetStream(), "data");
// 发送邮件头
WriteString (tcp.GetStream(), "Date: " + DateTime.Now); // 时间
WriteString (tcp.GetStream(), "From: " + _EmailParameters.fromname + "<" + _EmailParameters.from + ">"); // 发件人
WriteString (tcp.GetStream(), "Subject: " + _EmailParameters.subject); // 主题
WriteString (tcp.GetStream(), "To:" + _EmailParameters.toname + "<" + _EmailParameters.to + ">"); // 收件人
//邮件格式
WriteString (tcp.GetStream(), "Reply-To:" + _EmailParameters.from); // 回复地址
WriteString (tcp.GetStream(), "X-Priority:" + EmailParameters.priority); // 优先级
WriteString (tcp.GetStream(), "MIME-Version:1.0"); // MIME版本
// 数据ID,随意
WriteString (tcp.GetStream(), "Content-Type: text/html;charset=" + EmailParameters.languageencoding);
WriteString (tcp.GetStream(), "Content-Transfer-Encoding:" + EmailParameters.encoding);
WriteString (tcp.GetStream(), "");
WriteString (tcp.GetStream(), "");
WriteString (tcp.GetStream(), _EmailParameters.content);
WriteString (tcp.GetStream(), "."); // 最后写完了,输入"."
// 关闭连接
tcp.Close ();
_Succeed = true;
}
Top
13 楼koenemy(小妮她爹--给孩子起个名太费劲)回复于 2005-12-31 10:51:24 得分 0
protected void WriteString (NetworkStream netStream, string str)
{
str = str + "\r\n"; // 加入换行符
byte[] bWrite = Encoding.Default.GetBytes(str);
try{netStream.Write(bWrite,0,bWrite.Length);}
catch{}
}
/// <summary>
/// 从流中读取字符
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>
/// 发出命令并判断返回信息是否正确
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{}
return success;
}
/// <summary>
/// 字符串编码为Base64
protected string ToBase64 (string str)
{
try
{
byte[] by = Encoding.Default.GetBytes (str);
str = Convert.ToBase64String (by);
}
catch{}
return str;
}Top
14 楼koenemy(小妮她爹--给孩子起个名太费劲)回复于 2005-12-31 10:52:29 得分 40
public struct EmailParameters
{
public static int priority = 3;//邮件优先级
public static string encoding = "8bit";
public static string languageencoding = "GB2312";
public static int port = 25;
public string username;
public string password;
public string from;//发件人地址
public string subject;//主题
public string content;//文本内容
public string to;//收件人
public string fromname;//发送者称呼
public string toname;//发送者称呼
public string server;//邮件服务器MX地址
public int MemberId;//Member表ID
public int EventId;//_Status_EmailSend表状态ID
public SqlConnection conn;//是否成功写数据库连接
}Top
15 楼califord(远方)回复于 2005-12-31 23:26:44 得分 0
同时也发到我的信箱里吧?可以吗?
qqmmxx@163.com
谢了,要是楼主看到了,也帮发到我的信箱里好吗?
感谢Top
16 楼timiil(小华)回复于 2005-12-31 23:33:51 得分 0
markTop
17 楼tony0115(下辈子不做技术!)回复于 2006-01-04 14:43:11 得分 0
xiaxilin 贴的例子我也知道到过,但我试验了石油问题的,会丢失内容
其他各位的我正在试验,请等等Top
18 楼wlwsoft(科技是第一生产力)回复于 2006-01-04 15:05:04 得分 0
msdn2003 上自带一个例子,你可以去看一下Top




