Condividi tramite


Invio di Email da un sito di Pagine Web ASP.NET (Razor)

di Tom FitzMacken

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.

[Screenshot che mostra un messaggio che conferma che è stata ricevuta la segnalazione del problema.]

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.

  1. Creare un nuovo sito Web.

  2. 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.

  3. 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'helper Send 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 nel catch blocco viene eseguito e imposta la errorMessage variabile sull'errore che si è verificato. Per altre informazioni sui try/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 la errorMessage 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. Quando debuggingFlag è 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 variabile debuggingFlag 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 su debuggingFlag 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 diverso From e useranno il nome utente come From 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 o smtp.provider.net. Tuttavia, se si pubblica il sito in un provider di hosting, il nome del server SMTP a quel punto potrebbe essere localhost. 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.EnableSsltrue.
  4. Eseguire la pagina EmailRequest.cshtml in un browser. Assicurarsi che la pagina sia selezionata nell'area di lavoro File prima di eseguirla.

  5. 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.

    [Screenshot che mostra la pagina Richiesta di elaborazione.]

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.

  1. Nel sito Web aggiungere un nuovo file di testo e denominarlo MyFile.txt.

  2. 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.

  3. 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>
    
  4. 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>
    
  5. 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.
  6. Eseguire la pagina SendFile.cshtml in un browser.

  7. Immettere il nome, una riga dell'oggetto e il nome del file di testo da allegare (MyFile.txt).

  8. 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.

Risorse aggiuntive