ASP NET - Email

O envio de email costuma ser um serviço pago a parte em servidores com grande volume de emails.

O envio de email está baseado em uma relação de confiança entre o servidor emitente e o receptor. Digamos que o servidor 'receptor' tem a funcionalidade de 'endossar' o email ( porque com certeza ele é responsável pelo email ) e para isto ele é cuidadoso com a fonte do mesmo.

Contudo se o servidor emitente começa a enviar muitos emails ao servidor destinatário o servidor destinatário tem mecanismos de ajustes e defesas do tipo que responde a ataques bruteforce ou DDOS e com isso começa a suspeitar ou mesmo rejeitar os emails do seu 'antigo' servidor confiável.

Sendo assim se for trabalhar com serviços de envio de emails você deve comprar uma licença se o servidor de destino for um leque pequeno de servidores. Se forem poucos, envie um para cada destino, espere alguns segundos, faça o que puder para não disparar um monte de emails e ser boicotado.

A maioria dos servidores de email chamam o envio maciço de emails de SPAN e simplesmente movem o email do cliente da caixa de entrada para o de 'Lixo Eletronico'. Isso quando não são classificados como um ataque porque seriam totalmente jogados fora sem aviso. Muitas vezes há o envio ao servidor de origem da mensagem que o email não pode ser enviado e o motivo.

Importante 1 : Email sempre foi um problema. Se você conhece servidores de email sabe do que estou falando. Um email tem até 48 horas para ser entregue senão será enviado uma mensagem ao servidor de origem de 'impossível entregar o email'. Isso gera muita confusão porque todo mundo esta acostumado a enviar um email e poucos segundos depois o destinatário recebe ele sem problemas. Mas estamos num mundo onde tudo pode ocorrer como um ataque ou falhas de comunicação.

Importante 2 : O envio e recepção de emails são feitos por processos 'Externos' ao servidor web. São serviços de componentes do sistema operacionais que involve protocolos especialmente feitos para os emails (POP3, IMAP para recepção e SMTP para envio). Portanto o servidor web envia a um processo externo que executa essa funcionalidade mas há pouca interação ('handshake') entre os processos, ou seja, um envia pro outro e o outro que se vire. Já aconteceu comigo dos emails ficarem parados na caixa de saída do servidor por uma falha do sistema operacional ( do tipo atualizou o windows e está esperando o reboot do servidor) e isso gera muito ruído na empresa, especialmente se alguns dos seus serviços forem baseados em emails na intranet da empresa.

Envio de email

Imports System.Net
Imports System.Net.Mail

Public Class Email
    Inherits System.Web.UI.Page

    ''' <summary>
    ''' Nota : Login e senha são necessários caso deseje esconder o usuário capaz de enviar o email
    '''            senão pode ser o usuário corrente mesmo
    ''' </summary>
    ''' <param name="srvsmtp"></param>
    ''' <param name="remetente"></param>
    ''' <param name="destinatario"></param>
    ''' <param name="cc"></param>
    ''' <param name="assunto"></param>
    ''' <param name="tipo"></param>
    ''' <param name="login"></param>
    ''' <param name="senha"></param>
    Public Sub EnviaEmail(srvsmtp As String, remetente As String, destinatario As String, cc As String, assunto As String, tipo As String, login As String, senha As String)
        Dim objEmail = New MailMessage()

        objEmail.From = New MailAddress(remetente)

        'email para resposta(quando o receber e clicar em responder, vai para)
        'objEmail.ReplyTo = New MailAddress("email@seusite.com.br") 'destinatário

        'se houver muitos destinatários repetir a linha abaixo
        objEmail.To.Add(destinatario)

        objEmail.Bcc.Add(cc) 'com copia para - pode repetir

        objEmail.Priority = MailPriority.High 'prioridade do email
        objEmail.IsBodyHtml = True 'o corpo do email esta escrito em HTML
        'objEmail.Subject = assunto        opcional - veja abaixo

        'corpo do email
        Select Case tipo
            Case "pminimo"
                objEmail.Subject = "CONTPRICE - Aprovação de Lista de Preço Mínimo -> "
                objEmail.Body = "acesse o Link -> http://brtsa061/contprice/ para aprovar alterações realizadas na LISTA DE PREÇO MÍNIMO, para o Produto: "
            Case "vendas"
                objEmail.Subject = "CONTPRICE - Aprovação de Lista de Preço de vendas -> "
                objEmail.Body = "acesse o Link -> http://brtsa061/contprice para aprovar alterações realizadas na LISTA DE PREÇOS DE CLIENTES, para o Produto: - "
            Case "rejeitado"
                objEmail.Subject = "CONTPRICE - REJEITADO: "
                objEmail.Body = "Rejeição de preço para o produto ,Cliente: realizada na LISTA DE PREÇOS DE VENDAS. Comentários: "
            Case "aprovado"
                objEmail.Subject = "CONTPRICE - APROVADO: "
                objEmail.Body = "Aprovado preço para o produto: "
        End Select

        'codificação do assunto do email para que os caracteres acentuados serem reconhecidos.
        objEmail.SubjectEncoding = Encoding.GetEncoding("ISO-8859-1")

        'codificação do corpo do emailpara que os caracteres acentuados serem reconhecidos.
        objEmail.BodyEncoding = Encoding.GetEncoding("ISO-8859-1")

        'cria o objeto responsável pelo envio do email
        Dim objSmtp = New SmtpClient()

        'endereço do servidor SMTP(para mais detalhes leia abaixo do código)
        objSmtp.Host = srvsmtp '"smtpam01.int.huntsman.com"

        'para envio de email autenticado, coloque login e senha de seu servidor de email
        'para detalhes leia abaixo do código
        objSmtp.Credentials = New NetworkCredential(login, senha)

        objSmtp.Send(objEmail) 'envia o email

    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'atrelando javascript a botões
        'Button27.Attributes.Add("OnClick", "javascript:document.forms[0].encoding = \"multipart/form-data\";");
        'ExportExcelPreco.Attributes.Add("OnClick", "javascript:document.forms[0].encoding = \"multipart/form-data\";");
    End Sub


End Class

Notas :
1-Muitos se empolgam com esta funcionalidade e pensam que podem fazer uma mala direta para uma clientela composta por centenas ou milhares de clientes. Na realidade, não pode não.

Caso um servidor de email começe a disparar emails para outros servidores os servidores de destino possuem proteções e, por exemplo, se recebem muitos emails eles acreditam que é um SPAM ou que o servidor de origem foi invadido ou raqueado e destinam todos os emails a caixa de 'Lixo Eletronico' e, muitas vezes, o usuário sequer lê esta caixa.

Outra proteção dos servidores que recebem email é contra o ataque DDOS. Os ataques desta categoria visam deixar o servidor tão ocupado que não conseguem fazer mais nada, nem atender o que é mais fundamental ou que foram feitos para fazer.

Caso precisem fazer uma mala direta tentem espaçar o mais possível os envios de email, segregar os destinatários por servidor de destino e com isto evitar que sejam podados por eles. Hoje em dia para você enviar quantos emails quiser para um servidor de destino isso é feito por um serviço pago.