從 ASP.NET Web Pages (Razor) 網站傳送Email

作者:Tom FitzMacken

本文說明當您使用 ASP.NET Web Pages (Razor) 時,如何從網站傳送電子郵件訊息。

您將學到什麼:

  • 如何從您的網站傳送電子郵件訊息。
  • 如何將檔案附加至電子郵件訊息。

這是文章中引進的 ASP.NET 功能:

  • 協助 WebMail 程式。

教學課程中使用的軟體版本

  • ASP.NET Web Pages (Razor) 3

本教學課程也適用于 ASP.NET Web Pages 2。

從您的網站傳送Email訊息

您可能需要從網站傳送電子郵件的各種原因。 您可能會將確認訊息傳送給使用者,或者您可能會將通知傳送給自己 (例如,新使用者已註冊。) 協助 WebMail 程式可讓您輕鬆地傳送電子郵件。

若要使用 WebMail 協助程式,您必須能夠存取 SMTP 伺服器。 (SMTP 代表 簡單郵件傳輸通訊協定。) SMTP 伺服器是只將郵件轉寄給收件者伺服器的電子郵件伺服器,這是電子郵件的輸出端。 如果您使用網站的主控提供者,他們可能會以電子郵件設定您,而且可以告訴您您的 SMTP 伺服器名稱為何。 如果您是在公司網路內工作,系統管理員或 IT 部門通常可以提供您可以使用之 SMTP 伺服器的相關資訊。 如果您是在家工作,您甚至可以使用一般電子郵件提供者進行測試,誰可以告訴您其 SMTP 伺服器的名稱。 您通常需要:

  • SMTP 伺服器的名稱。
  • 連接埠號碼。 這幾乎一律為 25。 不過,您的 ISP 可能會要求您使用埠 587。 如果您使用安全通訊端層 (SSL) 的電子郵件,您可能需要不同的埠。 請洽詢您的電子郵件提供者。
  • 認證 (使用者名稱、密碼) 。

在此程式中,您會建立兩個頁面。 第一頁有一個表單,可讓使用者輸入描述,就像他們填寫技術支援表單一樣。 第一頁會將其資訊提交至第二頁。 在第二個頁面中,程式碼會擷取使用者的資訊,並傳送電子郵件訊息。 它也會顯示一則訊息,確認已收到問題報告。

[螢幕擷取畫面顯示確認已收到問題報告的訊息。

注意

為了讓此範例保持簡單,程式碼會直接在您使用的頁面中初始化 WebMail 協助程式。 不過,對於真實網站,最好將像這樣的初始化程式碼放在全域檔案中,以便初始化 WebMail 網站中所有檔案的協助程式。 如需詳細資訊,請參閱自訂Site-Wide ASP.NET Web Pages行為

  1. 建立新的網站。

  2. 新增名為 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。 這表示表單會提交至該頁面,而不是回到目前的頁面。

  3. 將名為 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 為已發生的錯誤。 (如需區塊或 <text> 標記的詳細資訊 try/catch ,請參閱使用 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 address.)

      提示

      設定Email設定

      有時候可能是一項挑戰,就是確定您有 SMTP 伺服器的正確設定、埠號碼等等。 以下提供一些祕訣:

      • SMTP 伺服器名稱通常類似 smtp.provider.comsmtp.provider.net 。 不過,如果您將月臺發佈至主機提供者,則該時間點的 SMTP 伺服器名稱可能是 localhost 。 這是因為在您發佈網站且月臺在提供者的伺服器上執行之後,電子郵件伺服器可能是從應用程式的觀點來看的本機。 伺服器名稱中的這項變更可能表示您必須變更 SMTP 伺服器名稱作為發佈程式的一部分。
      • 埠號碼通常是 25。 不過,某些提供者會要求您使用埠 587 或其他埠。
      • 請確定您使用正確的認證。 如果您已將網站發佈至主機提供者,請使用提供者特別指出的認證適用于電子郵件。 這些可能與您用來發佈的認證不同。
      • 有時候您完全不需要認證。 如果您使用個人 ISP 傳送電子郵件,您的電子郵件提供者可能已經知道您的認證。 發佈之後,您可能需要使用與在本機電腦上測試時不同的認證。
      • 如果您的電子郵件提供者使用加密,您必須設定 WebMail.EnableSsltrue
  4. 在瀏覽器中執行 EmailRequest.cshtml 頁面。 (執行頁面之前,請先確定已在 [ 檔案 ] 工作區中選取頁面。)

  5. 輸入您的名稱和問題描述,然後按一下 [ 提交 ] 按鈕。 系統會將您重新導向至 ProcessRequest.cshtml 頁面,該頁面會確認您的訊息,以及傳送電子郵件訊息。

    [顯示 [進程要求] 頁面的螢幕擷取畫面。

使用 Email 傳送檔案

您也可以傳送附加至電子郵件訊息的檔案。 在此程式中,您會建立文字檔和兩個 HTML 頁面。 您將使用文字檔作為電子郵件附件。

  1. 在網站中,新增文字檔並將其命名 為MyFile.txt

  2. 複製下列文字並貼到 檔案中:

    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.

  3. 建立名為 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>
    
  4. 建立名為 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>
    
  5. 從範例修改程式碼中的下列電子郵件相關設定:

    • 設定 your-SMTP-host 為您有權存取的 SMTP 伺服器名稱。
    • 設定 your-user-name-here 為 SMTP 伺服器帳戶的使用者名稱。
    • 設定 your-email-address-here 為您自己的電子郵件地址。 這是郵件從中傳送的電子郵件地址。
    • 設定 your-account-password 為 SMTP 伺服器帳戶的密碼。
    • 設定 target-email-address-here 為您自己的電子郵件地址。 (如前所述,您通常會傳送電子郵件給其他人,但為了進行測試,您可以將電子郵件傳送給自己。)
  6. 在瀏覽器中執行 SendFile.cshtml 頁面。

  7. 輸入您的名稱、主旨行,以及要附加 (MyFile.txt) 的 文字檔名稱。

  8. 按一下 Submit 按鈕。 如同先前一樣,系統會將您重新導向至 ProcessFile.cshtml 頁面,這會確認您的訊息,並傳送含有附加檔案的電子郵件訊息。

其他資源