邮件发送详解
電子郵件在Internet上發(fā)送和接收其實(shí)和我們?nèi)粘I钪械泥]寄服務(wù)一樣:當(dāng)我們要寄一個(gè)包裹的時(shí)候,我們首先要找到一個(gè)有這項(xiàng)業(yè)務(wù)的郵局,在填寫完收件人姓名、地址等信息之后,包裹就寄到了收件人所在地的郵局,那么對(duì)方取包裹的時(shí)候就必須去這個(gè)郵局才能取出。同樣的,當(dāng)我們發(fā)送電子郵件的時(shí)候,這封郵件是由郵件發(fā)送服務(wù)器(任何一個(gè)都可以)發(fā)出,并根據(jù)收信人的地址判斷對(duì)方的郵件接收服務(wù)器而將這封信發(fā)送到該服務(wù)器上,收信人要收取郵件也只能訪問這個(gè)服務(wù)器才能夠完成。
電子郵件工作原理
電子郵件的工作過程遵循客戶-服務(wù)器模式。每份電子郵件的發(fā)送都要涉及到發(fā)送方與接收方,發(fā)送方式構(gòu)成客戶端,而接收方構(gòu)成服務(wù)器,服務(wù)器含有眾多用戶的電子信箱。發(fā)送方通過郵件客戶程序,將編輯好的電子郵件向郵局服務(wù)器(SMTP服務(wù)器)發(fā)送。郵局服務(wù)器識(shí)別接收者的地址,并向管理該地址的郵件服務(wù)器(POP3服務(wù)器)發(fā)送消息。郵件服務(wù)器識(shí)將消息存放在接收者的電子信箱內(nèi),并告知接收者有新郵件到來。接收者通過郵件客戶程序連接到服務(wù)器后,就會(huì)看到服務(wù)器的通知,進(jìn)而打開自己的電子信箱來查收郵件。
通常Internet上的個(gè)人用戶不能直接接收電子郵件,而是通過申請(qǐng)ISP(Internet Service Provider的縮寫,意為“Internet服務(wù)提供商”)主機(jī)的一個(gè)電子信箱,由ISP主機(jī)負(fù)責(zé)電子郵件的接收。一旦有用戶的電子郵件到來,ISP主機(jī)就將郵件移到用戶的電子信箱內(nèi),并通知用戶有新郵件。因此,當(dāng)發(fā)送一條電子郵件給一另一個(gè)客戶時(shí),電子郵件首先從用戶計(jì)算機(jī)發(fā)送到ISP主機(jī),再到Internet,再到收件人的ISP主機(jī),最后到收件人的個(gè)人計(jì)算機(jī)。
ISP主機(jī)起著“郵局”的作用,管理著眾多用戶的電子信箱。每個(gè)用戶的電子信箱實(shí)際上就是用戶所申請(qǐng)的帳號(hào)名。每個(gè)用戶的電子郵件信箱都要占用 ISP主機(jī)一定容量的硬盤空間,由于這一空間是有限的,因此用戶要定期查收和閱讀電子信箱中的郵件,以便騰出空間來接收新的郵件。
電子郵件在發(fā)送與接收過程中都要遵循SMTP、POP3等協(xié)議,這些協(xié)議確保了電子郵件在各種不同系統(tǒng)之間的傳輸。其中,SMTP負(fù)責(zé)電子郵件的發(fā)送,而POP3則用于接收Internet上的電子郵件。
最簡(jiǎn)單的郵件發(fā)送流程如圖:
如果將這個(gè)網(wǎng)絡(luò)分的更細(xì)一點(diǎn),其具體的流程圖如下:
當(dāng)然在我們的實(shí)際的應(yīng)用中,特別是架設(shè)比較龐大的郵件系統(tǒng)的時(shí)候,涉及的技術(shù)更多、更復(fù)雜,如果是多臺(tái)收件服務(wù)器、多臺(tái)發(fā)件服務(wù)器,就要再附加一臺(tái)服務(wù)器做負(fù)載均衡。里面還要涉及防火墻、垃圾過濾一些安全問題。盡管這些不是我們平時(shí)能夠的用的著的,但是了解這些還是必須的。
ASP.net發(fā)送郵件
電子郵件是最初的網(wǎng)絡(luò)通信技術(shù),在信息技術(shù)高速發(fā)展的今天,電子郵件已經(jīng)作為一種不可或缺的通信方式深入到了企業(yè)的各個(gè)層面。最常見的就是我們熟知的bug報(bào)告、密碼重置通知、申請(qǐng)確認(rèn)等。特別是我們?cè)趶氖缕髽I(yè)軟件開發(fā)的時(shí)候,常常要用到電子郵件技術(shù)。
而微軟的ASP.NET很好的將其進(jìn)行了封裝,使得發(fā)送電子郵件十分便捷。在.net框架1.x版本中ystem.Web.Mail已經(jīng)實(shí)現(xiàn)了這一點(diǎn)。但是其通過的是第三方控件實(shí)現(xiàn)的,具體的代碼會(huì)在后面介紹。在后來的2.0版本已經(jīng)將其很好的封裝在System.Net.Mail中,在這里面有最核心的兩個(gè)類,即MailMessage和SmtpClient。
· MailMessage:描述一個(gè)電子郵件消息;它擁有From,To,Subject,Body,Attachments等屬性;
· SmtpClient:把一個(gè)指定的MailMessage實(shí)例發(fā)送到一個(gè)指定的SMTP服務(wù)器。
我們只要將對(duì)象的屬性賦值,就能順利發(fā)送一封電子郵件了。流程圖如下:
注意:在郵件發(fā)送的過程中會(huì)產(chǎn)生異常,比較常見的就是SmtpException,所以發(fā)送一定要進(jìn)行try,catch操作,捕捉可能出現(xiàn)的異常。
初始化MailMessage實(shí)例:
///<summary>
///郵件初始化
///為了簡(jiǎn)單,自己發(fā)個(gè)自己
///</summary>
///<returns></returns>
publicMailMessageInitMail(stringAddress)
{
MailMessagemail=newMailMessage();
//發(fā)件人
mail.From=newMailAddress(Address);
//收件人
mail.To.Add(newMailAddress(Address));
//主題
mail.Subject="ASP.NETsendmailtesting!";
//內(nèi)容
mail.Body="Welcometojoinus,letmeinstruducemyself!";
//郵件主題和正文編碼格式
mail.SubjectEncoding=System.Text.Encoding.UTF8;
mail.BodyEncoding=System.Text.Encoding.UTF8;
//郵件正文是Html編碼
mail.IsBodyHtml=true;
//優(yōu)先級(jí)
mail.Priority=MailPriority.High;
//密件抄送收件人
mail.Bcc.Add(Address);
//抄送收件人
mail.CC.Add(Address);
//添加附件
mail.Attachments.Add(newAttachment("d:\\1.txt"));
mail.Attachments.Add(newAttachment("d:\\2.txt"));
mail.Attachments.Add(newAttachment("d:\\3.txt"));
returnmail;
}
發(fā)送Gmail郵件。端口號(hào)為25、587成功。
///<summary>
///發(fā)送Gmail
///</summary>
publicboolSendGmail()
{
SmtpClientclient=newSmtpClient();
client.Credentials=newSystem.Net.NetworkCredential("userName","password");
//上述寫你的GMail郵箱和密碼
client.Port=587;//Gmail使用的端口
client.Host="smtp.gmail.com";
client.EnableSsl=true;//經(jīng)過ssl加密
try
{
client.Send(InitMail("userName@gmail.com"));
returntrue;
}
catch(System.Net.Mail.SmtpExceptionex)
{
returnfalse;
}
}
效果圖:
.net框架1.x版本中的發(fā)送電子郵件源碼
publicboolsendMail(stringsender,stringreceiver,stringtitle,stringcontent)
{
MailMessagemail=newMailMessage();
mail.From=sender;
mail.To=receiver;
mail.Body=content;
mail.Subject=title;
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername","username");//發(fā)送方郵件帳戶
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword","passw");//發(fā)送方郵件密碼
try
{
SmtpMail.SmtpServer="smtp."+sender.Substring(sender.IndexOf("@")+1);
SmtpMail.Send(mail);
returntrue;
}
catch
{
returnfalse;
}
}
總結(jié)
- 上一篇: 保幼化风丹_功效作用注意事项用药禁忌用法
- 下一篇: 如何禁止访问路由器登录界面如何防止访问路