Enviar email de um site de páginas da Web ASP.NET (Razor)

por Tom FitzMacken

Este artigo explica como enviar uma mensagem de email de um site quando você usa ASP.NET Páginas da Web (Razor).

O que você aprenderá:

  • Como enviar uma mensagem de email do seu site.
  • Como anexar um arquivo a uma mensagem de email.

Este é o recurso ASP.NET introduzido no artigo:

  • O WebMail auxiliar.

Versões de software usadas no tutorial

  • ASP.NET Web Pages (Razor) 3

Este tutorial também funciona com ASP.NET Páginas da Web 2.

Enviando mensagens de email do seu site

Há todos os tipos de motivos pelos quais talvez seja necessário enviar emails do seu site. Você pode enviar mensagens de confirmação aos usuários ou enviar notificações para si mesmo (por exemplo, que um novo usuário se registrou).) O WebMail auxiliar facilita o envio de email.

Para usar o WebMail auxiliar, você precisa ter acesso a um servidor SMTP. (SMTP significa Simple Mail Transfer Protocol.) Um servidor SMTP é um servidor de email que só encaminha mensagens para o servidor do destinatário , é o lado de saída do email. Se você usa um provedor de hospedagem para seu site, eles provavelmente já configuraram seu email e podem lhe dizer qual é o nome do servidor SMTP. Se você estiver trabalhando dentro de uma rede corporativa, um administrador ou seu departamento de TI geralmente poderá fornecer as informações sobre um servidor SMTP que você pode usar. Se você estiver trabalhando em casa, poderá até mesmo testar usando seu provedor de email comum, que pode informar o nome do servidor SMTP. Normalmente, você precisa:

  • O nome do servidor SMTP.
  • O número da porta. Isso é quase sempre 25. No entanto, seu ISP pode exigir que você use a porta 587. Se você estiver usando ssl (camada de soquetes seguros) para email, talvez seja necessário uma porta diferente. Verifique com seu provedor de email.
  • Credenciais (nome de usuário, senha).

Neste procedimento, você cria duas páginas. A primeira página tem um formulário que permite que os usuários insiram uma descrição, como se estivessem preenchendo um formulário de suporte técnico. A primeira página envia suas informações para uma segunda página. Na segunda página, o código extrai as informações do usuário e envia uma mensagem de email. Ele também exibe uma mensagem confirmando que o relatório de problemas foi recebido.

[Captura de tela mostra uma mensagem confirmando que o relatório de problemas foi recebido.]

Observação

Para manter este exemplo simples, o código inicializa o WebMail auxiliar diretamente na página em que você o usa. No entanto, para sites reais, é melhor colocar o código de inicialização como este em um arquivo global, para que você inicialize o WebMail auxiliar para todos os arquivos em seu site. Para obter mais informações, consulte Personalizando o comportamento do site inteiro para páginas da Web do ASP.NET.

  1. Crie um novo site.

  2. Adicione uma nova página chamada EmailRequest.cshtml e adicione a seguinte marcação:

    <!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>
    

    Observe que o action atributo do elemento de formulário foi definido como ProcessRequest.cshtml. Isso significa que o formulário será enviado para essa página em vez de voltar para a página atual.

  3. Adicione uma nova página chamada ProcessRequest.cshtml ao site e adicione o seguinte código e marcação:

    @{
        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>
    

    No código, você obtém os valores dos campos de formulário que foram enviados para a página. Em seguida, você chama o método do auxiliar WebMailSend para criar e enviar a mensagem de e-mail. Nesse caso, os valores a serem usados são compostos pelo texto que você concatena com os valores que foram enviados do formulário.

    O código dessa página está dentro de um try/catch bloco. Se, por algum motivo, a tentativa de enviar um email não funcionar (por exemplo, as configurações não estiverem corretas), o código no catch bloco será executado e definirá a errorMessage variável como o erro que ocorreu. (Para obter mais informações sobre try/catch blocos ou a <text> marca, consulte Introdução à programação de páginas da Web com a sintaxe Razor usando ASP.NET.)

    No corpo da página, se a errorMessage variável estiver vazia (o padrão), o usuário verá uma mensagem informando que a mensagem de email foi enviada. Se a errorMessage variável for definida como true, o usuário verá uma mensagem informando que houve um problema ao enviar a mensagem.

    Observe que, na parte da página que exibe uma mensagem de erro, há um teste adicional: if(debuggingFlag). Essa é uma variável que você pode definir como true se estiver tendo problemas para enviar emails. Quando debuggingFlag for true e se houver um problema ao enviar emails, será exibida uma mensagem de erro adicional que mostra o que ASP.NET relatou ao tentar enviar a mensagem de email. Aviso justo, porém: as mensagens de erro que o ASP.NET reporta quando não pode enviar um e-mail podem ser genéricas. Por exemplo, se ASP.NET não puder contatar o servidor SMTP (por exemplo, porque você cometeu um erro no nome do servidor), o erro será Failure sending mail.

    Observação

    Importante Quando você recebe uma mensagem de erro de um objeto de exceção (ex no código), não passe essa mensagem rotineiramente para os usuários. Objetos de exceção geralmente incluem informações que os usuários não devem ver e que podem até ser uma vulnerabilidade de segurança. É por isso que esse código inclui a variável debuggingFlag usada como um comutador para exibir a mensagem de erro e por que a variável por padrão é definida como false. Você deve definir essa variável como true (e, portanto, exibir a mensagem de erro) somente se você estiver tendo um problema com o envio de email e precisar depurar. Depois de corrigir problemas, defina novamente debuggingFlag como false.

    Modifique as seguintes configurações relacionadas ao email no código:

    • Defina your-SMTP-host como o nome do servidor SMTP ao qual você tem acesso.

    • Defina your-user-name-here como o nome de usuário para sua conta de servidor SMTP.

    • Defina your-account-password como a senha da sua conta de servidor SMTP.

    • Defina your-email-address-here como seu próprio endereço de email. Esse é o endereço de email do qual a mensagem é enviada. (Alguns provedores de email não permitem que você especifique um endereço diferente From e usará seu nome de usuário como o From endereço.)

      Dica

      Configurando configurações de email

      Às vezes, pode ser um desafio garantir que você tenha as configurações certas para o servidor SMTP, o número da porta e assim por diante. Veja a seguir algumas dicas:

      • O nome do servidor SMTP geralmente é algo parecido smtp.provider.com ou smtp.provider.net. No entanto, se você publicar seu site em um provedor de hospedagem, o nome do servidor SMTP nesse ponto poderá ser localhost. Isso ocorre porque depois que você publica e seu site está em execução no servidor do provedor, o servidor de email pode ser local sob a perspectiva do seu aplicativo. Essa alteração nos nomes do servidor pode significar que você precisa alterar o nome do servidor SMTP como parte do processo de publicação.
      • O número da porta geralmente é 25. No entanto, alguns provedores exigem que você use a porta 587 ou alguma outra porta.
      • Certifique-se de usar as credenciais certas. Se você publicou seu site em um provedor de hospedagem, use as credenciais que o provedor indicou especificamente são para email. Elas podem ser diferentes das credenciais que você usa para publicar.
      • Às vezes, você não precisa de credenciais. Se você estiver enviando emails usando seu ISP pessoal, seu provedor de email poderá já saber suas credenciais. Depois de publicar, talvez seja necessário usar credenciais diferentes do que quando você testa em seu computador local.
      • Se o provedor de email usar criptografia, você precisará definir WebMail.EnableSsl como true.
  4. Execute a página EmailRequest.cshtml em um navegador. (Verifique se a página está selecionada no workspace Arquivos antes de executá-la.)

  5. Insira seu nome e uma descrição do problema e clique no botão Enviar . Você é redirecionado para a página ProcessRequest.cshtml , que confirma sua mensagem e que envia uma mensagem de email.

    [Captura de tela mostra a página Solicitação de Processo.]

Enviando um arquivo usando email

Você também pode enviar arquivos anexados a mensagens de email. Neste procedimento, você cria um arquivo de texto e duas páginas HTML. Você usará o arquivo de texto como um anexo de email.

  1. No site, adicione um novo arquivo de texto e nomeie-o MyFile.txt.

  2. Copie o seguinte texto e cole-o no arquivo:

    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. Crie uma página chamada SendFile.cshtml e adicione a seguinte marcação:

    <!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. Crie uma página chamada ProcessFile.cshtml e adicione a seguinte marcação:

    @{
        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. Modifique as seguintes configurações relacionadas ao email no código a partir do exemplo:

    • Defina your-SMTP-host como o nome de um servidor SMTP ao qual você tem acesso.
    • Defina your-user-name-here como o nome de usuário para sua conta de servidor SMTP.
    • Defina your-email-address-here como seu próprio endereço de email. Esse é o endereço de email do qual a mensagem é enviada.
    • Defina your-account-password como a senha da sua conta de servidor SMTP.
    • Defina target-email-address-here como seu próprio endereço de email. (Como antes, você normalmente enviaria um email para outra pessoa, mas para teste, você pode enviá-lo para si mesmo.)
  6. Execute a página SendFile.cshtml em um navegador.

  7. Insira seu nome, uma linha de assunto e o nome do arquivo de texto a ser anexado (MyFile.txt).

  8. Clique no botão Submit. Como antes, você é redirecionado para a página ProcessFile.cshtml , que confirma sua mensagem e que envia uma mensagem de email com o arquivo anexado.

Recursos adicionais