asp.net 发送邮件代码
說到發送郵件發送,先提一下SMTP(呵呵,高手就跳過這一段吧!)。 SMTP的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式。SMTP 協議屬于 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。
再簡單介紹一下名稱空間(NameSpace)System.Web.Mail類庫里所提供的郵件發送的對象、屬性和方法
(1)它有三個類:SmtpMail、MailMessage和MailAttachment。這三個對象本文的示例程序代碼中都應用到了!
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。我們需要向[email protected](我的郵箱地址)發送郵件。 那么利用ASP.NET(C#)發送郵件的核心代碼如下:
//核心代碼開始
using System.Web.Mail;
MailMessage objMailMessage;
MailAttachment objMailAttachment;
// 創建一個附件對象
objMailAttachment = new MailAttachment( "d:\\test.txt" );//發送郵件的附件
// 創建郵件消息
objMailMessage = new MailMessage();
objMailMessage.From = "[email protected]";//源郵件地址
objMailMessage.To = "[email protected]";//目的郵件地址,也就是發給我哈
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 [email protected] (友情提示一下:錯誤中的郵件地址有所不同) 然后開始核心代碼,其實和方法(一)的差不多。與(一)的主要區別在于: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 = "[email protected]";//源郵件地址
objMailMessage.To = "[email protected]";//目的郵件地址,也就是發給我哈
objMailMessage.Subject = "郵件發送標題:你好";//發送郵件的標題
objMailMessage.Body = "郵件發送標內容:測試一下是否發送成功!";//發送郵件的內容
objMailMessage.Attachments.Add( objMailAttachment );//將附件附加到郵件消息對象中
//SMTP地址
SmtpMail.SmtpServer = "192.168.1.100";
//開始發送郵件
SmtpMail.Send( objMailMessage );
以上兩種方法介紹到這里。最簡單的利用上面方法是在頁面添加一個服務器按鈕,把除引用的語句放到按鈕單擊事件中去。當然,別忘記了引用的語句放在最上面。
方法一的測試是完全正確,沒有任何問題,但是方法二卻導致郵件無法正確收到(***@sina.com),或者收到后也被放到垃圾郵件中去了(發往[email protected])。