從 ASP.NET Web Pages (Razor) 網站傳送電子郵件
本文說明當您使用 ASP.NET Web Pages (Razor) 時,如何從網站傳送電子郵件訊息。
您將學會:
- 如何從您的網站傳送電子郵件訊息。
- 如何將檔案附加至電子郵件訊息。
這是本文中介紹的 ASP.NET 功能:
WebMail
協助程式。教學課程中使用的軟體版本
- ASP.NET Web Pages (Razor) 3
本教學課程也適用於 ASP.NET Web Pages 2。
從您的網站傳送電子郵件訊息
您可能需要從網站傳送電子郵件的原因有很多。 您可能傳送確認訊息給使用者,或者您可能傳送通知給自己 (例如,有新使用者註冊)。WebMail
協助程式可讓您輕鬆地傳送電子郵件。
若要使用 WebMail
協助程式,您必須能夠存取 SMTP 伺服器。 (SMTP 代表「簡易郵件傳輸通訊協定」)。SMTP 伺服器是只將郵件轉寄給收件者伺服器的電子郵件伺服器,它是電子郵件的輸出端。 如果您為網站使用主機提供者,他們可能會為您設定電子郵件,而且他們可以告訴您 SMTP 伺服器名稱是什麼。 如果您是在公司網路內工作,系統管理員或 IT 部門通常可以提供您可以使用之 SMTP 伺服器的相關資訊。 如果您在家工作,甚至可以使用一般電子郵件提供者進行測試,他們可以告訴您其 SMTP 伺服器的名稱。 您通常需要:
- SMTP 伺服器的名稱。
- 連接埠號碼。 這幾乎一律是 25。 不過,ISP 可能會要求您使用連接埠 587。 如果您針對電子郵件使用安全通訊端層 (SSL),可能需要不同的連接埠。 請洽詢您的電子郵件提供者。
- 認證 (使用者名稱、密碼)
在此程序中,您會建立兩個頁面。 第一頁有一個表單,可讓使用者輸入描述,就像填寫技術支援表單一樣。 第一頁會將其資訊提交至第二頁。 在第二頁,程式碼會擷取使用者的資訊,並傳送電子郵件訊息。 它也會顯示訊息,確認已收到問題報告。
注意
為了讓此範例保持簡單,程式碼會在您使用它的頁面中初始化 WebMail
協助程式。 不過,對於真正的網站,最好將此類初始化程式碼放在全域檔案中,以便將網站中所有檔案的 WebMail
協助程式初始化。 如需詳細資訊,請參閱自訂 ASP.NET Web Pages 的全網站行為。
建立新網站。
新增名為 EmailRequest.cshtml 的新頁面,並新增下列標記:
<!DOCTYPE html> <html> <head> <title>Request for Assistance</title> </head> <body> <h2>Submit Email Request for Assistance</h2> <form method="post" action="ProcessRequest.cshtml"> <div> Your name: <input type="text" name="customerName" /> </div> <div> Your email address: <input type="text" name="customerEmail" /> </div> <div> Details about your problem: <br /> <textarea name="customerRequest" cols="45" rows="4"></textarea> </div> <div> <input type="submit" value="Submit" /> </div> </form> </body> </html>
請注意,表單元素的
action
屬性已設定為 ProcessRequest.cshtml。 這表示表單會提交至該頁面,而不是回到目前的頁面。將名為 ProcessRequest.cshtml 的新頁面新增至網站,並新增下列程式碼和標記:
@{ var customerName = Request["customerName"]; var customerEmail = Request["customerEmail"]; var customerRequest = Request["customerRequest"]; var errorMessage = ""; var debuggingFlag = false; try { // Initialize WebMail helper WebMail.SmtpServer = "your-SMTP-host"; WebMail.SmtpPort = 25; WebMail.UserName = "your-user-name-here"; WebMail.Password = "your-account-password"; WebMail.From = "your-email-address-here"; // Send email WebMail.Send(to: customerEmail, subject: "Help request from - " + customerName, body: customerRequest ); } catch (Exception ex ) { errorMessage = ex.Message; } } <!DOCTYPE html> <html> <head> <title>Request for Assistance</title> </head> <body> <p>Sorry to hear that you are having trouble, <b>@customerName</b>.</p> @if(errorMessage == ""){ <p>An email message has been sent to our customer service department regarding the following problem:</p> <p><b>@customerRequest</b></p> } else{ <p><b>The email was <em>not</em> sent.</b></p> <p>Please check that the code in the ProcessRequest page has correct settings for the SMTP server name, a user name, a password, and a "from" address. </p> if(debuggingFlag){ <p>The following error was reported:</p> <p><em>@errorMessage</em></p> } } </body> </html>
在程式碼中,您會取得提交至頁面的表單欄位值。 接著,您可以呼叫
WebMail
協助程式的Send
方法,以建立並傳送電子郵件訊息。 在本例中,要使用的值是由您與表單提交的值串連的文字所組成。此頁面的程式碼位於
try/catch
區塊內。 如果嘗試傳送電子郵件因故無法運作 (例如,設定不正確),catch
區塊中的程式碼就會執行,並將errorMessage
變數設定為已發生的錯誤。 (如需有關try/catch
區塊或<text>
標記的詳細資訊,請參閱使用 Razor 語法進行 ASP.NET Web Pages 程式設計簡介。)在頁面主體中,如果
errorMessage
變數是空的 (預設值),使用者會看到指出已傳送電子郵件訊息的訊息。 如果errorMessage
變數設定為 true,則使用者會看到指出傳送訊息時發生問題的訊息。請注意,在顯示錯誤訊息的頁面部分,還有另一項測試:
if(debuggingFlag)
。 如果您無法傳送電子郵件,這是可以設定為 true 的變數。 當debuggingFlag
為 true,而且傳送電子郵件時發生問題時,則會顯示額外的錯誤訊息,指出嘗試傳送電子郵件時 ASP.NET 所回報的任何內容。 不過,警告一下:ASP.NET 無法傳送電子郵件訊息時所報告的錯誤訊息可能非常一般。 例如,如果 ASP.NET 無法連絡 SMTP 伺服器 (例如,因為您在伺服器名稱中發生錯誤),則錯誤為Failure sending mail
。注意
重要事項 當您從例外狀況物件 (程式碼中的
ex
) 取得錯誤訊息時,「不」要定期將該訊息傳遞給使用者。 例外狀況物件通常包含使用者不應該看到的資訊,甚至可能是安全性弱點。 這就是為什麼此程式碼包含debuggingFlag
變數,這會當做參數來顯示錯誤訊息,也是該變數預設會設為 false 的原因。 「唯當」傳送電子郵件發生問題,且需要偵錯時,才應將該變數設定為 true (因而會顯示錯誤訊息)。 修正任何問題之後,將debuggingFlag
重新設為 false。修改程式碼中下列電子郵件相關設定:
將
your-SMTP-host
設為您有權存取的 SMTP 伺服器名稱。將
your-user-name-here
設定為 SMTP 伺服器帳戶的使用者名稱。將
your-account-password
設定為您的 SMTP 伺服器帳戶的密碼。將
your-email-address-here
設定為您自己的電子郵件位址。 這是傳送訊息的電子郵件地址。 (某些電子郵件提供者不會讓您指定不同的From
地址,並且會使用您的使用者名稱做為From
地址。提示
設定電子郵件設定。
有時候,確定您有 SMTP 伺服器的正確設定、連接埠號碼等等,可能頗具挑戰。 以下提供一些祕訣:
- SMTP 伺服器名稱通常類似
smtp.provider.com
或smtp.provider.net
。 不過,如果您將網站發佈至主機提供者,則此時的 SMTP 伺服器名稱可能是localhost
。 這是因為在您已進行發佈且網站在提供者的伺服器上執行後,從應用程式觀點來看,電子郵件伺服器可能是本機。 伺服器名稱中的這項變更可能代表您必須在發佈程序中變更 SMTP 伺服器的名稱。 - 連接埠號通常是 25。 不過,某些提供者會要求您使用連接埠 587 或其他連接埠。
- 請確定您使用正確的認證。 如果您已將網站發佈至主機提供者,請使用提供者已特別指明的認證來傳送電子郵件。 這些可能與您用來發佈的認證不同。
- 有時候您完全不需要認證。 如果您使用個人 ISP 來傳送電子郵件,您的電子郵件提供者可能已經知道您的認證。 發佈之後,您可能需要使用與在本機電腦上測試時不同的認證。
- 如果您的電子郵件提供者使用加密,您必須將
WebMail.EnableSsl
設定為true
。
- SMTP 伺服器名稱通常類似
在瀏覽器中執行 EmailRequest.cshtml 頁面。 (在您執行之前,請確定已在檔案工作區中選取頁面。)
輸入您的名稱和問題描述,然後按下 [提交] 按鈕。 系統會將您重新導向至 ProcessRequest.cshtml 頁面,其會確認您的訊息並且傳送電子郵件訊息給您。
使用電子郵件傳送檔案
您也可以傳送附加至電子郵件訊息的檔案。 在此程序中,您會建立文字檔案和兩個 HTML 頁面。 您將使用文字檔做為電子郵件附件。
在網站中,新增文字檔並將其命名為 MyFile.txt。
複製下列文字,並將其貼入檔案中:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
建立名為 SendFile.cshtml 的版面配置頁面,並新增下列標記:
<!DOCTYPE html> <html> <head> <title>Attach File</title> </head> <body> <h2>Submit Email with Attachment</h2> <form method="post" action="ProcessFile.cshtml"> <div> Your name: <input type="text" name="customerName" /> </div> <div> Your email address: <input type="text" name="customerEmail" /> </div> <div> Subject line: <br /> <input type="text" size= 30 name="subjectLine" /> </div> <div> File to attach: <br /> <input type="text" size=60 name="fileAttachment" /> </div> <div> <input type="submit" value="Submit" /> </div> </form> </body> </html>
建立名為 ProcessFile.cshtml 的版面配置頁面,並新增下列標記:
@{ var customerName = Request["customerName"]; var customerEmail = Request["customerEmail"]; var customerRequest = Request["customerRequest"]; var subjectLine = Request["subjectLine"]; var fileAttachment = Request["fileAttachment"]; var errorMessage = ""; var debuggingFlag = false; try { // Initialize WebMail helper WebMail.SmtpServer = "your-SMTP-host"; WebMail.SmtpPort = 25; WebMail.UserName = "your-user-name-here"; WebMail.Password = "your-account-password"; WebMail.From = "your-email-address-here"; // Create array containing file name var filesList = new string [] { fileAttachment }; // Attach file and send email WebMail.Send(to: customerEmail, subject: subjectLine, body: "File attached. <br />From: " + customerName, filesToAttach: filesList); } catch (Exception ex ) { errorMessage = ex.Message; } } <!DOCTYPE html> <html> <head> <title>Request for Assistance</title> </head> <body> <p>Sorry to hear that you are having trouble, <b>@customerName</b>.</p> @if(errorMessage == ""){ <p><b>@customerName</b>, thank you for your interest.</p> <p>An email message has been sent to our customer service department with the <b>@fileAttachment</b> file attached.</p> } else{ <p><b>The email was <em>not</em> sent.</b></p> <p>Please check that the code in the ProcessRequest page has correct settings for the SMTP server name, a user name, a password, and a "from" address. </p> if(debuggingFlag){ <p>The following error was reported:</p> <p><em>@errorMessage</em></p> } } </body> </html>
從範例的程式碼中修改下列電子郵件相關設定:
- 將
your-SMTP-host
設為您有權存取的 SMTP 伺服器名稱。 - 將
your-user-name-here
設定為 SMTP 伺服器帳戶的使用者名稱。 - 將
your-email-address-here
設定為您自己的電子郵件位址。 這是傳送訊息的電子郵件地址。 - 將
your-account-password
設定為您的 SMTP 伺服器帳戶的密碼。 - 將
target-email-address-here
設定為您自己的電子郵件位址。 (和之前一樣,您通常會傳送電子郵件給其他人,但為了進行測試,您可以將電子郵件傳送給自己。)
- 將
在瀏覽器中執行 SendFile.cshtml 頁面。
輸入您的名稱、主旨行,以及要附加的文字檔名稱 (MyFile.txt)。
按一下
Submit
按鈕。 和之前一樣,系統會將您重新導向至 ProcessFile.cshtml 頁面,其會確認您的訊息並將電子郵件訊息與附加的檔案傳送給您。