Отправка 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.
Создайте новый веб-сайт.
Добавьте новую страницу с именем 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
переменную с ошибкой, которая произошла. (Дополнительные сведения о блоках или тегах см. в<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.EnableSsl
true
.
- Имя SMTP-сервера часто имеет вид
Запустите страницу EmailRequest.cshtml в браузере. (Перед запуском убедитесь, что страница выбрана в рабочей области Файлы .)
Введите имя и описание проблемы, а затем нажмите кнопку Отправить . Вы будете перенаправлены на страницу ProcessRequest.cshtml , которая подтверждает ваше сообщение и отправляет сообщение электронной почты.
Отправка файла с помощью Email
Вы также можете отправлять файлы, вложенные в сообщения электронной почты. В этой процедуре вы создадите текстовый файл и две 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 , которая подтверждает ваше сообщение и отправляет сообщение электронной почты с вложенным файлом.