Exemplo de código para enviar email utilizando aspx, utilizando credenciais para o envio (passando usuário e senha):
(código comentado e com tratamento de erros)
desenvolvido em Visual Studio 2005, utilizando a linguagem C#
Crie um novo projeto web no VS 2005, adicione uma nova página com o nome
email.aspx
código HTML para a página
email.aspx:
CODE
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="email.aspx.cs" Inherits="email" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Enviar e-mail</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtSmtp" runat="server"
Style="z-index: 109; left: 50px; position: absolute; top: 44px"></asp:TextBox>
<asp:Label ID="lblSmtp" runat="server" Style="z-index: 109; left: 50px; position: absolute;
top: 21px" Text="Servidor SMTP"></asp:Label>
<asp:Label ID="Label1" runat="server" Style="z-index: 109; left: 213px; position: absolute;
top: 14px" Text="Exemplos SMTP:<br>Terra: smtp.scl.terra.com.br<br>gmail: smtp.gmail.com"></asp:Label>
<asp:TextBox ID="txtDe" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 241px" Width="270px"></asp:TextBox>
<asp:Label ID="Label2" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 218px" Text="De:"></asp:Label>
<asp:TextBox ID="txtPara" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 293px" Width="270px"></asp:TextBox>
<asp:Label ID="Label3" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 270px" Text="Para:"></asp:Label>
<asp:TextBox ID="txtCC" runat="server" Style="z-index: 109; left: 423px; position: absolute;
top: 241px" Width="270px"></asp:TextBox>
<asp:Label ID="Label4" runat="server" Style="z-index: 109; left: 423px; position: absolute;
top: 218px" Text="Com cópia:"></asp:Label>
<asp:TextBox ID="txtCCO" runat="server" Style="z-index: 109; left: 423px; position: absolute;
top: 293px" Width="270px"></asp:TextBox>
<asp:Label ID="Label5" runat="server" Style="z-index: 109; left: 423px; position: absolute;
top: 270px" Text="Com cópia oculta:"></asp:Label>
<asp:TextBox ID="txtPorta" runat="server" Style="z-index: 109; left: 50px; position: absolute;
top: 106px"></asp:TextBox>
<asp:Label ID="Label6" runat="server" Style="z-index: 109; left: 50px; position: absolute;
top: 83px" Text="Porta"></asp:Label>
<asp:TextBox ID="txtUsuario" runat="server" Style="z-index: 109; left: 419px; position: absolute;
top: 38px" Width="270px"></asp:TextBox>
<asp:Label ID="Label7" runat="server" Style="z-index: 109; left: 419px; position: absolute;
top: 15px" Text="Usuário:"></asp:Label>
<asp:TextBox ID="txtSenha" runat="server" Style="z-index: 109; left: 420px; position: absolute;
top: 100px" Width="161px"></asp:TextBox>
<asp:Label ID="Label8" runat="server" Style="z-index: 109; left: 420px; position: absolute;
top: 77px" Text="Senha:"></asp:Label>
<asp:TextBox ID="txtAssunto" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 349px" Width="270px"></asp:TextBox>
<asp:Label ID="Label9" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 326px" Text="Assunto:"></asp:Label>
<asp:TextBox ID="txtMensagem" runat="server" Height="225px" Style="z-index: 109;
left: 55px; position: absolute; top: 406px" TextMode="MultiLine" Width="407px"></asp:TextBox>
<asp:Label ID="Label10" runat="server" Style="z-index: 109; left: 53px; position: absolute;
top: 383px" Text="Mensagem:"></asp:Label>
<asp:Label ID="Label13" runat="server" Style="z-index: 109; left: 478px; position: absolute;
top: 383px" Text="Anexos:"></asp:Label>
<asp:Button ID="btnEnviarEmail" runat="server" Text="Enviar"
Style="z-index: 109; left: 416px; position: absolute; top: 645px" OnClick="btnEnviarEmail_Click"/>
<asp:Button ID="btnEnviarArq" runat="server" Text="Enviar Anexo"
Style="z-index: 109; left: 480px; position: absolute; top: 443px" OnClick="btnEnviarArq_Click"/>
<asp:Label ID="lblResultado" runat="server" Style="z-index: 109; left: 55px; position: absolute;
top: 684px"></asp:Label>
<asp:Label ID="Label11" runat="server" Style="z-index: 109; left: 214px; position: absolute;
top: 102px" Text="Porta Padrão 25<br>Para gmail use 587 ou 465"></asp:Label>
<asp:CheckBox ID="chkSsl" runat="server"
Style="z-index: 109; left: 50px; position: absolute; top: 154px" Text="Secure Sockets Layer (SSL)"/>
<asp:CheckBox ID="chkLeitura" runat="server"
Style="z-index: 109; left: 55px; position: absolute; top: 647px" Text="Confirmação de Leitura"/>
<asp:Label ID="Label12" runat="server"
Style="z-index: 109; left: 423px; position: absolute; top: 326px" Text="Tipo Mensagem:"></asp:Label>
<asp:DropDownList ID="ddlTipoMsg" runat="server"
Style="z-index: 109; left: 423px; position: absolute; top: 349px" Width="144px"></asp:DropDownList>
<asp:FileUpload ID="filUpload" runat="server"
Style="z-index: 109; left: 478px; position: absolute; top: 406px" />
<asp:ListBox ID="lstAnexos" runat="server"
Style="z-index: 109; left: 480px; position: absolute; top: 471px" Height="138px" Width="231px"></asp:ListBox>
<asp:Button ID="btnExcluirArq" runat="server" Text="Excluir Anexo"
Style="z-index: 109; left: 590px; position: absolute; top: 614px" OnClick="btnExcluirArq_Click"/></div>
</form>
</body>
</html>
a janela ira ficar neste formato:
códigos para o arquivo CS,
email.aspx.cs:
Namespaces:
CODE
//Namespaces carregados por padrão ao incluir uma nova página no VS 2005
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//Namespaces usados para o envio de email
using System.Net.Mail;
using System.Net.Mime;
código para o evento
Page_Load:
CODE
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.txtSenha.TextMode = TextBoxMode.Password;
//habilitando multipla seleção na lista de anexos
this.lstAnexos.SelectionMode = ListSelectionMode.Multiple;
//carregando os tipos de mensagem
this.ddlTipoMsg.Items.Add(new ListItem("HTML", "0"));
this.ddlTipoMsg.Items.Add(new ListItem("RICHTEXT", "1"));
this.ddlTipoMsg.Items.Add(new ListItem("XML", "2"));
this.ddlTipoMsg.Items.Add(new ListItem("PLAIN", "3"));
//ajuste dos tabindex's dos controles
Int16 vTabIndex = 1;
this.txtSmtp.TabIndex = vTabIndex++;
this.txtPorta.TabIndex = vTabIndex++;
this.txtUsuario.TabIndex = vTabIndex++;
this.txtSenha.TabIndex = vTabIndex++;
this.chkSsl.TabIndex = vTabIndex++;
this.txtDe.TabIndex = vTabIndex++;
this.txtPara.TabIndex = vTabIndex++;
this.txtCC.TabIndex = vTabIndex++;
this.txtCCO.TabIndex = vTabIndex++;
this.txtAssunto.TabIndex = vTabIndex++;
this.ddlTipoMsg.TabIndex = vTabIndex++;
this.txtMensagem.TabIndex = vTabIndex++;
this.filUpload.TabIndex = vTabIndex++;
this.btnEnviarArq.TabIndex = vTabIndex++;
this.lstAnexos.TabIndex = vTabIndex++;
this.btnExcluirArq.TabIndex = vTabIndex++;
this.chkLeitura.TabIndex = vTabIndex++;
this.btnEnviarEmail.TabIndex = vTabIndex++;
this.txtSmtp.Focus();
}
}
código para os
tratamentos, validações
CODE
#region Validadores
private bool IsEmpty(string str)
{
bool isValid = true;
try
{
if ((str == null) || (str.ToString().Trim().Length == 0))
{
isValid = false;
}
}
catch
{
isValid = false;
}
return !isValid;
}
private bool IsNumber(string str)
{
bool isValid = true;
try
{
long number = Int64.Parse(str);
}
catch
{
isValid = false;
}
return isValid;
}
private bool IsEmail(string str)
{
string[] mails = str.Split(';');
foreach (string ma in mails)
{
if (ma.Trim() != "" && !this.IsEmailUnico(ma.Trim()))
return false;
}
return true;
}
private bool IsEmailUnico(string str)
{
string[] mails = str.Split(';');
foreach (string ma in mails)
{
if (ma.Trim() != "")
{
string patternStrictEmail = @"^(([^<>()[\]\\.,;:\s@\""]+"
+ @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@"
+ @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
+ @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+"
+ @"[a-zA-Z]{2,}))$";
System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(patternStrictEmail);
if (!re.IsMatch(ma.Trim()))
return false;
}
}
return true;
}
private bool ValidarCampos()
{
bool resultado = true;
this.lblResultado.ForeColor = System.Drawing.Color.BlueViolet;
this.lblResultado.Text = "";
if (this.IsEmpty(this.txtSmtp.Text))
{
this.txtSmtp.Focus();
this.lblResultado.Text += "Campo SMTP não pode ficar em branco<br>";
resultado = false;
}
if (this.IsEmpty(this.txtPorta.Text))
{
this.txtPorta.Focus();
this.lblResultado.Text += "Campo PORTA não pode ficar em branco<br>";
resultado = false;
}
if (!this.IsNumber(this.txtPorta.Text))
{
this.txtPorta.Focus();
this.lblResultado.Text += "Campo PORTA deve ser numérico<br>";
resultado = false;
}
if (this.IsEmpty(this.txtUsuario.Text))
{
this.txtUsuario.Focus();
this.lblResultado.Text += "Campo USUÁRIO não pode ficar em branco<br>";
resultado = false;
}
if (this.IsEmpty(this.txtSenha.Text))
{
this.txtSenha.Focus();
this.lblResultado.Text += "Campo SENHA não pode ficar em branco<br>";
resultado = false;
}
if (this.IsEmpty(this.txtDe.Text))
{
this.txtDe.Focus();
this.lblResultado.Text += "Campo DE não pode ficar em branco<br>";
resultado = false;
}
if (this.IsEmpty(this.txtPara.Text))
{
this.txtPara.Focus();
this.lblResultado.Text += "Campo PARA não pode ficar em branco<br>";
resultado = false;
}
if (this.IsEmpty(this.txtAssunto.Text))
{
this.txtAssunto.Focus();
this.lblResultado.Text += "Campo ASSUNTO não pode ficar em branco<br>";
resultado = false;
}
if (!this.IsEmailUnico(this.txtDe.Text))
{
this.txtDe.Focus();
this.lblResultado.Text += "Campo DE deve ser um e-mail válido<br>";
resultado = false;
}
if (!this.IsEmail(this.txtPara.Text))
{
this.txtPara.Focus();
this.lblResultado.Text += "Campo PARA deve ser um e-mail válido, caso for necessário separar por;<br>";
resultado = false;
}
if (!this.IsEmail(this.txtCC.Text))
{
this.txtCC.Focus();
this.lblResultado.Text += "Campo CC deve ser um e-mail válido, caso for necessário separar por;<br>";
resultado = false;
}
if (!this.IsEmail(this.txtCCO.Text))
{
this.txtCCO.Focus();
this.lblResultado.Text += "Campo CCO deve ser um e-mail válido, caso for necessário separar por;<br>";
resultado = false;
}
return resultado;
}
#endregion
código para o evento
Click do botão
Enviar e-mail
CODE
protected void btnEnviarEmail_Click(object sender, EventArgs e)
{
//Cria uma nova instância da Classe MailMessage
MailMessage message = new MailMessage();
SmtpClient client = new SmtpClient();
try
{
if (this.ValidarCampos())
{
//montando e-mail
message.From = new MailAddress(this.txtDe.Text.Trim(), this.txtDe.Text.Trim(), System.Text.Encoding.GetEncoding(1252));
message.SubjectEncoding = System.Text.Encoding.GetEncoding(1252);
message.BodyEncoding = System.Text.Encoding.GetEncoding(1252);
string[] destinatarios = this.txtPara.Text.Trim().Split(';');
foreach (string dest in destinatarios)
{
if (dest.Trim() != "")
message.CC.Add(dest);
}
if (!this.IsEmpty(this.txtCC.Text))
{
destinatarios = this.txtCC.Text.Trim().Split(';');
foreach (string dest in destinatarios)
{
if (dest.Trim() != "")
message.CC.Add(dest);
}
}
if (!this.IsEmpty(this.txtCCO.Text))
{
destinatarios = this.txtCCO.Text.Trim().Split(';');
foreach (string dest in destinatarios)
{
if (dest.Trim() != "")
message.CC.Add(dest);
}
}
message.Subject = this.txtAssunto.Text.Trim();
string MsgTipo;
//Define o tipo do corpo da mensagem
switch (this.ddlTipoMsg.SelectedValue)
{
case "0":
MsgTipo = MediaTypeNames.Text.Html;
break;
case "1":
MsgTipo = MediaTypeNames.Text.RichText;
break;
case "2":
MsgTipo = MediaTypeNames.Text.Xml;
break;
default:
MsgTipo = MediaTypeNames.Text.Plain;
break;
}
//Cria Instância de AlternateView para os Tipos de Corpo de Email
AlternateView alternate = AlternateView.CreateAlternateViewFromString(this.txtMensagem.Text.Trim(), System.Text.Encoding.GetEncoding(1252), MsgTipo);
message.AlternateViews.Add(alternate);
//confirmaçção de leitura
if (this.chkLeitura.Checked)
message.Headers.Add("Disposition-Notification-To", "<" + this.txtDe.Text.Trim() + ">");
//anexando arquivos
foreach (ListItem li in this.lstAnexos.Items)
{
if (li.Enabled) //isso para não enviar anexos que foram excluidos
{
Attachment data = new Attachment(li.Value, MediaTypeNames.Application.Octet);
message.Attachments.Add(data);
}
}
//verificando autenticação
client.Credentials = new System.Net.NetworkCredential(this.txtUsuario.Text.Trim(), this.txtSenha.Text.Trim());
client.Port = Convert.ToInt32(this.txtPorta.Text.Trim());
client.Host = this.txtSmtp.Text.Trim();
//client.UseDefaultCredentials = false;
client.EnableSsl = chkSsl.Checked;
//enviando e-mail
client.Send(message);
//limpa controles
this.lstAnexos.Items.Clear();
this.txtMensagem.Text = "";
this.txtAssunto.Text = "";
this.txtPara.Focus();
this.lblResultado.ForeColor = System.Drawing.Color.Blue;
this.lblResultado.Text = "e-mail enviado com sucesso!";
}
}
catch (Exception ex)
{
this.lblResultado.ForeColor = System.Drawing.Color.Red;
this.lblResultado.Text = "Erro no envio de email:<br>" + ex.Message.ToString();
}
finally
{
message.Dispose();
message = null;
client = null;
}
}
código para o evento
Click do botão
Enviar Anexo
CODE
protected void btnEnviarArq_Click(object sender, EventArgs e)
{
try
{
//Verifica se tem alguma coisa postada
if (this.filUpload.PostedFile.ContentLength != 0 && this.filUpload.HasFile)
{
string caminhoArq = "E:\\Temp\\" + this.filUpload.FileName;
bool vRepetido = false;
foreach (ListItem li in this.lstAnexos.Items)
{
if ((li.Enabled) && (li.Value.Trim().Equals(caminhoArq.Trim(), StringComparison.OrdinalIgnoreCase)))
vRepetido = true;
}
if (vRepetido)
{
this.lblResultado.ForeColor = System.Drawing.Color.BlueViolet;
this.lblResultado.Text = "Arquivo já incluido!";
}
else
{
this.filUpload.PostedFile.SaveAs(caminhoArq);
this.lstAnexos.Items.Add(new ListItem(this.filUpload.FileName, caminhoArq));
this.lblResultado.ForeColor = System.Drawing.Color.Green;
this.lblResultado.Text = "Anexo incluído: " + this.filUpload.FileName;
}
}
else
{
this.lblResultado.ForeColor = System.Drawing.Color.BlueViolet;
this.lblResultado.Text = "Selecione um arquivo para anexar";
}
}
catch (Exception ex)
{
this.lblResultado.ForeColor = System.Drawing.Color.Salmon;
this.lblResultado.Text = "Falha ao anexar arquivo:<br>" + ex.Message.ToString();
}
}
código para o evento
Click do botão
Excluir Anexo
CODE
protected void btnExcluirArq_Click(object sender, EventArgs e)
{
try
{
foreach (ListItem li in this.lstAnexos.Items)
{
if (li.Selected)
li.Enabled = false;
//this.lstAnexos.Items.Remove(li);
}
this.lblResultado.Text = "";
}
catch (Exception ex)
{
this.lblResultado.ForeColor = System.Drawing.Color.Salmon;
this.lblResultado.Text = "Falha ao excluir arquivo anexado:<br>" + ex.Message.ToString();
}
}
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.
Comentários:
Gordinho disse:
quando clico em envia anexo da erro na seguinte linha:
string caminhoArq = "E:\\Temp\\" + this.filUpload.FileName;
arquivo não encontrado no respectivo caminho.
o outro é assim, eu ocultei a parte de verificação de anexo e tentei mandar um e-mail sem anexo.
só que da erro na linha para enviar o e-mail.
//enviando e-mail
client.Send(message);
se possível gostaria de uma ajuda para resolver.
Att. Felipe
eriva_br disse:
quando clico em envia anexo da erro na seguinte linha:
string caminhoArq = "E:\\Temp\\" + this.filUpload.FileName;
arquivo não encontrado no respectivo caminho.
mas vc tem essa pasta ai no seu computador ???
o outro é assim, eu ocultei a parte de verificação de anexo e tentei mandar um e-mail sem anexo.
só que da erro na linha para enviar o e-mail.
//enviando e-mail
client.Send(message);
...e qual a mensagem de erro ???
Gordinho disse:
string caminhoArq = "E:\\Temp\\" + this.filUpload.FileName;
para ter uma noção de qual pasta colocar no lugar do "E:\\Temp\\".
tem que ser duas "\\" ou pode ser uma?
[/size]
[size="2"]erro no send:
Erro no envio de email:
Failure sending mail. linha = 18
essa "linha = 18" foi um modo que encontrei de acahr onde da erro.
att, Felipe
eriva_br disse:
ai não vai funcionar mesmo
essa pasta serve para armazenar os arquivos postados no servidor, já que a página pode estar em qualquer cliente
para ter uma noção de qual pasta colocar no lugar do "E:\\Temp\\".
tem que ser duas "\\" ou pode ser uma?
se quiser colocar uma barra informe antes com o caracter @, pois em C o caracter \ é reservado, exemplo:
string caminhoArq = @"C:\SuaPasta\" + this.filUpload.FileName;
Erro no envio de email:
Failure sending mail. linha = 18
essa "linha = 18" foi um modo que encontrei de acahr onde da erro.
não conheço esse erro... a rotina acima esta correta, testei com terra, gmail, hotmail, etc... verifica se esta passando os valores corretos para smtp, porta, usuario e senha
boa sorte
Ver o restante dos comentários no fórum (e aproveitar pra comentar também !).