Wysyłanie Email z witryny ASP.NET Web Pages (Razor)
– autor Tom FitzMacken
W tym artykule wyjaśniono, jak wysyłać wiadomość e-mail z witryny internetowej podczas korzystania z ASP.NET Web Pages (Razor).
Zawartość:
- Jak wysłać wiadomość e-mail z witryny internetowej.
- Jak dołączyć plik do wiadomości e-mail.
Jest to funkcja ASP.NET wprowadzona w artykule:
- Pomocnik
WebMail
.Wersje oprogramowania używane w samouczku
- ASP.NET Web Pages (Razor) 3
Ten samouczek działa również z ASP.NET Web Pages 2.
Wysyłanie wiadomości Email z witryny internetowej
Istnieją różne powody, dla których może być konieczne wysłanie wiadomości e-mail z witryny internetowej. Możesz wysyłać wiadomości potwierdzające do użytkowników lub wysyłać do siebie powiadomienia (na przykład, że nowy użytkownik zarejestrował się). Pomocnik WebMail
ułatwia wysyłanie wiadomości e-mail.
Aby korzystać z WebMail
pomocnika, musisz mieć dostęp do serwera SMTP. (SMTP to skrót od Simple Mail Transfer Protocol). Serwer SMTP to serwer poczty e-mail, który przekazuje tylko wiadomości do serwera adresata — jest to wychodząca strona poczty e-mail. Jeśli używasz dostawcy hostingu dla witryny internetowej, prawdopodobnie konfigurują Cię za pomocą poczty e-mail i mogą poinformować o nazwie serwera SMTP. Jeśli pracujesz w sieci firmowej, administrator lub dział IT zazwyczaj może podać informacje o serwerze SMTP, którego można użyć. Jeśli pracujesz w domu, możesz nawet przetestować przy użyciu zwykłego dostawcy poczty e-mail, który może podać nazwę serwera SMTP. Zazwyczaj potrzebne są następujące elementy:
- Nazwa serwera SMTP.
- Numer portu. To prawie zawsze 25. Jednak usługodawca isp może wymagać użycia portu 587. Jeśli używasz protokołu SECURE Sockets Layer (SSL) do obsługi poczty e-mail, może być potrzebny inny port. Sprawdź u dostawcy poczty e-mail.
- Poświadczenia (nazwa użytkownika, hasło).
W tej procedurze utworzysz dwie strony. Pierwsza strona ma formularz, który umożliwia użytkownikom wprowadzenie opisu, tak jakby wypełniali formularz pomocy technicznej. Pierwsza strona przesyła swoje informacje na drugą stronę. Na drugiej stronie kod wyodrębnia informacje użytkownika i wysyła wiadomość e-mail. Zostanie również wyświetlony komunikat potwierdzający odebranie raportu o problemie.
Uwaga
Aby ten przykład był prosty, kod inicjuje WebMail
pomocnika bezpośrednio na stronie, na której jest używany. Jednak w przypadku rzeczywistych witryn internetowych lepiej jest umieścić kod inicjowania, taki jak ten w pliku globalnym, aby zainicjować WebMail
pomocnika dla wszystkich plików w witrynie internetowej. Aby uzyskać więcej informacji, zobacz Dostosowywanie zachowania Site-Wide dla ASP.NET Stron sieci Web.
Utwórz nową witrynę internetową.
Dodaj nową stronę o nazwie EmailRequest.cshtml i dodaj następującą znaczniki:
<!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>
Zwróć uwagę, że
action
atrybut elementu formularza został ustawiony na ProcessRequest.cshtml. Oznacza to, że formularz zostanie przesłany do tej strony zamiast z powrotem do bieżącej strony.Dodaj nową stronę o nazwie ProcessRequest.cshtml do witryny internetowej i dodaj następujący kod i znaczniki:
@{ 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>
W kodzie uzyskasz wartości pól formularza, które zostały przesłane do strony. Następnie wywołaj metodę
WebMail
pomocnikaSend
, aby utworzyć i wysłać wiadomość e-mail. W takim przypadku wartości do użycia składają się z tekstu, który łączy się z wartościami przesłanymi z formularza.Kod tej strony znajduje się wewnątrz
try/catch
bloku. Jeśli z jakiegoś powodu próba wysłania wiadomości e-mail nie zadziała (na przykład ustawienia nie są prawidłowe), kod w przebiegachcatch
bloków i ustawia zmiennąerrorMessage
na błąd, który wystąpił. (Aby uzyskać więcej informacji na temattry/catch
bloków lub tagów<text>
, zobacz Wprowadzenie do ASP.NET programowania stron internetowych przy użyciu składni Razor).W treści strony, jeśli
errorMessage
zmienna jest pusta (wartość domyślna), użytkownik zobaczy wiadomość, że wiadomość e-mail została wysłana. Jeśli zmiennaerrorMessage
ma wartość true, użytkownik zobaczy komunikat informujący o problemie z wysłaniem komunikatu.Zwróć uwagę, że w części strony, która wyświetla komunikat o błędzie, jest dodatkowy test:
if(debuggingFlag)
. Jest to zmienna, którą można ustawić na wartość true, jeśli masz problemy z wysyłaniem wiadomości e-mail. JeślidebuggingFlag
wartość ma wartość true, a jeśli wystąpił problem podczas wysyłania wiadomości e-mail, zostanie wyświetlony dodatkowy komunikat o błędzie pokazujący, co ASP.NET zgłoszono podczas próby wysłania wiadomości e-mail. Należy jednak pamiętać, że komunikaty o błędach, które ASP.NET zgłaszają, gdy nie można wysłać wiadomości e-mail, mogą być ogólne. Jeśli na przykład ASP.NET nie może skontaktować się z serwerem SMTP (na przykład z powodu błędu w nazwie serwera), błąd toFailure sending mail
.Uwaga
Ważne Po wyświetleniu komunikatu o błędzie z obiektu wyjątku (
ex
w kodzie ) nie przekazuj tego komunikatu do użytkowników. Obiekty wyjątków często zawierają informacje, których użytkownicy nie powinni widzieć i które mogą nawet stanowić lukę w zabezpieczeniach. Dlatego ten kod zawiera zmiennądebuggingFlag
używaną jako przełącznik do wyświetlania komunikatu o błędzie i dlaczego zmienna jest domyślnie ustawiona na wartość false. Należy ustawić dla tej zmiennej wartość true (i w związku z tym wyświetlić komunikat o błędzie) tylko wtedy, gdy masz problem z wysyłaniem wiadomości e-mail i musisz debugować. Po usunięciu jakichkolwiek problemów ustaw wartośćdebuggingFlag
false.Zmodyfikuj następujące ustawienia związane z pocztą e-mail w kodzie:
Ustaw
your-SMTP-host
nazwę serwera SMTP, do którego masz dostęp.Ustaw
your-user-name-here
wartość na nazwę użytkownika dla konta serwera SMTP.Ustaw
your-account-password
hasło dla konta serwera SMTP.Ustaw
your-email-address-here
na własny adres e-mail. Jest to adres e-mail, z którego jest wysyłana wiadomość. (Niektórzy dostawcy poczty e-mail nie pozwalają określić innegoFrom
adresu i będą używać nazwy użytkownika jakoFrom
adresu).Porada
Konfigurowanie ustawień Email
Czasami może być wyzwaniem upewnienie się, że masz odpowiednie ustawienia dla serwera SMTP, numeru portu itd. Oto kilka wskazówek:
- Nazwa serwera SMTP jest często podobna do
smtp.provider.com
lubsmtp.provider.net
. Jeśli jednak opublikujesz witrynę u dostawcy hostingu, nazwa serwera SMTP w tym momencie może mieć wartośćlocalhost
. Dzieje się tak, ponieważ po opublikowaniu i uruchomieniu witryny na serwerze dostawcy serwer poczty e-mail może być lokalny z perspektywy aplikacji. Ta zmiana nazw serwerów może oznaczać, że konieczna może być zmiana nazwy serwera SMTP w ramach procesu publikowania. - Numer portu to zwykle 25. Jednak niektórzy dostawcy wymagają użycia portu 587 lub innego portu.
- Upewnij się, że używasz odpowiednich poświadczeń. Jeśli witryna została opublikowana u dostawcy hostingu, użyj poświadczeń wskazanych specjalnie przez dostawcę poczty e-mail. Mogą one różnić się od poświadczeń używanych do publikowania.
- Czasami w ogóle nie są potrzebne poświadczenia. Jeśli wysyłasz wiadomości e-mail przy użyciu osobistego usługodawcy internetowy, twój dostawca poczty e-mail może już znać twoje poświadczenia. Po opublikowaniu może być konieczne użycie innych poświadczeń niż podczas testowania na komputerze lokalnym.
- Jeśli dostawca poczty e-mail używa szyfrowania, musisz ustawić wartość
WebMail.EnableSsl
true
.
- Nazwa serwera SMTP jest często podobna do
Uruchom stronę EmailRequest.cshtml w przeglądarce. (Przed uruchomieniem strony upewnij się, że strona jest zaznaczona w obszarze roboczym Pliki ).
Wprowadź nazwę i opis problemu, a następnie kliknij przycisk Prześlij . Nastąpi przekierowanie do strony ProcessRequest.cshtml , która potwierdza twoją wiadomość i która wysyła wiadomość e-mail.
Wysyłanie pliku przy użyciu Email
Możesz również wysyłać pliki dołączone do wiadomości e-mail. W tej procedurze utworzysz plik tekstowy i dwie strony HTML. Użyjesz pliku tekstowego jako załącznika wiadomości e-mail.
W witrynie internetowej dodaj nowy plik tekstowy i nadaj mu nazwę MyFile.txt.
Skopiuj następujący tekst i wklej go w pliku:
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.
Utwórz stronę o nazwie SendFile.cshtml i dodaj następujące znaczniki:
<!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>
Utwórz stronę o nazwie ProcessFile.cshtml i dodaj następujące znaczniki:
@{ 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>
Zmodyfikuj następujące ustawienia związane z pocztą e-mail w kodzie z przykładu:
- Ustaw
your-SMTP-host
nazwę serwera SMTP, do którego masz dostęp. - Ustaw
your-user-name-here
wartość na nazwę użytkownika dla konta serwera SMTP. - Ustaw
your-email-address-here
na własny adres e-mail. Jest to adres e-mail, z którego jest wysyłana wiadomość. - Ustaw
your-account-password
hasło dla konta serwera SMTP. - Ustaw
target-email-address-here
na własny adres e-mail. (Tak jak wcześniej zwykle wysyłasz wiadomość e-mail do kogoś innego, ale na potrzeby testowania możesz wysłać ją do siebie).
- Ustaw
Uruchom stronę SendFile.cshtml w przeglądarce.
Wprowadź nazwę, wiersz tematu i nazwę pliku tekstowego do dołączenia (MyFile.txt).
Kliknij przycisk
Submit
. Tak jak wcześniej nastąpi przekierowanie do strony ProcessFile.cshtml , która potwierdza wiadomość i która wysyła wiadomość e-mail z dołączonym plikiem.