Invio di Email da un sito di Pagine Web ASP.NET (Razor)
Questo articolo illustra come inviare un messaggio di posta elettronica da un sito Web quando si usa Pagine Web ASP.NET (Razor).
Contenuto dell'esercitazione:
- Come inviare un messaggio di posta elettronica dal sito Web.
- Come allegare un file a un messaggio di posta elettronica.
Questa è la funzionalità ASP.NET introdotta nell'articolo:
- Helper
WebMail
.Versioni software usate nell'esercitazione
- Pagine Web ASP.NET (Razor) 3
Questa esercitazione funziona anche con Pagine Web ASP.NET 2.
Invio di messaggi Email dal sito Web
Ci sono tutti i tipi di motivi per cui potrebbe essere necessario inviare e-mail dal tuo sito Web. È possibile inviare messaggi di conferma agli utenti oppure inviare notifiche a se stessi (ad esempio, che un nuovo utente ha registrato). L'helper WebMail
semplifica l'invio di messaggi di posta elettronica.
Per usare l'helper WebMail
, è necessario avere accesso a un server SMTP. SMTP è l'acronimo di Simple Mail Transfer Protocol. Un server SMTP è un server di posta elettronica che inoltra solo i messaggi al server del destinatario, ovvero il lato in uscita della posta elettronica. Se si usa un provider di hosting per il sito Web, è probabile che l'utente abbia configurato la posta elettronica e possa indicare il nome del server SMTP. Se si lavora all'interno di una rete aziendale, un amministratore o il reparto IT può in genere fornire le informazioni su un server SMTP che è possibile usare. Se lavori a casa, potresti anche essere in grado di testare usando il tuo ordinario provider di posta elettronica, chi può indicare il nome del server SMTP. In genere è necessario:
- Nome del server SMTP.
- Il numero della porta. Questo è quasi sempre 25. Tuttavia, l'ISP potrebbe richiedere l'uso della porta 587. Se si usa ssl (Secure Sockets Layer) per la posta elettronica, potrebbe essere necessaria una porta diversa. Rivolgersi al provider di posta elettronica.
- Credenziali (nome utente, password).
In questa procedura vengono create due pagine. La prima pagina ha un modulo che consente agli utenti di immettere una descrizione, come se stesse compilando un modulo di supporto tecnico. La prima pagina invia le informazioni a una seconda pagina. Nella seconda pagina il codice estrae le informazioni dell'utente e invia un messaggio di posta elettronica. Viene inoltre visualizzato un messaggio che conferma che la segnalazione del problema è stata ricevuta.
Nota
Per semplificare questo esempio, il codice inizializza l'helper WebMail
direttamente nella pagina in cui viene usata. Tuttavia, per i siti Web reali, è preferibile inserire codice di inizializzazione come questo in un file globale, in modo da inizializzare l'helper WebMail
per tutti i file nel sito Web. Per altre informazioni, vedere Personalizzazione del comportamento di Site-Wide per Pagine Web ASP.NET.
Creare un nuovo sito Web.
Aggiungere una nuova pagina denominata EmailRequest.cshtml e aggiungere il markup seguente:
<!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>
Si noti che l'attributo dell'elemento
action
del modulo è stato impostato su ProcessRequest.cshtml. Ciò significa che il modulo verrà inviato a tale pagina anziché tornare alla pagina corrente.Aggiungere una nuova pagina denominata ProcessRequest.cshtml al sito Web e aggiungere il codice e il markup seguenti:
@{ 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>
Nel codice si ottengono i valori dei campi modulo inviati alla pagina. Chiamare quindi il
WebMail
metodo dell'helperSend
per creare e inviare il messaggio di posta elettronica. In questo caso, i valori da utilizzare sono costituiti da testo concatenato con i valori inviati dal modulo.Il codice per questa pagina si trova all'interno di un
try/catch
blocco. Se per qualsiasi motivo il tentativo di invio di un messaggio di posta elettronica non funziona (ad esempio, le impostazioni non sono corrette), il codice nelcatch
blocco viene eseguito e imposta laerrorMessage
variabile sull'errore che si è verificato. Per altre informazioni suitry/catch
blocchi o sul<text>
tag, vedere Introduzione alla programmazione Pagine Web ASP.NET tramite la sintassi Razor.Nel corpo della pagina, se la
errorMessage
variabile è vuota (impostazione predefinita), l'utente visualizza un messaggio che indica che il messaggio di posta elettronica è stato inviato. Se laerrorMessage
variabile è impostata su true, l'utente visualizza un messaggio che indica che si è verificato un problema durante l'invio del messaggio.Si noti che nella parte della pagina che visualizza un messaggio di errore è presente un test aggiuntivo:
if(debuggingFlag)
. Si tratta di una variabile che è possibile impostare su true se si verificano problemi durante l'invio di messaggi di posta elettronica. QuandodebuggingFlag
è true e se si verifica un problema durante l'invio di messaggi di posta elettronica, viene visualizzato un messaggio di errore aggiuntivo che mostra qualsiasi ASP.NET segnalato quando ha tentato di inviare il messaggio di posta elettronica. Avviso equo, tuttavia: i messaggi di errore che ASP.NET segnalano quando non è possibile inviare un messaggio di posta elettronica possono essere generici. Ad esempio, se ASP.NET non è in grado di contattare il server SMTP , ad esempio perché è stato generato un errore nel nome del server, l'errore èFailure sending mail
.Nota
Importante Quando viene visualizzato un messaggio di errore da un oggetto eccezione (
ex
nel codice), non passare regolarmente tale messaggio agli utenti. Gli oggetti eccezione includono spesso informazioni che gli utenti non devono visualizzare e che possono anche essere una vulnerabilità di sicurezza. Ecco perché questo codice include la variabiledebuggingFlag
usata come opzione per visualizzare il messaggio di errore e perché la variabile per impostazione predefinita è impostata su false. È consigliabile impostare tale variabile su true (e quindi visualizzare il messaggio di errore) solo se si verifica un problema con l'invio di messaggi di posta elettronica ed è necessario eseguire il debug. Dopo aver risolto eventuali problemi, impostare di nuovo sudebuggingFlag
false.Modificare le impostazioni correlate al messaggio di posta elettronica seguenti nel codice:
Impostare
your-SMTP-host
sul nome del server SMTP a cui si ha accesso.Impostare
your-user-name-here
sul nome utente per l'account del server SMTP.Impostare
your-account-password
sulla password per l'account del server SMTP.Impostare
your-email-address-here
sul proprio indirizzo di posta elettronica. Questo è l'indirizzo di posta elettronica da cui viene inviato il messaggio. Alcuni provider di posta elettronica non consentono di specificare un indirizzo diversoFrom
e useranno il nome utente comeFrom
indirizzo.Suggerimento
Configurazione delle impostazioni di Email
Può trattarsi di una sfida a volte assicurarsi di avere le impostazioni corrette per il server SMTP, il numero di porta e così via. Di seguito sono riportati alcuni suggerimenti:
- Il nome del server SMTP è spesso simile
smtp.provider.com
a osmtp.provider.net
. Tuttavia, se si pubblica il sito in un provider di hosting, il nome del server SMTP a quel punto potrebbe esserelocalhost
. Ciò è dovuto al fatto che dopo la pubblicazione e il sito è in esecuzione nel server del provider, il server di posta elettronica potrebbe essere locale dal punto di vista dell'applicazione. Questa modifica nei nomi dei server potrebbe significare che è necessario modificare il nome del server SMTP come parte del processo di pubblicazione. - Il numero di porta è in genere 25. Tuttavia, alcuni provider richiedono l'uso della porta 587 o di un'altra porta.
- Assicurarsi di usare le credenziali corrette. Se il sito è stato pubblicato in un provider di hosting, usare le credenziali indicate specificamente dal provider per la posta elettronica. Potrebbero essere diversi dalle credenziali usate per la pubblicazione.
- A volte non sono necessarie credenziali. Se si invia un messaggio di posta elettronica usando l'ISP personale, il provider di posta elettronica potrebbe conoscere già le credenziali. Dopo la pubblicazione, potrebbe essere necessario usare credenziali diverse rispetto a quando si esegue il test nel computer locale.
- Se il provider di posta elettronica usa la crittografia, è necessario impostare su
WebMail.EnableSsl
true
.
- Il nome del server SMTP è spesso simile
Eseguire la pagina EmailRequest.cshtml in un browser. Assicurarsi che la pagina sia selezionata nell'area di lavoro File prima di eseguirla.
Immettere il nome e una descrizione del problema e quindi fare clic sul pulsante Invia . Si viene reindirizzati alla pagina ProcessRequest.cshtml , che conferma il messaggio e che invia un messaggio di posta elettronica.
Invio di un file tramite Email
È anche possibile inviare file allegati ai messaggi di posta elettronica. In questa procedura viene creato un file di testo e due pagine HTML. Il file di testo verrà usato come allegato di posta elettronica.
Nel sito Web aggiungere un nuovo file di testo e denominarlo MyFile.txt.
Copiare il testo seguente e incollarlo nel file:
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.
Creare una pagina denominata SendFile.cshtml e aggiungere il markup seguente:
<!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>
Creare una pagina denominata ProcessFile.cshtml e aggiungere il markup seguente:
@{ 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>
Modificare le impostazioni correlate alla posta elettronica seguenti nel codice dell'esempio:
- Impostare
your-SMTP-host
sul nome di un server SMTP a cui si ha accesso. - Impostare
your-user-name-here
sul nome utente per l'account del server SMTP. - Impostare
your-email-address-here
sul proprio indirizzo di posta elettronica. Questo è l'indirizzo di posta elettronica da cui viene inviato il messaggio. - Impostare
your-account-password
sulla password per l'account del server SMTP. - Impostare
target-email-address-here
sul proprio indirizzo di posta elettronica. Come in precedenza, in genere si inviava un messaggio di posta elettronica a un altro utente, ma per il test, è possibile inviarlo a se stessi.
- Impostare
Eseguire la pagina SendFile.cshtml in un browser.
Immettere il nome, una riga dell'oggetto e il nome del file di testo da allegare (MyFile.txt).
Fare clic sul pulsante
Submit
. Come in precedenza, si verrà reindirizzati alla pagina ProcessFile.cshtml , che conferma il messaggio e che invia un messaggio di posta elettronica con il file allegato.