Partilhar via


Enviando Email de um site de Páginas da Web do ASP.NET (Razor)

por Tom FitzMacken

Este artigo explica como enviar uma mensagem de email de um site quando você usa Páginas da Web do ASP.NET (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

  • Páginas da Web do ASP.NET (Razor) 3

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

Enviando mensagens 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 tenha se registrado.) O WebMail auxiliar facilita o envio de emails.

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ê usar um provedor de hospedagem para seu site, ele provavelmente configurará você com email e poderá informar 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 de:

  • 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 uma SSL (camada de soquetes seguros) para email, talvez precise de 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 de Site-Wide 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, chame o WebMail método do Send auxiliar para criar e enviar a mensagem de email. 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 ocorrido. (Para obter mais informações sobre try/catch blocos ou a <text> marca, consulte Introdução à programação de Páginas da Web do ASP.NET usando a sintaxe Razor.)

    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 estiver 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 verdadeiro e se houver um problema ao enviar emails, será exibida uma mensagem de erro adicional que mostra o que ASP.NET relatou quando tentou enviar a mensagem de email. Aviso justo, porém: as mensagens de erro que ASP.NET relata quando não consegue enviar uma mensagem de email 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ê receber 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 que é 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 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

      Definindo configurações de Email

      Às vezes, pode ser um desafio garantir que você tenha as configurações corretas 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 como 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 da 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 corretas. Se você publicou seu site em um provedor de hospedagem, use as credenciais indicadas especificamente pelo provedor 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 talvez já saiba 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ê será redirecionado para a página ProcessRequest.cshtml , que confirma sua mensagem e que envia uma mensagem de email.

    [Captura de tela que 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-oMyFile.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 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 para 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