說到電子郵件的發送,還是先提一下SMTP(呵呵,高手就跳過這一段吧。)。 SMTP的全稱是“Simple Mail Transfer Protocol”,即簡易郵件傳輸通訊協定。它是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它協助每台電腦在發送或中轉信件時找到下一個目的地。SMTP 伺服器就是遵循 SMTP 協議的發送郵件伺服器。(引用1)
再簡單介紹一下名稱空間(NameSpace)System.Web.Mail類庫裡所提供的郵件發送的對象、屬性和方法。(引用2)
(1)它有三個類:SmtpMail、MailMessage和MailAttachment。這三個對象本文的樣本程式碼中都應用到了。(引用3)
1. MailMessage ,提供屬性和方法來建立一個郵件訊息對象。(Provides properties and methods for constructing an e-mail message.)
2. MailAttachments – 提供屬性和方法來建立一個郵件附件對象。(Provides properties and methods for constructing an e-mail attachment.)
3. SmtpMail – 提供屬性和方法通過使用windows 2000 CDOSYS 的訊息組件的聯合資料對象來發送郵件訊息)。(Provides properties and methods for sending messages using the Collaboration Data Objects for Windows 2000 (CDOSYS) message component)
(2)各個類的屬性。
1.先簡單介紹SmtpMail的屬性:
SmtpServer -- SMTP的地址。
2.主要來介紹MailMessage對象的屬性
From -- 發送郵件的地址
To -- 接受郵件的地址
Subject -- 郵件的標題
Priority -- 郵件的優先順序(有效值為High,Low,Normal)
Attachments -- 返回一個集合,代表附件
Bcc -- 密送地址
Cc -- 抄送地址
Body -- 擷取或是設定電子郵件訊息的內容
BodyFormat -- 擷取或是設定MailFormat的枚舉值,此值指定訊息體郵件的格式(Html格式、Text格式)
Bodyencoding -- 指定訊息的編碼方式編碼(主要有Base64,UUencode)
其他幾個不重要的省略。
隨便提到密送和抄送的區別:密送就是你群發郵件時收郵件的人無法看到你發給了多少人以及他們的郵件地址,抄送就是群發郵件時收郵件的人則可以看到你發給了多少人以及他們的郵件地址。
(3)SmtpMail類的Send方法,它的目的就是發送郵件,有兩個重載方法。
1. SmtpMail.Send("發送郵件的地址","接受郵件的地址","郵件的標題","郵件訊息的內容")
這個方法很簡單,不適合發送帶附件的郵件。
2. SmtpMail.Send(MailMessage)
此方法複雜、靈活,適合發送附件,而且可以設定MailMessage對象的各種屬性值。
如果我們用ASP.NET寫一個郵件發送的程式,那麼首先應該如何得到SMTP。有兩種方法:第一種方法調用目前知名的郵件服務提供者的SMTP,比如新浪、搜狐、網易的免費電子郵箱的SMTP;第二種方法是自己裝一個SMTP虛擬伺服器,這個在安裝IIS時一起裝上去的(安裝過程就省略了:-) )。
一、在ASP.NET利用知名的郵件服務提供者的SMTP來發送郵件
首先需要去他們的郵件網站上註冊免費郵箱,因為你要使用郵件服務提供者的SMTP,他們需要對身份進行驗證,這樣可以避免產生大量的垃圾郵件。假設我們在新浪的郵件網站(mail.sina.com.cn)上註冊了一個免費電子郵件,使用者名稱是mysina,密碼是chenjie.該帳號為虛構的,請使用自己註冊的使用者名稱稱和密碼代替。我們在新浪的郵件網站獲知它的SMTP地址是:smtp.sina.com.cn。我們需要向scucj@126.com(我的郵箱地址)發送郵件。
那麼利用ASP.NET(C#)發送郵件的核心代碼如下:
//核心代碼開始
using System.Web.Mail;
MailMessage objMailMessage;
MailAttachment objMailAttachment;
// 建立一個附件對象
objMailAttachment = new MailAttachment( "d://test.txt" );//發送郵件的附件
// 建立郵件訊息
objMailMessage = new MailMessage();
objMailMessage.From = "mysina@sina.com";//源郵件地址
objMailMessage.To = "scucj@126.com";//目的郵件地址,也就是發給我哈
objMailMessage.Subject = "郵件發送標題:你好";//發送郵件的標題
objMailMessage.Body = "郵件發送標內容:測試一下是否發送成功。";//發送郵件的內容
objMailMessage.Attachments.Add( objMailAttachment );//將附件附加到郵件訊息對象中
//接著利用sina的SMTP來發送郵件,需要使用Microsoft .NET Framework SDK v1.1和它以上的版本
//基本許可權
objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
//使用者名稱
objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "mysina") ;
//密碼
objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "chenjie");
//如果沒有上述三行代碼,則出現如下錯誤提示:伺服器拒絕了一個或多個收件者地址。伺服器響應為: 554 : Client host rejected: Access denied
//SMTP地址
SmtpMail.SmtpServer = "smtp.sina.com.cn";
//開始發送郵件
SmtpMail.Send( objMailMessage );
//核心代碼結束
二、在ASP.NET利用原生SMTP虛擬伺服器的SMTP來發送郵件
首先說一下SMTP配置。
(1)右鍵點擊“SMTP虛擬伺服器”選擇“屬性”->在“常規”選項卡中設定“IP地址(P)”,我設定的是192.168.1.100。
(2)選擇“訪問”選項卡,點擊“中繼”,選上“僅以下列表”(預設是被選上的),點擊“添加”,在“單台電腦”中加入192.168.1.100。
提示,如果沒有完成(2),則會出現大家常見的一種錯誤提示:伺服器拒絕了一個或多個收件者地址。伺服器響應為: 550 5.7.1 Unable to relay for scucj@126.com
(友情提示一下:錯誤中的郵件地址有所不同)
然後開始核心代碼,其實和方法(一)的差不多。與(一)的主要區別在於:1.SMTP的不同,
2.objMailMessage.From中本方法可以隨便填寫,但是(一)中別隨便填寫那麼利用ASP.NET(C#)發送郵件的核心代碼如下:
//核心代碼開始
using System.Web.Mail;
MailMessage objMailMessage;
MailAttachment objMailAttachment;
// 建立一個附件對象
objMailAttachment = new MailAttachment( "d://test.txt" );//發送郵件的附件
// 建立郵件訊息
objMailMessage = new MailMessage();
objMailMessage.From = "mysina@sina.com";//源郵件地址
objMailMessage.To = "scucj@126.com";//目的郵件地址,也就是發給我哈
objMailMessage.Subject = "郵件發送標題:你好";//發送郵件的標題
objMailMessage.Body = "郵件發送標內容:測試一下是否發送成功。";//發送郵件的內容
objMailMessage.Attachments.Add( objMailAttachment );//將附件附加到郵件訊息對象中
//SMTP地址
SmtpMail.SmtpServer = "192.168.1.100";
//開始發送郵件
SmtpMail.Send( objMailMessage );
以上兩種方法介紹到這裡。最簡單的利用上面方法是在頁面添加一個伺服器按鈕,把除引用的語句放到按鈕單擊事件中去。當然,別忘記了引用的語句放在最上面。
方法一的測試是完全正確,沒有任何問題,但是方法二卻導致郵件無法正確收到(***@sina.com),或者收到後也被放到垃圾郵件中去了(發往scucj@126.com)。
希望和大家討論一下如何改進方法二。
引用1:http://zhidao.baidu.com/question/1494562.html
引用2:部分參考了http://www.tongyi.net/webdevelop/asp.net/1011882.html和《ASP.NET技術內幕》第813頁。
引用3:http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/cpref/HTML/frlrfsystemwebmail.ASP