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

Tom FitzMacken

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

Что вы узнаете:

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

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

  • Помощник WebMail .

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

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

Это руководство также подходит для ASP.NET Web Pages второй версии.

Отправка сообщений электронной почты с веб-сайта

Есть все виды причин, по которым может потребоваться отправить электронную почту с веб-сайта. Вы можете отправлять сообщения подтверждения пользователям или отправлять уведомления себе (например, о новом зарегистрировавшемся пользователе). Вспомогательный элемент 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>
    

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

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

    В тексте страницы, если 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 или другой порт.
      • Убедитесь, что вы используете правильные учетные данные. Если вы опубликовали свой сайт поставщику услуг размещения, используйте учетные данные, указанные поставщиком для электронной почты. Они могут отличаться от учетных данных, используемых для публикации.
      • Иногда вам не нужны учетные данные. Если вы отправляете сообщение электронной почты с помощью личного поставщика услуг интернета, ваш поставщик электронной почты может уже знать свои учетные данные. После публикации может потребоваться использовать разные учетные данные, отличные от того, когда вы тестируете на локальном компьютере.
      • Если поставщик электронной почты использует шифрование, необходимо задать значение WebMail.EnableSsltrue.
  4. Запустите страницу EmailRequest.cshtml в браузере. (Перед запуском страницы выберите страницу в рабочей области "Файлы ".)

  5. Введите имя и описание проблемы, а затем нажмите кнопку "Отправить ". Вы перенаправляетесь на страницу ProcessRequest.cshtml , которая подтверждает сообщение и отправляет сообщение электронной почты.

    [Снимок экрана: страница

Отправка файла с помощью электронной почты

Вы также можете отправлять файлы, вложенные в сообщения электронной почты. В этой процедуре создается текстовый файл и две 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 , которая подтверждает сообщение и отправляет сообщение электронной почты с вложенным файлом.

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