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.
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.
Crie um novo site.
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.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 doSend
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 nocatch
bloco será executado e definirá aerrorMessage
variável como o erro ocorrido. (Para obter mais informações sobretry/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 aerrorMessage
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. QuandodebuggingFlag
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áveldebuggingFlag
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 novamentedebuggingFlag
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 diferenteFrom
e usará seu nome de usuário como oFrom
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
ousmtp.provider.net
. No entanto, se você publicar seu site em um provedor de hospedagem, o nome do servidor SMTP nesse ponto poderá serlocalhost
. 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
comotrue
.
- O nome do servidor SMTP geralmente é algo como
Execute a página EmailRequest.cshtml em um navegador. (Verifique se a página está selecionada no workspace Arquivos antes de executá-la.)
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.
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.
No site, adicione um novo arquivo de texto e nomeie-oMyFile.txt.
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.
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>
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>
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.)
- Defina
Execute a página SendFile.cshtml em um navegador.
Insira seu nome, uma linha de assunto e o nome do arquivo de texto a ser anexado (MyFile.txt).
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.