Поделиться через


Отправка Email с сайта веб-страницы ASP.NET (Razor)

; автор — Том ФитцМакен (Tom FitzMacken)

В этой статье объясняется, как отправлять сообщения электронной почты с веб-сайта при использовании веб-страницы ASP.NET (Razor).

Из этого руководства вы узнаете, как выполнять такие задачи:

  • Отправка сообщения электронной почты с веб-сайта.
  • Как вложить файл в сообщение электронной почты.

Это ASP.NET функция, представленная в этой статье:

  • Помощник WebMail .

Версии программного обеспечения, используемые в этом руководстве

  • веб-страницы ASP.NET (Razor) 3

Это руководство также работает с веб-страницы ASP.NET 2.

Отправка Email сообщений с веб-сайта

Есть все виды причин, почему вам может потребоваться отправить электронную почту с вашего веб-сайта. Вы можете отправлять пользователям сообщения с подтверждением или отправлять уведомления себе (например, о регистрации нового пользователя). Помощник WebMail упрощает отправку сообщений электронной почты.

Чтобы использовать вспомогатель WebMail , необходимо иметь доступ к SMTP-серверу. (SMTP означает простой протокол передачи почты.) SMTP-сервер — это почтовый сервер, который пересылает сообщения только на сервер получателя— это исходящая сторона электронной почты. Если вы используете поставщика услуг размещения для своего веб-сайта, он, вероятно, настроит вам электронную почту и может сообщить имя вашего SMTP-сервера. Если вы работаете в корпоративной сети, администратор или ИТ-отдел обычно может предоставить вам сведения о SMTP-сервере, который вы можете использовать. Если вы работаете дома, возможно, вы даже сможете протестировать с помощью обычного поставщика услуг электронной почты, который может сообщить вам имя своего SMTP-сервера. Обычно требуется:

  • Имя SMTP-сервера.
  • номер порта. Это почти всегда 25. Однако поставщик услуг Интернета может потребовать использовать порт 587. Если вы используете протокол SSL для электронной почты, может потребоваться другой порт. Обратитесь к поставщику услуг электронной почты.
  • Учетные данные (имя пользователя, пароль).

В этой процедуре вы создадите две страницы. На первой странице есть форма, позволяющая пользователям вводить описание, как если бы они заполняли форму технической поддержки. Первая страница отправляет свои сведения на вторую страницу. На второй странице код извлекает сведения о пользователе и отправляет сообщение электронной почты. Также отображается сообщение с подтверждением получения отчета о проблеме.

[Снимок экрана: сообщение с подтверждением получения отчета о проблеме.]

Примечание

Чтобы этот пример был прост, код инициализирует вспомогательный WebMail элемент прямо на странице, где он используется. Однако для реальных веб-сайтов лучше поместить код инициализации в глобальный файл, чтобы инициализировать вспомогательную WebMail службу для всех файлов на веб-сайте. Дополнительные сведения см. в статье Настройка поведения Site-Wide для веб-страницы ASP.NET.

  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>
    

    В коде вы получите значения полей формы, отправленных на страницу. Затем вы вызываете вспомогательный WebMailSend метод для создания и отправки сообщения электронной почты. В этом случае используемые значения состоят из текста, который вы объединяете со значениями, отправленными из формы.

    Код этой страницы находится внутри try/catch блока. Если по какой-либо причине попытка отправить сообщение электронной почты не работает (например, параметры не верны), код в блоке catch выполняется и задает errorMessage переменную с ошибкой, которая произошла. (Дополнительные сведения о блоках или тегах см. в <text> статье Общие сведения о программировании веб-страницы ASP.NET с использованием синтаксиса Razortry/catch.)

    Если переменная пуста (по умолчанию) в тексте страницы, 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 качестве адреса.)

      Совет

      Настройка параметров Email

      Иногда бывает сложно убедиться, что у вас есть правильные параметры для SMTP-сервера, номера порта и т. д. Несколько советов:

      • Имя SMTP-сервера часто имеет вид smtp.provider.com или smtp.provider.net. Однако при публикации сайта у поставщика услуг размещения имя SMTP-сервера на этом этапе может иметь значение localhost. Это связано с тем, что после публикации и запуска сайта на сервере поставщика почтовый сервер может быть локальным с точки зрения вашего приложения. Это изменение имен серверов может означать, что необходимо изменить имя SMTP-сервера в процессе публикации.
      • Обычно номер порта — 25. Однако для некоторых поставщиков требуется использовать порт 587 или другой порт.
      • Убедитесь, что вы используете правильные учетные данные. Если вы опубликовали свой сайт у поставщика услуг размещения, используйте учетные данные, указанные поставщиком, для электронной почты. Они могут отличаться от учетных данных, используемых для публикации.
      • Иногда вам вообще не нужны учетные данные. Если вы отправляете электронную почту с помощью личного поставщика услуг Интернета, ваш поставщик услуг электронной почты может уже знать ваши учетные данные. После публикации может потребоваться использовать учетные данные, отличные от учетных данных при тестировании на локальном компьютере.
      • Если поставщик услуг электронной почты использует шифрование, необходимо задать для значение 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 , которая подтверждает ваше сообщение и отправляет сообщение электронной почты с вложенным файлом.

Дополнительные ресурсы