作為一名.Net開發,"郵件發送"功能的開發和使用是必須要掌握的,因為這個功能作為“消息推送”的一種手段經常出現在各種.Net系統中,所以本文將對.Net平台下的“郵件發送”,做一個細致的分析!
一、who需要郵件功能
1、服務提供方:需提供郵件收發客戶端或Web服務。如:QQ郵箱、GMail郵箱、126、163等知名郵件服務提供商。注:如果你使用的第三方不知名郵件服務商提供的郵件收發服務,通過其發出的郵件,可能會被其他知名郵件服務提供商的STMP服務器視為是"惡意郵件或垃圾郵件"!
2、消息推送:消息推送方
3、App:某些網站會員的注冊功能或者功能激活功能。
等等....
二、郵件協議
1、SMTP(Simple Mail Transfer Protocol) ---簡單郵件傳輸協議
它是一組用於源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式SMTP協議屬於TCP/IP協議簇,它幫助每台計算機在發送或者中轉信件時找到下一個地址。通過SMTP協議指定的服務器地址,就可以把E-Mail寄到指定的收件人的服務器上了.整個過程只需要幾分鍾.它使用由TCP提供的可靠的數據傳輸服務把郵件消息從發信人的郵件服務器傳送到收信人的郵件服務器。
注:SMTP服務器是遵循SMTP協議的發送郵件,用來發送或者中轉發出的郵件。
詳細請參考百度百科
2、POP3(Post Office Protocol -Version3) ---郵局協議第三個版本
它是TCP/IP協議中的一員,由RFC1939 定義,這個協議主要支持客戶端遠程管理在服務器上的電子郵件。注:提供了SSL加密的POP3協議被稱為POP3S.
注:POP協議支持"離線"郵件處理。其具體過程是:郵件發送到服務器上,電子郵件客戶端調用郵件客戶程序用來連接服務端,並下載所有未閱讀的電子郵件。這種離線模式稱為存儲轉發模式,將郵件從服務器從郵件服務器送到個人終端上,一般是PC機或者MAC,一旦郵件發送到PC或者MAC上,存儲在服務器上的郵件會立刻被刪除,但目前的POP3郵件服務器都可以"只下載郵件,服務器端並不刪除.",也就是改進的POP3協議.OP適用於C/S結構的脫機模型的電子郵件協議,目前已發展POP3到第三版,稱POP3。脫機模型即不能在線操作,POP不支持對服務器郵件進行擴展操作,此過程需要更高級的IMAP4協議來完成。支持POP協議使用ASCII碼來傳輸數據消息,這些數據消息可以是指令,也可以是應答。
詳細請參考百度百科
3、IMAP4(Internet Message Acess Protocol -Version4) ---交互式數據消息訪問協議第四個版本
IMAP協議是由斯坦福大學的Mark Crispin教授在1986年開發的,后期版本是華盛頓州立大學進行開發的,IMAP4是TCP/IP協議族中的一員,現在的版本是“IMAP第四版第一次修訂版”(IMAP4rev1)。IMAP4協議與POP3協議一樣也是規定個人計算機如何訪問網上的郵件的服務器進行收發郵件的協議,但是IMAP4協議同POP3協議相比更高級。IMAP4支持協議客戶機在線或者離開訪問並閱讀服務器上的郵件,還能交互式的操作服務器上的郵件。IMAP4協議更人性化的地方是不需要像POP3協議那樣把郵件下載到本地,用戶可以通過客戶端直接對服務器上的郵件進行操作(這里的操作是指:在線閱讀郵件 在線查看郵件主題 大小 發件地址等信息)。用戶還可以在服務器上維護自己郵件目錄(維護是指移動)新建 刪除重命名共享 抓取文本 等操作)。IMAP4協議彌補了POP3協議的很多缺陷,,由RFC3501定義。本協議是用於客戶機遠程訪問服務器上電子郵件,它是郵件傳輸協議新的標准。
詳細請參考百度百科
三、郵箱分類
現階段的郵箱主要有以下幾種:免費郵箱、vip郵箱、域名郵箱、企業郵箱.......。
1、免費郵箱
“免費郵箱”是郵件商家為任何人免費提供的電子郵件傳輸服務,作為交換,該網站上你請求電子郵件服務和一些個人信息的地方會顯示廣告。它更適合個人生活和娛樂的需要,卻並非那么注重郵箱的安全和功能。
部分免費郵件SMTP服務器參考設置:
Email類型 |
SMTP[Host]主服務器 |
Port[端口號] |
是否可啟用SSL |
Gmail(Google 的網絡郵件服務) |
smtp.gmail.com |
587 |
True |
HotMail/Live |
smtp.live.com |
25 |
True |
QQ/FoxMail(Foxmail被騰訊收購) |
smtp.qq.com |
25 |
False |
smtp.126.com |
25 |
False |
|
smtp.163.com |
25 |
False |
|
Sina(新浪郵箱) |
smtp.sina.com |
25 |
False |
Tom |
smtp.tom.com |
25 |
False |
SoHu(搜狐郵箱) |
smtp.sohu.com |
25 |
False |
smtp.mail.yahoo.com |
25 |
False |
2、vip郵箱
“vip郵箱”即郵件商家提供的收費版郵件服務,在速度、安全、穩定性、容量、附件大小限制、群發數等方面相對好些。其SMTP服務器設置就是多了個vip字符。eg:smtp.vip.qq.com。郵箱地址:369220123@vip.qq.com。
3、域名郵箱
“域名郵箱”是個性化郵件服務,能讓您用自己的域名做為后綴即“@自己的域名”,前提是你需要一個域名(通常域名要收費)。功能比免費郵箱要多:可分配單個郵箱、規划容量、更加的安全、更好的穩定性、個性化名稱、郵件發送量更大、附件大小限制等等。
4、企業郵箱
“企業郵箱”是域名郵箱,但通常是指通過付費方式獲得更好服務的郵箱。eg:您公司域名為www.abc.com,則SMTP服務器為:mail.abc.com,郵箱地址:office@abc.com;
使用企業郵箱的優勢:
1) 提升公司企業形象、郵箱穩定性、郵箱反垃圾反病毒性能、郵件收發速度;
2) 通過購買服務,能適應企業不斷升級需求;
3) 為員工分配(域名)企業郵箱,便於將流動員工所有業務聯系保留和延續下來;
4) 監控郵件(實際為郵件暗抄送功能),以防公司的機密和重要信息流失;
5) 獲得高性能郵件海外轉發功能,解決國際高效郵件收發、郵件營銷有效投遞等問題;
6) 出站電子郵件過濾,比如:敏感字過濾、基於政策郵件加密等等;
7) 等等。
四、.Net提供的關於郵件的類庫
在.Net2.0之前的版本,使用System.Web.Mail發送郵件,在2.0之后的版本,使用System.Net.Mail來發送郵件.2.0之后的版本主要用到了.Net2.0之后新增的兩個類,分別是System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient兩個類,在SMTP身份驗證方面用到了System.Net.NetworkCredential類。
1、MailMessage類的使用,如下表格:
屬性名 | 屬性值要求的類型 | 屬性值的意義 |
From | MailAddress | 獲取或設置此電子郵件的發信人地址。 兩者區別:當 Sender與From 都有設定時,Mail Server 會取用Sender 的設定發信,但郵件上的名稱會使用 From 的設定,而若不需要 Sender 和 From 同時設定時,則 Sender 可以免設,但 From 一定要設。詳細請看:《MailMessage 的 Sender 和From? 傻傻分不清楚》 |
Sender
|
||
To | MailAddressCollection | 獲取包含此電子郵件的收件人的地址集合。 |
CC | MailAddressCollection | 獲取包含此電子郵件的抄送 (CC) 收件人的地址集合。 |
Bcc | MailAddressCollection | 獲取包含此電子郵件的密件抄送(BCC) 收件人的地址集合。 |
Attachments | AttachmentCollection | 獲取用於存儲附加到此電子郵件的數據的附件集合。 |
Headers | NameValueCollection | 獲取與此電子郵件一起傳輸的電子郵件標頭。(例如用於:發送DKIM簽名的郵件) |
Subject | string | 獲取或設置此電子郵件的主題。 |
Body | string | 獲取或設置郵件正文。 |
AlternateViews | AlternateViewCollection | 指定一個電子郵件不同格式顯示的副本。(eg:發送HTML格式的郵件,可能希望同時提供郵件的純文本格式,以防止一些收件人使用的電子郵件閱讀程序無法顯示html內容) |
IsBodyHtml | bool | 默認false。獲取或設置指示郵件正文是否為 Html 格式的值。 |
Priority | MailPriority | 默認Normal。獲取或設置此電子郵件的優先級。(Normal | Low| High) |
HeadersEncoding | Encoding | 獲取或設置此電子郵件的用戶定義的自定義標題使用的編碼。 |
SubjectEncoding | Encoding | 獲取或設置此電子郵件的主題內容使用的編碼。 |
BodyEncoding | Encoding | 獲取或設置用於郵件正文的編碼。 |
ReplyToList | MailAddressCollection | 設置接收方回復郵件時默認的接收地址,eg:你用一個郵箱發信,但卻用另一個來收信。 (ReplyTo,表示單個回復地址,已過期,使用ReplyToList代替) |
DeliveryNotificationOptions 注:這個屬性要配合BuildDeliveryStatusNotificationString()方法一起使用 |
DeliveryNotificationOptions(枚舉)
|
// 摘要: |
2、SmtpClient類的使用 如下表格:
屬性名 | 屬性值要求的類型 | 屬性值的意義 |
Host | string | 獲取或設置用於 SMTP 事務的主機的名稱或 IP 地址。 |
Port | int | 獲取或設置用於 SMTP 事務的端口。 |
UseDefaultCredentials | bool | 默認false。 若要使用默認網絡憑據,可以將UseDefaultCredentials設置為 true,此時System.Net.CredentialCache.DefaultCredentials(應用程序系統憑證)會隨請求一起發送。 如果UseDefaultCredentials屬性設置為 false,則連接到服務器時會將 Credentials 屬性中設置的值用作憑據。如果UseDefaultCredentials屬性設置為 false 並且尚未設置 Credentials 屬性,則將郵件以匿名方式發送到服務器。若SMTP 服務器要求在驗證客戶端的身份則會拋出異常。 |
Credentials | ICredentialsByHost | 獲取或設置用於驗證發件人身份的憑據。 |
ClientCertificates | X509CertificateCollection | 指定應該使用哪些證書來建立安全套接字層 (SSL) 連接。 |
EnableSsl | bool | 默認false。指定SmtpClient是否使用安全套接字層 (SSL)加密連接。 |
Timeout | int | 默認100000.獲取或設置一個值,該值指定同步重載:SmtpClient.Send()調用的超時時間。 |
自建本地SMTP服務器獲取郵件時需要使用到的屬性 | ||
DeliveryMethod | SmtpDeliveryMethod | 默認NetworkCredential。 // 摘要: |
PickupDirectoryLocation | string | 獲取或設置文件夾,應用程序在該文件夾中保存將由本地 SMTP 服務器處理的郵件。 |
TargetName | string | "SMTPSVC/" + this.host。獲取或設置在使用擴展保護時用於身份驗證的服務提供程序名稱 (SPN)。 |
ServicePoint | ServicePoint | 獲取用於傳輸電子郵件的網絡連接。(應該會保存TCP連接,避免再次進行TCP的三次握手???) |
五、實戰
實戰使用QQ郵箱.首先打開“POP3/SMTP服務”,圖解如下:
保存授權碼,這個很重要!!!
1、簡單郵件發送功能
上面兩個關鍵類介紹完之后,就可以開始編寫簡單的郵件發送功能了.代碼如下:
MailMessage mm = new MailMessage(); mm.From = new MailAddress(From, "張三", Encoding.UTF8); mm.To.Add(new MailAddress(To)); mm.BodyEncoding = Encoding.UTF8; mm.SubjectEncoding = Encoding.UTF8; mm.Subject = "this is a test email"; mm.Body = "this is a test body<div><a href=\"http://www.baidu.com\">百度</a></div>"; mm.IsBodyHtml = true; SmtpClient sc = new SmtpClient("smtp.qq.com", 587); sc.Credentials = new NetworkCredential(From,Pwssword);//此處的password參數填剛剛保存的授權碼 sc.EnableSsl = true; sc.Send(mm);
ok,如果上面的操作都正確的話,那么郵件將會發送成功。
2、郵件內容內嵌圖片和mp3,注:不是以附件的形式發過去
(1)、通過超鏈接的方式
MailMessage mm = new MailMessage(); mm.From = new MailAddress(From, "張三", Encoding.UTF8); mm.To.Add(new MailAddress(To)); mm.BodyEncoding = Encoding.UTF8; mm.SubjectEncoding = Encoding.UTF8; mm.Subject = "this is a test email"; //通過超鏈接鏈接網絡上的圖片 mm.Body = "this is a test body<div><a href=\"http://www.baidu.com\">百度</a><img src='https://www.baidu.com/img/bd_logo1.png'/></div>"; mm.IsBodyHtml = true; SmtpClient sc = new SmtpClient("smtp.qq.com", 587); sc.Credentials = new NetworkCredential(From,Pwssword);//此處的password參數填剛剛保存的授權碼 sc.EnableSsl = true; sc.Send(mm);
(2)、通過AttachmentBase的屬性ContentId和ContentDisposition類來實現內嵌資源,代碼如下:
對於文件附件,可以使用 ContentDisposition 的屬性來設置文件大小、文件的創建日期、上次讀取文件的日期以及上次修改文件的日期。對於所有附件,考慮到附件有可能會存儲到接收計算機上,可以設置一個建議的文件名。顯示電子郵件的軟件可以使用 ContentDisposition 中的信息,按發件人預期的方式呈現電子郵件附件。
通過 ContentDisposition 實例的Inline屬性實現郵件內嵌資源。如下:
設置附件的ContentId屬性為一個自定義名稱。
設置附件的ContentDisposition.Inline屬性為true。
在郵件的HTML格式正文中以“cid:自定義名稱”的方式引用,比如ContentId設為“face”,那么正文中就以“cid:face”作為其URL路徑字符串的替代即可。
關於ContentDisposition類的詳細信息,請參考MSDN
MailMessage mm = new MailMessage(); mm.From = new MailAddress(From, "張三", Encoding.UTF8); mm.To.Add(new MailAddress(To)); mm.BodyEncoding = Encoding.UTF8; mm.SubjectEncoding = Encoding.UTF8; mm.Subject = "this is a test email"; mm.Attachments.Add(new Attachment(@"C:\Users\Administrator\Desktop\QQ圖片20170813165544.png")); mm.Attachments[0].ContentId = "TestPic"; mm.Attachments[0].ContentDisposition.Inline = true;//設置內嵌圖片的關鍵屬性 mm.Attachments[0].NameEncoding = mm.SubjectEncoding = mm.HeadersEncoding = mm.BodyEncoding = Encoding.UTF8; mm.Body = string.Format("this is a test body<div><a href=\"http://www.baidu.com\">百度</a><img src='{0}' /><a href='{0}' target='_blank'>點擊新窗口打開圖片</a></div>", "cid:" + mm.Attachments[0].ContentId); mm.IsBodyHtml = true; SmtpClient sc = new SmtpClient("smtp.qq.com", 587); sc.Credentials = new NetworkCredential(From,Pwssword);//此處的password參數填剛剛保存的授權碼 sc.EnableSsl = true; sc.Send(mm);
(3)、通過AlternateView類和LinkedResource類來實現