發送電子郵件也是項目開發當中經常用到的功能,這裡我整理了一個發送電子郵件(帶附件,支援多使用者發送,主送、抄送)的類庫,供大家參考。
先上兩個實體類,用于封裝成Mail對象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<code>/// <summary></code>
<code>/// 發送郵件請求</code>
<code>/// </summary></code>
<code>public</code> <code>class</code> <code>MailRequest</code>
<code>{</code>
<code> </code><code>#region PrivateFields</code>
<code> </code>
<code> </code><code>/// <summary></code>
<code> </code><code>/// 檔案名</code>
<code> </code><code>/// </summary></code>
<code> </code><code>private</code> <code>string</code> <code>_fromField;</code>
<code> </code><code>/// 返送到</code>
<code> </code><code>private</code> <code>string</code> <code>_toField;</code>
<code> </code><code>/// 抄送</code>
<code> </code><code>private</code> <code>string</code> <code>_copyField;</code>
<code> </code><code>/// 附件</code>
<code> </code><code>private</code> <code>string</code> <code>_bccField;</code>
<code> </code><code>/// 标題</code>
<code> </code><code>private</code> <code>string</code> <code>_subjectField;</code>
<code> </code><code>/// 發送人名</code>
<code> </code><code>private</code> <code>string</code> <code>_bodyField;</code>
<code> </code><code>/// 類容</code>
<code> </code><code>private</code> <code>MailRequestAttachments[] _attachmentsField;</code>
<code> </code>
<code> </code><code>#endregion</code>
<code> </code><code>/// 發送人,多個人以分号;間隔</code>
<code> </code><code>public</code> <code>string</code> <code>From</code>
<code> </code><code>{</code>
<code> </code><code>get</code>
<code> </code><code>{</code>
<code> </code><code>return</code> <code>this</code><code>._fromField;</code>
<code> </code><code>}</code>
<code> </code><code>set</code>
<code> </code><code>this</code><code>._fromField = value;</code>
<code> </code><code>}</code>
<code> </code><code>/// 收件人,多個人以分号;間隔</code>
<code> </code><code>public</code> <code>string</code> <code>To</code>
<code> </code><code>return</code> <code>this</code><code>._toField;</code>
<code> </code><code>this</code><code>._toField = value;</code>
<code> </code><code>/// 抄送人,多個人以分号;間隔</code>
<code> </code><code>public</code> <code>string</code> <code>CC</code>
<code> </code><code>return</code> <code>this</code><code>._copyField;</code>
<code> </code><code>this</code><code>._copyField = value;</code>
<code> </code><code>/// 秘密抄送人,多個人以分号;間隔</code>
<code> </code><code>public</code> <code>string</code> <code>Bcc</code>
<code> </code><code>return</code> <code>this</code><code>._bccField;</code>
<code> </code><code>this</code><code>._bccField = value;</code>
<code> </code><code>/// 主題</code>
<code> </code><code>public</code> <code>string</code> <code>Subject</code>
<code> </code><code>return</code> <code>this</code><code>._subjectField;</code>
<code> </code><code>this</code><code>._subjectField = value;</code>
<code> </code><code>/// 内容</code>
<code> </code><code>public</code> <code>string</code> <code>Body</code>
<code> </code><code>return</code> <code>this</code><code>._bodyField;</code>
<code> </code><code>this</code><code>._bodyField = value;</code>
<code> </code><code>/// 附件清單</code>
<code> </code><code>public</code> <code>MailRequestAttachments[] Attachments</code>
<code> </code><code>return</code> <code>this</code><code>._attachmentsField;</code>
<code> </code><code>this</code><code>._attachmentsField = value;</code>
<code>}</code>
<code>/// 發送郵件請求附件</code>
<code>public</code> <code>class</code> <code>MailRequestAttachments</code>
<code> </code>
<code> </code><code>private</code> <code>string</code> <code>_fileNameField;</code>
<code> </code><code>/// 檔案内容</code>
<code> </code><code>private</code> <code>byte</code><code>[] _fileDataField;</code>
<code> </code>
<code> </code><code>public</code> <code>string</code> <code>FileName</code>
<code> </code><code>return</code> <code>this</code><code>._fileNameField;</code>
<code> </code><code>this</code><code>._fileNameField = value;</code>
<code> </code><code>public</code> <code>byte</code><code>[] FileData</code>
<code> </code><code>return</code> <code>this</code><code>._fileDataField;</code>
<code> </code><code>this</code><code>._fileDataField = value;</code>
附件的内容很簡單,因為在網絡傳輸當中,是以位元組流的形式傳輸的,是以附件的傳輸需要轉換成位元組流數組。
<code>/// 郵件幫助類</code>
<code>public</code> <code>static</code> <code>class</code> <code>MailHelper</code>
<code> </code><code>/// 發送郵件</code>
<code> </code><code>/// <param name="request">郵件内容對象</param></code>
<code> </code><code>/// <returns>發送郵件所遇到的異常</returns></code>
<code> </code><code>public</code> <code>static</code> <code>string</code> <code>SendMail(MailRequest request)</code>
<code> </code><code>try</code>
<code> </code><code>MailMessage mail = </code><code>new</code> <code>MailMessage();</code>
<code> </code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(request.From))</code>
<code> </code><code>{</code>
<code> </code><code>request.From = WebConfigurationManager.AppSettings[</code><code>"DefaultMailFrom"</code><code>];</code>
<code> </code><code>}</code>
<code> </code><code>mail.From = </code><code>new</code> <code>MailAddress(request.From);</code>
<code> </code><code>PaserMailAddress(request.To, mail.To);</code>
<code> </code><code>PaserMailAddress(request.CC, mail.CC);</code>
<code> </code><code>PaserMailAddress(request.Bcc, mail.Bcc);</code>
<code> </code><code>mail.Subject = request.Subject;</code>
<code> </code><code>mail.SubjectEncoding = System.Text.Encoding.UTF8;</code>
<code> </code><code>mail.Body = request.Body;</code>
<code> </code><code>mail.ReplyTo = </code><code>new</code> <code>MailAddress(request.From);</code>
<code> </code><code>mail.IsBodyHtml = </code><code>true</code><code>;</code>
<code> </code><code>if</code> <code>(request.Attachments != </code><code>null</code> <code>&& request.Attachments.Length > 0)</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i < request.Attachments.Length; i++)</code>
<code> </code><code>{</code>
<code> </code><code>Attachment mailAttach = </code><code>new</code> <code>Attachment(ByteArrayToStream(request.Attachments[i].FileData), request.Attachments[i].FileName);</code>
<code> </code><code>mail.Attachments.Add(mailAttach);</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(WebConfigurationManager.AppSettings[</code><code>"SMTPSERVER"</code><code>]))</code>
<code> </code><code>throw</code> <code>new</code> <code>ApplicationException(</code><code>"郵件服務無效"</code><code>);</code>
<code> </code><code>//Smtp Server</code>
<code> </code><code>SmtpClient mailClient = </code><code>new</code> <code>SmtpClient(WebConfigurationManager.AppSettings[</code><code>"SMTPSERVER"</code><code>]);</code>
<code> </code><code>if</code> <code>(!</code><code>string</code><code>.IsNullOrEmpty(WebConfigurationManager.AppSettings[</code><code>"SMTPSERVERPORT"</code><code>]))</code>
<code> </code><code>//端口号</code>
<code> </code><code>try</code>
<code> </code><code>mailClient.Port = Int32.Parse(WebConfigurationManager.AppSettings[</code><code>"SMTPSERVERPORT"</code><code>]);</code>
<code> </code><code>catch</code>
<code> </code><code>return</code> <code>"SMTP伺服器端口設定錯誤,端口必須設定為數值型"</code><code>;</code>
<code> </code><code>if</code> <code>(!</code><code>string</code><code>.IsNullOrEmpty(WebConfigurationManager.AppSettings[</code><code>"MAILUSER"</code><code>]))</code>
<code> </code><code>mailClient.Credentials = </code><code>new</code> <code>System.Net.NetworkCredential(WebConfigurationManager.AppSettings[</code><code>"MAILUSER"</code><code>], WebConfigurationManager.AppSettings[</code><code>"MAILUSERPW"</code><code>]);</code>
<code> </code><code>mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;</code>
<code> </code><code>else</code>
<code> </code><code>mailClient.Credentials = CredentialCache.DefaultNetworkCredentials;</code>
<code> </code><code>mailClient.Send(mail);</code>
<code> </code><code>mail.Dispose();</code>
<code> </code><code>return</code> <code>"郵件發送成功。"</code><code>;</code>
<code> </code><code>catch</code> <code>(SmtpFailedRecipientsException e)</code>
<code> </code><code>return</code> <code>e.Message;</code>
<code> </code><code>catch</code> <code>(SmtpFailedRecipientException e)</code>
<code> </code><code>catch</code> <code>(SmtpException e)</code>
<code> </code><code>catch</code> <code>(Exception e)</code>
<code> </code><code>/// 解析分解郵件位址</code>
<code> </code><code>/// <param name="mailAddress">郵件位址</param></code>
<code> </code><code>/// <param name="mailCollection">郵件對象</param></code>
<code> </code><code>private</code> <code>static</code> <code>void</code> <code>PaserMailAddress(</code><code>string</code> <code>mailAddress, MailAddressCollection mailCollection)</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(mailAddress))</code>
<code> </code><code>return</code><code>;</code>
<code> </code><code>char</code><code>[] separator = </code><code>new</code> <code>char</code><code>[2] { </code><code>','</code><code>, </code><code>';'</code> <code>};</code>
<code> </code><code>string</code><code>[] addressArray = mailAddress.Split(separator);</code>
<code> </code><code>foreach</code> <code>(</code><code>string</code> <code>address </code><code>in</code> <code>addressArray)</code>
<code> </code><code>if</code> <code>(address.Trim() == </code><code>string</code><code>.Empty)</code>
<code> </code><code>continue</code><code>;</code>
<code> </code><code>mailCollection.Add(</code><code>new</code> <code>MailAddress(address));</code>
<code> </code><code>/// 位元組數組轉換為流</code>
<code> </code><code>/// <param name="byteArray">位元組數組</param></code>
<code> </code><code>/// <returns>Stream</returns></code>
<code> </code><code>private</code> <code>static</code> <code>Stream ByteArrayToStream(</code><code>byte</code><code>[] byteArray)</code>
<code> </code><code>MemoryStream mstream = </code><code>new</code> <code>MemoryStream(byteArray);</code>
<code> </code><code>return</code> <code>mstream;</code>
這是一個郵件助手類,定義成static,無需執行個體化,直接類名.方法名的形式調用。
隻需要上述3個類就可以實作發送Email了,由于上面引用的是web.config裡面的資訊(asp.net等命名空間,如果是winform等需要自己修改一下),這裡還需要配置一下web.config,如下所示:
<code><</code><code>appSettings</code><code>></code>
<code> </code><code><!--郵件發送配置--></code>
<code> </code><code><</code><code>add</code> <code>key</code><code>=</code><code>"SMTPSERVER"</code> <code>value</code><code>=</code><code>"smtp.qq.com"</code><code>/></code>
<code> </code><code><!--這是伺服器郵箱的位址,如果是新浪,則填 smtp.sina.com--></code>
<code> </code><code><</code><code>add</code> <code>key</code><code>=</code><code>"MAILUSER"</code> <code>value</code><code>=</code><code>"xxx"</code><code>/></code>
<code> </code><code><!--注意!這是對應伺服器郵箱的賬号--></code>
<code> </code><code><</code><code>add</code> <code>key</code><code>=</code><code>"MAILUSERPW"</code> <code>value</code><code>=</code><code>"yyy"</code><code>/></code>
<code> </code><code><!--注意!這是對應伺服器郵箱的賬号密碼--></code>
<code></</code><code>appSettings</code><code>></code>
最後上一個測試方法,在主函數當中或者Page_Load事件中執行即可:
<code>private</code> <code>void</code> <code>SendEmailExample()</code>
<code> </code><code>MailRequest mail = </code><code>new</code> <code>MailRequest();</code>
<code> </code><code>mail.Subject = </code><code>"hello,this is a e-mail sent by asp.net mailhelper."</code><code>;</code><code>//主題</code>
<code> </code><code>mail.Body = </code><code>"hello,this is a e-mail sent by asp.net mailhelper.<a href='http://blog.csdn.net/guwei4037'>歡迎通路我的部落格。</a>"</code><code>;//内容</code>
<code> </code><code>mail.Bcc = </code><code>"[email protected]"</code><code>;</code><code>//秘密抄送人</code>
<code> </code><code>mail.From = </code><code>"[email protected]"</code><code>;</code><code>//發送人</code>
<code> </code><code>mail.CC = </code><code>"[email protected]"</code><code>;</code><code>//抄送人</code>
<code> </code><code>mail.To = </code><code>"[email protected]"</code><code>;</code><code>//收件人</code>
<code> </code>
<code> </code><code>//讀取檔案到bytes</code>
<code> </code><code>FileStream stream = </code><code>new</code> <code>FileStream(Path.Combine(Server.MapPath(</code><code>"~"</code><code>), </code><code>"doc\\test.txt"</code><code>), FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);</code>
<code> </code><code>byte</code><code>[] bytes = </code><code>new</code> <code>byte</code><code>[stream.Length];</code>
<code> </code><code>stream.Read(bytes, 0, bytes.Length);</code>
<code> </code><code>stream.Close();</code>
<code> </code><code>//附件</code>
<code> </code><code>MailRequestAttachments attachments = </code><code>new</code> <code>MailRequestAttachments();</code>
<code> </code><code>attachments.FileName = </code><code>"test.txt"</code><code>;</code>
<code> </code><code>attachments.FileData = bytes;</code>
<code> </code><code>mail.Attachments = </code><code>new</code> <code>MailRequestAttachments[] {</code>
<code> </code><code>attachments</code>
<code> </code><code>};</code>
<code> </code><code>string</code> <code>sendMainResult = </code><code>"-1"</code><code>;</code>
<code> </code><code>if</code> <code>(!</code><code>string</code><code>.IsNullOrEmpty(mail.CC.Replace(</code><code>";"</code><code>, </code><code>""</code><code>)) && !</code><code>string</code><code>.IsNullOrEmpty(mail.To.Replace(</code><code>";"</code><code>, </code><code>""</code><code>)))</code>
<code> </code><code>sendMainResult = MailHelper.SendMail(mail);</code>
<code> </code><code>Response.Write(sendMainResult);</code>
發送郵件成功,附件也能正常打開,而且多個使用者都收到了電子郵件。截圖為證。

<a href="http://download.csdn.net/detail/guwei4037/5869019" target="_blank">源代碼下載下傳,請點選這裡。</a>
本文轉自 guwei4037 51CTO部落格,原文連結:http://blog.51cto.com/csharper/1345981