分享net網(wǎng)站開發(fā)中郵件發(fā)送功能

2022-12-29    分類: 網(wǎng)站建設(shè)

今天,給大家分享的是如何在.NET平臺中開發(fā)“郵件發(fā)送”功能。在網(wǎng)上搜的到的各種資料一般都介紹的比較簡單,那今天我想比較細(xì)的整理介紹下:

1) 郵件基礎(chǔ)理論知識

2) 郵件發(fā)送相關(guān).NET類庫

3) 介紹我開發(fā)的一個發(fā)送郵件的小組件(MailHelper)

4) MailHelper組件的一個示例以及幾種方式發(fā)郵件的優(yōu)劣測試

示例及組件源碼:

.NET開發(fā)郵件發(fā)送功能的全面教程(含郵件組件源碼).rar

郵件基礎(chǔ)理論知識

什么業(yè)務(wù)需要郵件功能?

1. 服務(wù)提供方:需提供郵件收發(fā)客戶端或Web服務(wù)。(eg:Outlook、QQ郵箱)。當(dāng)然這些服務(wù)都是知名商提供。若是一般的小網(wǎng)站提供的郵件收發(fā)服務(wù),不知道節(jié)操如何,誰敢用呢?就算你用了,別的知名商SMTP服務(wù)器也不認(rèn)可從這小網(wǎng)站發(fā)出的郵件,出現(xiàn)SMTP服務(wù)器拒收來源郵件(視為惡意郵件或垃圾郵件)。

2. 安全性、機(jī)密性:比如某安全部門需要提供自己發(fā)郵件的SMTP服務(wù)器和收郵件POP3服務(wù)器以及相應(yīng)的操作軟件

3. 電子商務(wù)、論壇等會員機(jī)制社區(qū):主家需要向會員發(fā)送通知信息,比如:密碼重置、降價通知、留言通知、回復(fù)通知、訂閱通知、會員間交流等等。主家保證郵箱有效性的辦法常常是通過會員注冊、更換郵箱時發(fā)送“激活郵件”。

4. 郵件營銷:在大數(shù)據(jù)時代的現(xiàn)在,企業(yè)可以根據(jù)所掌握的數(shù)據(jù)預(yù)測客戶的需求,來提供主動推送營銷消息的功能;當(dāng)然也有沒有預(yù)測能力的小商家通過郵件群發(fā)器進(jìn)行撒網(wǎng)式郵件營銷。

5. 等等

什么是電子郵件協(xié)議?

當(dāng)前常用的電子郵件協(xié)議有SMTP、POP3、IMAP4,它們都隸屬于TCP/IP協(xié)議簇。

1. SMTP

Simple Mail Transfer Protocol(即簡單郵件傳輸協(xié)議),它是一組用于從源地址到目的地址傳送郵件的規(guī)則,簡單的說就是:From-->To的傳送規(guī)則。由SMTP來控制信件中轉(zhuǎn)的方式。SMTP屬于TCP/IP家族中的一員,它幫助每一臺計算機(jī)在發(fā)送或中轉(zhuǎn)信件時找到下一個目的地。通過SMTP協(xié)議所指定的服務(wù)器,就可以把E-Mail寄到收信人的服務(wù)器上。SMTP服務(wù)器則是遵循SMTP協(xié)議的郵件發(fā)送服務(wù)器,用來中轉(zhuǎn)你發(fā)出的電子郵件。

SMTP目前已是事實上的E-Mail傳輸?shù)臉?biāo)準(zhǔn)。

2. POP3

Post Office Protocol 3(即郵局協(xié)議的第3個版本),負(fù)責(zé)從郵件服務(wù)器中檢索電子郵件。它要求郵件服務(wù)器完成下面幾種任務(wù)之一:從郵件服務(wù)器中檢索郵件并從服務(wù)器中刪除這個郵件;從郵件服務(wù)器中檢索郵件但不刪除它;不檢索郵件,只是詢問是否有新郵件到達(dá)。

POP3是因特網(wǎng)電子郵件的第一個離線協(xié)議標(biāo)準(zhǔn)。

3. IMAP4

Internet Message Access Protocol 4(即交互式數(shù)據(jù)消息訪問協(xié)議第四個版本),提供脫機(jī)和聯(lián)機(jī)訪問功能。是一種優(yōu)于POP的新協(xié)議,是美國斯坦福大學(xué)在1986年開始研發(fā)的多重郵箱電子郵件系統(tǒng)。和POP一樣,IMAP也能下載郵件、從服務(wù)器中刪除郵件或詢問是否有新郵件,但I(xiàn)MAP克服了POP的一些缺點。例如,請求郵件服務(wù)器只下載所選中的郵件而不是全部郵件??蛻魴C(jī)可先閱讀郵件信息的標(biāo)題和發(fā)送者的名字再決定是否下載這個郵件。通過用戶的客戶機(jī)電子郵件程序,IMAP可讓用戶在服務(wù)器上創(chuàng)建并管理郵件文件夾或郵箱、刪除郵件、查詢某封信的一部分或全部內(nèi)容,完成所有這些工作時都不需要把郵件從服務(wù)器下載到用戶的個人計算機(jī)上。

默認(rèn)情況下,當(dāng) IMAP4 電子郵件應(yīng)用程序?qū)㈦娮余]件下載到客戶端計算機(jī),下載郵件的副本會保留在電子郵件服務(wù)器上。正是由于用戶的電子郵件副本保留在電子郵件服務(wù)器上,用戶可以從多臺計算機(jī)上訪問相同的電子郵件。也可以實現(xiàn)電子郵件服務(wù)器上的多個文件夾與客戶端計算機(jī)上的多個文件夾同步。

SMTP/POP3工作方式如圖:

TCP的3次握手和4次揮手?

詳細(xì)可見《TCP3次握手/4次握手》

在 TCP 數(shù)據(jù)段報頭中,有六個包含控制信息的 1 bit字段,用于管理 TCP 進(jìn)程。這些字段分別是:

URG —緊急指針

ACK —確認(rèn)字段

PSH —推送功能

RST —重置連接

SYN —同步序列號

FIN —發(fā)送方已傳輸完所有數(shù)據(jù)

這些字段用作標(biāo)志,由于它們都只有 1 bit大小,所以它們都只有兩個值:1 或者 0。當(dāng)值設(shè)為 1 時,表示數(shù)據(jù)段中包含控制信息。

1. 三次握手,建立連接

在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個連接。

1) 建立連接時,客戶端A發(fā)送SYN包(SYN=j)到服務(wù)器B,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器B確認(rèn)。

2) 服務(wù)器B收到SYN包,必須確認(rèn)客戶A的SYN(ACK=j+1),同時自己也發(fā)送一個SYN包(SYN=k),即SYN+ACK包,此時服務(wù)器B進(jìn)入SYN_RECV狀態(tài)。

3) 客戶端A收到服務(wù)器B的SYN+ACK包,向服務(wù)器B發(fā)送確認(rèn)包ACK(ACK=k+1),此包發(fā)送完畢,客戶端A和服務(wù)器B進(jìn)入ESTABLISHED狀態(tài),完成三次握手。

2. 四次揮手,關(guān)閉連接

由于TCP連接是全雙工的,因此每個方向都必須單獨進(jìn)行關(guān)閉。這個原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個FIN來終止這個方向的連接。

1) 客戶端A發(fā)送一個FIN,用來關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送。

2) 服務(wù)器B收到這個FIN,它發(fā)回一個ACK,確認(rèn)序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。

3) 服務(wù)器B關(guān)閉與客戶端A的連接,發(fā)送一個FIN給客戶端A。

4) 客戶端A發(fā)回ACK報文確認(rèn),并將確認(rèn)序號設(shè)置為收到序號加1。

3. 為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次揮手呢?

建立連接時,服務(wù)端LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報文的連接請求后,它可以把ACK和SYN放在一個報文里來發(fā)送。

關(guān)閉連接時,當(dāng)收到對方的FIN報文通知時,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,所以你可能未必會馬上會關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以關(guān)閉連接的ACK報文和FIN報文多數(shù)情況下都是分開發(fā)送的。

常見的郵箱類型有哪些?

常見的郵箱類型有:免費郵箱、vip郵箱、域名郵箱、企業(yè)郵箱等等。

1. 免費郵箱

“免費郵箱”是郵件商家為任何人免費提供的電子郵件傳輸服務(wù),作為交換,該網(wǎng)站上你請求電子郵件服務(wù)和一些個人信息的地方會顯示廣告。它更適合個人生活和娛樂的需要,卻并非那么注重郵箱的安全和功能。

部分免費郵件SMTP服務(wù)器參考設(shè)置:

span>Email類型 SMTP[Host]主服務(wù)器 Port[端口號] 是否可啟用SSL Gmail(Google的網(wǎng)絡(luò)郵件服務(wù)) smtp.gmail.com 587 True HotMail/Live smtp.live.com 25 True QQ/FoxMail(Foxmail被騰訊收購) smtp.qq.com 25 False 126(網(wǎng)易) smtp.126.com 25 False 163(網(wǎng)易) smtp.163.com 25 False Sina(新浪郵箱) smtp.sina.com 25 False Tom smtp.tom.com 25 False SoHu(搜狐郵箱) smtp.sohu.com 25 False Yahoo(雅虎郵箱)(已關(guān)閉) smtp.mail.yahoo.com 25 False

2. vip郵箱

“vip郵箱”即郵件商家提供的收費版郵件服務(wù),在速度、安全、穩(wěn)定性、容量、附件大小限制、群發(fā)數(shù)等方面相對好些。其SMTP服務(wù)器設(shè)置就是多了個vip字符。eg:smtp.vip.qq.com。郵箱地址:369220123@vip.qq.com。

3. 域名郵箱

“域名郵箱”是個性化郵件服務(wù),能讓您用自己的域名做為后綴即“@自己的域名”,前提是你需要一個域名(通常域名要收費)。功能比免費郵箱要多:可分配單個郵箱、規(guī)劃容量、更加的安全、更好的穩(wěn)定性、個性化名稱、郵件發(fā)送量更大、附件大小限制等等。

4. 企業(yè)郵箱

“企業(yè)郵箱”是域名郵箱,但通常是指通過付費方式獲得更好服務(wù)的郵箱。eg:您公司域名為www.abc.com,則SMTP服務(wù)器為:mail.abc.com,郵箱地址:office@abc.com;

使用企業(yè)郵箱的優(yōu)勢:

1) 提升公司企業(yè)形象、郵箱穩(wěn)定性、郵箱反垃圾反病毒性能、郵件收發(fā)速度;

2) 通過購買服務(wù),能適應(yīng)企業(yè)不斷升級需求;

3) 為員工分配(域名)企業(yè)郵箱,便于將流動員工所有業(yè)務(wù)聯(lián)系保留和延續(xù)下來;

4) 監(jiān)控郵件(實際為郵件暗抄送功能),以防公司的機(jī)密和重要信息流失;

5) 獲得高性能郵件海外轉(zhuǎn)發(fā)功能,解決國際高效郵件收發(fā)、郵件營銷有效投遞等問題;

6) 出站電子郵件過濾,比如:敏感字過濾、基于政策郵件加密等等;

7) 等等。

郵件發(fā)送相關(guān).NET類庫

在 .net1.1 ,用System.Web.Mail發(fā)送郵件。在.net2.0及之后版本,用System.Net.Mail發(fā)送郵件。主要用到了在.net2.0中新增的兩個類,分別是System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient兩個類,在SMTP身份驗證方面用到了System.Net.NetworkCredential類。

1. MailMessage 類表示郵件的內(nèi)容。

MailMessage常用屬性

From

MailAddress

獲取或設(shè)置此電子郵件的發(fā)信人地址。

兩者區(qū)別:當(dāng)Sender與From都有設(shè)定時,Mail Server會取用Sender的設(shè)定發(fā)信,但郵件上的名稱會使用From的設(shè)定,而若不需要Sender和From同時設(shè)定時,則Sender可以免設(shè),但From一定要設(shè)。詳細(xì)請看:《MailMessage的Sender和From?傻傻分不清楚》

Sender

To

MailAddressCollection

獲取包含此電子郵件的收件人的地址集合。

CC

MailAddressCollection

獲取包含此電子郵件的抄送(CC)收件人的地址集合。

Bcc

MailAddressCollection

獲取包含此電子郵件的密件抄送(BCC)收件人的地址集合。

Attachments

AttachmentCollection

獲取用于存儲附加到此電子郵件的數(shù)據(jù)的附件集合。

Subject

string

獲取或設(shè)置此電子郵件的主題。

Body

string

獲取或設(shè)置郵件正文。

AlternateViews

AlternateViewCollection

指定一個電子郵件不同格式顯示的副本。(eg:發(fā)送HTML格式的郵件,可能希望同時提供郵件的純文本格式,以防止一些收件人使用的電子郵件閱讀程序無法顯示html內(nèi)容)

IsBodyHtml

bool

默認(rèn)false。獲取或設(shè)置指示郵件正文是否為Html格式的值。

Priority

MailPriority

默認(rèn)Normal。獲取或設(shè)置此電子郵件的優(yōu)先級。(Normal | Low| High)

SubjectEncoding

Encoding

獲取或設(shè)置此電子郵件的主題內(nèi)容使用的編碼。

BodyEncoding

Encoding

獲取或設(shè)置用于郵件正文的編碼。

ReplyToList

MailAddressCollection

設(shè)置接收方回復(fù)郵件時默認(rèn)的接收地址,eg:你用一個郵箱發(fā)信,但卻用另一個來收信。

(ReplyTo,表示單個回復(fù)地址,已過期,使用ReplyToList代替)

下面屬性想不到用在什么場景……請高人指出使用案例,謝謝!

DeliveryNotificationOptions

DeliveryNotificationOptions

默認(rèn)None。獲取或設(shè)置此電子郵件的發(fā)送通知。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

不懂干嘛的,設(shè)置為OnSuccess,不會回復(fù)我發(fā)送成功。設(shè)置為Never,發(fā)送失敗也會回復(fù)我。。。

Headers

NameValueCollection

獲取與此電子郵件一起傳輸?shù)碾娮余]件標(biāo)頭。(什么時候需要自己去設(shè)置?)

HeadersEncoding

Encoding

獲取或設(shè)置此電子郵件的用戶定義的自定義標(biāo)題使用的編碼。

2. SmtpClient類用于將電子郵件發(fā)送到 SMTP 服務(wù)器以便傳遞。

SmtpClient常用屬性

Host

string

獲取或設(shè)置用于SMTP事務(wù)的主機(jī)的名稱或IP地址。

Port

int

獲取或設(shè)置用于SMTP事務(wù)的端口。

UseDefaultCredentials

bool

默認(rèn)false。

若要使用默認(rèn)網(wǎng)絡(luò)憑據(jù),可以將UseDefaultCredentials設(shè)置為true,此時System.Net.CredentialCache.DefaultCredentials(應(yīng)用程序系統(tǒng)憑證)會隨請求一起發(fā)送。

如果UseDefaultCredentials屬性設(shè)置為false,則連接到服務(wù)器時會將Credentials屬性中設(shè)置的值用作憑據(jù)。如果UseDefaultCredentials屬性設(shè)置為false并且尚未設(shè)置Credentials屬性,則將郵件以匿名方式發(fā)送到服務(wù)器。若SMTP服務(wù)器要求在驗證客戶端的身份則會拋出異常。

Credentials

ICredentialsByHost

獲取或設(shè)置用于驗證發(fā)件人身份的憑據(jù)。

ClientCertificates

X509CertificateCollection

指定應(yīng)該使用哪些證書來建立安全套接字層(SSL)連接。

EnableSsl

bool

默認(rèn)false。指定SmtpClient是否使用安全套接字層(SSL)加密連接。

Timeout

int

默認(rèn)100000.獲取或設(shè)置一個值,該值指定同步重載:SmtpClient.Send()調(diào)用的超時時間。

自建本地SMTP服務(wù)器獲取郵件時需要使用的屬性:

DeliveryMethod

SmtpDeliveryMethod

默認(rèn)NetworkCredential。

?

1

2

3

4

5

6

7

8

9

10

PickupDirectoryLocation

string

獲取或設(shè)置文件夾,應(yīng)用程序在該文件夾中保存將由本地SMTP服務(wù)器處理的郵件。

?

下面屬性想不到用在什么場景……請高人指出使用案例,謝謝!

TargetName

string

"SMTPSVC/" + this.host。獲取或設(shè)置在使用擴(kuò)展保護(hù)時用于身份驗證的服務(wù)提供程序名稱(SPN)。

ServicePoint

ServicePoint

獲取用于傳輸電子郵件的網(wǎng)絡(luò)連接。(應(yīng)該會保存TCP連接,避免再次進(jìn)行TCP的三次握手???)

3. 一個簡單的郵件發(fā)送示例

MailMessage?mail?=?new?MailMessage(); ? mail.From?=?new?MailAddress(From,?FromDisplayName); ? mail.To.Add(new?MailAddress(To,?ToDisplayName)); ? mail.Subject?=?"this?is?a?test?email."; ? mail.Body?=?"this?is?my?test?email?body. this?part?is?in?bold"; ? mail.IsBodyHtml?=?true; ? SmtpClient?smtp?=?new?SmtpClient(host,?port); ? smtp.Credentials?=?new?NetworkCredential(userName,?password); ? smtp.Send(mail);?

4. 郵件擴(kuò)展:如何發(fā)送內(nèi)嵌資源(eg:圖片、mp3等等)

詳細(xì)請看:http://www.cnblogs.com/SkyD/archive/2009/05/11/1453868.html(斯克迪亞)

通過 ContentDisposition 類實現(xiàn)此功能,內(nèi)嵌的資源只做為文件內(nèi)容顯示,不再在附件列表中出現(xiàn)。ContentDisposition 類表示 MIME 協(xié)議 Content-Disposition 標(biāo)頭。

對于文件附件,可以使用 ContentDisposition 的屬性來設(shè)置文件大小、文件的創(chuàng)建日期、上次讀取文件的日期以及上次修改文件的日期。對于所有附件,考慮到附件有可能會存儲到接收計算機(jī)上,可以設(shè)置一個建議的文件名。顯示電子郵件的軟件可以使用 ContentDisposition 中的信息,按發(fā)件人預(yù)期的方式呈現(xiàn)電子郵件附件。

通過 ContentDisposition 實例的Inline屬性實現(xiàn)郵件內(nèi)嵌資源。如下:

1) 設(shè)置附件的ContentId屬性為一個自定義名稱。

2) 設(shè)置附件的ContentDisposition.Inline屬性為true。

3) 在郵件的HTML格式正文中以“cid:自定義名稱”的方式引用,比如ContentId設(shè)為“face”,那么正文中就以“cid:face”作為其URL路徑字符串的替代即可。

代碼如下:(詳細(xì)見示例代

網(wǎng)頁標(biāo)題:分享net網(wǎng)站開發(fā)中郵件發(fā)送功能
文章分享:http://www.bm7419.com/news21/226271.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、Google、外貿(mào)網(wǎng)站建設(shè)移動網(wǎng)站建設(shè)、軟件開發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)