Envio de E-mail pelo formulário LATROMI

Boa tarde a todos,

Estou com uma demanda onde precisarei criar um formulário que enviar um e-mail em cada uma das etapa do processo.

A medida que o próximo usuário realiza sua aprovação um e-mail é enviado para o próximo aprovador realizar sua parte no processo.

Gostaria de saber se é possível de realizar esse codificação nas linguagem C#, javascript ou PHP com um servidor SMTP dentro de um formulário.

Caso exista algum exemplo também me ajudaria.

Desde já obrigado.

Olá @Framos!

Vou mostrar um exemplo de como enviar para o GMail. Dependendo do servidor de e-mails pode ter alguma diferença no valor dos parâmetros. Aí tem que testar pra ver se funciona.

Procedimento

Neste meu exemplo, o procedimento que envia o e-mail tem duas instruções fundamentais:

  1. Criar Record - Usado para acessar o banco de dados e carregar as configurações de SMTP.
  2. Executar Comando C# - Usado para executar o código C# que faz o envio do e-mail.

Criar Record

Use um comando SQL que retornar as configurações SMTP. Abaixo um exemplo bem simples trazendo os valores fixos, em uma record chamada rSMTP:

SELECT 
	'smtp.gmail.com' 			AS smtp_host
	, 587 						AS smtp_port
	, 'user@gmail.com' 	        AS smtp_name
	, 'senha_do_email' 			AS smtp_password

Executar Comando C#

Agora vamos adicionar uma instrução “Executar Comando C#”. No código que vamos utilizar, os dados da configuração SMTP serão capturados da Record e usados para configurar o objeto System.Net.Mail.SmtpClient:

using System.Net;
using System.Net.Mail;
using System.Net.Mime;

// Obtem as configurações da Record
var rSMTP = GetRecord("rSMTP");

string smtp_host = (string)rSMTP["smtp_host"];
int smtp_port = Convert.ToInt32(rSMTP["smtp_port"]);
string smtp_address = (string)rSMTP["smtp_name"];
string smtp_alias = "Latromi não responda";
string smtp_username = smtp_address;
string smtp_password = (string)rSMTP["smtp_password"];

// Valida campo obrigatórios
if (string.IsNullOrEmpty(smtp_host))
	throw new InvalidOperationException("Endereço do Servidor SMTP não informado.");

if (smtp_port == 0)
	throw new InvalidOperationException("Porta do Servidor SMTP não informado.");

if (string.IsNullOrEmpty(smtp_username) || string.IsNullOrEmpty(smtp_username))
	throw new InvalidOperationException("Endereço de e-mail não informado.");

// Texto da mensagem
var messageBuilder = new StringBuilder()
	.AppendLine("Olá!")
	.AppendLine("Essa é uma mensagem de teste...")
	.AppendLine("Tchau!");

using (SmtpClient client = new SmtpClient())
{
    MailMessage message = new MailMessage()
    {
        From = new MailAddress(smtp_address, smtp_alias),
        // Assunto
        Subject = "Email de Teste",
        SubjectEncoding = Encoding.UTF8,
        IsBodyHtml = false,
        // Mensagem
        Body = messageBuilder.ToString(),
        BodyEncoding = Encoding.UTF8,
    };

    // Adiciona destinatarios
    message.To.Add(new MailAddress("endereco de email do destinatário", "nome do destinatário"));
                
    // Para adicionar endereços em cópia, descomente a linha abaixo
    //message.CC.Add(new MailAddress("endereco de email de CC", "nome do destinatário CC"));

    // Configuração do SMTP
    client.Host = smtp_host;
    client.Port = smtp_port;
    client.EnableSsl = true;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;

    // Autenticação
    client.Credentials = new NetworkCredential(smtp_username, smtp_password);

    // Envia o e-mail (síncrono)
    client.Send(message);
}

O e-mail recebido ficaria mais ou menos assim:

image


Atualização

Um novo tipo de Objeto chamado Bot de Mensagens pode ser usado para enviar mensagens pelo LATROMI. É uma solução muito melhor do que a abordada acima.

Mais informações no link abaixo:

Bom dia tudo bem?
Estou tendo algumas dificuldades para colocar o código para funcionar.

Estava tentando realizar o processo de envio, porém, obtive esse erro abaixo.
Sem título

Fiz uma alteração simples de troca de nome das variáveis e consegui mitigar.
Sem título3

Porém agora estou com esse problema de autenticação segura, poderia me ajudar com isso?
O código é o mesmo a única coisa que alterei foram os nomes das variais para maiúscula.
Sem título4

Também estou com um pouco de duvidas em relação a o arquivo System.Net.Mail.SmtpClient isso é uma importação que eu devo realizar?

Desde já muito obrigado pela ajuda.

Este primeiro erro está relacionado ao nome dos campos da Record, como você já havia descoberto. Você deve estar usando ORACLE, e nele o nome das colunas ficam em maiúsculo por padrão.


Este é um erro de autenticação com o servidor de e-mails. Como eu comentei, dependendo do servidor podem haver variações. Seguem abaixo os motivos mais prováveis:

  • Usuário ou Senha incorretos.

  • O usuário de autenticação esteja sendo enviado com o domínio (@servidor.com.br) mas o servidor espera apenas o nome do usuário.

Se mesmo assim continuar tendo dificuldade, recomendo colocar este código em um projeto do tipo Console do Visual Studio, usar valores fixos nas variáveis e ir modificando as propriedades até conseguir autenticar.


No .NET não precisamos importar cada objeto que será utilizado. Realizamos apenas a importação do namespace ao qual o objeto pertence, no caso System.Net.Mail.

Boa noite pessoal.

Após muitas tentativas consegui solucionar o erro:

Porem, a solução do ultimo problemas estava na conta de e-mail, segui o exemplo da comunidade abaixo.

A resposta do servidor foi: 5.5.1 Autenticação necessária

@daniel.giacomelli muito obrigado por me ajudar!! :+1:t5: :love_you_gesture:t5:

1 curtida

Boa tarde Daniel,

Poderia me ajuda com o problema abaixo?

Após a migração do servidor o código parou e funcionar.

Você já viu esse erro antes?

segue meu Código

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;

// Obtem as configurações da Record
var rSMTPDB = GetRecord("rSMTPDB");
var rId = GetRecord("rId");

// Capiturar as informações de host port email de origem destino e copia.
string 	smtp_host = (string)rSMTPDB["SMTP_HOST"];       
int 	smtp_port = Convert.ToInt32(rSMTPDB["SMTP_PORT"]);
string 	smtp_address = (string)rSMTPDB["SMTP_NAME"];
string 	smtp_password = (string)rSMTPDB["SMTP_PASSWORD"];
string 	smtp_destino = (string)rSMTPDB["SMTP_DESI"];
string 	smtp_copia = (string)rSMTPDB["SMTP_COPI"];

string 	smtp_username = smtp_address;

// Dados para montar o email
string 	smtp_alias = "Controle de terceiros";
string 	Id_solicitacao = (string)rId["NUM_TXT"];  
string 	Solicitante = (string)rId["SOLICITANTE"]; 
string 	centroCusto = (string)rId["CENTRODECUSTO"]; 
string 	turno = (string)rId["TURNO"]; 

string 	DATAI = (string)rId["DT_INICIO"]; 
string 	DATAF = (string)rId["DT_FINAL"]; 
string 	OBS = (string)rId["OBS"]; 

string 	NPessoas = (string)rId["NUMEROPES"]; 
string 	area = (string)rId["AREA"]; 

// Valida campo obrigatórios
if (string.IsNullOrEmpty(smtp_host))
	throw new InvalidOperationException("Endereço do Servidor SMTP não informado.");

if (smtp_port == 0)
	throw new InvalidOperationException("Porta do Servidor SMTP não informado.");

if (string.IsNullOrEmpty(smtp_username) || string.IsNullOrEmpty(smtp_username))
throw new InvalidOperationException("Endereço de e-mail não informado.");

// Texto da mensagem
var messageBuilder = new StringBuilder()
.AppendLine("Olá aprovador")
.AppendLine("Solicitação N° "+ Id_solicitacao  +" pendente de aprovação.")
.AppendLine("link da o fornulário: http://10.29.66.139/LATROMI/WecDB/Report.aspx?                idmenu=1697&type=GRID")
.AppendLine("")
.AppendLine("Dados da Solicitação:")
.AppendLine("Solicitante: " + Solicitante)
.AppendLine("Centro de custo: " + centroCusto)
.AppendLine("Numero de Pessoas: " + NPessoas)
.AppendLine("Área: " + area)
.AppendLine("Turno: "+ turno)
.AppendLine("Data início: " + DATAI)
.AppendLine("Data final: " 	+ DATAF)
.AppendLine("Observação: " 	+ OBS);

using (SmtpClient client = new SmtpClient())
{
    MailMessage message = new MailMessage()
    {
        From = new MailAddress(smtp_address, smtp_alias),
        // Assunto
        Subject = "Solicitação N° " + Id_solicitacao  + " pendente de aprovação",
        SubjectEncoding = Encoding.UTF8,
        IsBodyHtml = false,
        // Mensagem
        Body = messageBuilder.ToString(),
        BodyEncoding = Encoding.UTF8,
    };

    // Adiciona destinatarios (O For é para separar os email que sãi cadastrados com ";")
	int NumEmails = smtp_destino.Split(new char[] { ';' }).Length;
	string[] dadosDoCadastro = smtp_destino.Split(';');
	for (int i = 0; i < NumEmails; i++)
	{
		message.To.Add(new MailAddress(dadosDoCadastro[i], ""));
	}    

    if (smtp_copia == null)
    {
    }
    else
    {
        int NumEmailsCop = smtp_copia.Split(new char[] { ';' }).Length;
        string[] dadosDoCadastroCop = smtp_copia.Split(';');
        
        for (int i = 0; i < NumEmailsCop; i++)
        {
            message.CC.Add(new MailAddress(dadosDoCadastroCop[i], ""));
        } 	
    }

    client.UseDefaultCredentials = false;
    client.Credentials  = new NetworkCredential(smtp_username, smtp_password);
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.Host = smtp_host;
    client.Port = smtp_port;
    client.EnableSsl = true;

    client.Send(message);
}

Olá @Framos

Como isso começou a ocorrer depois da migração de servidor, é bem provável que seja um problema de Infraestrutura.

Você pode verificar estes pontos:

  • O usuário do Windows/Domínio que executa o Pool de Aplicativos do IIS tem permissão de administrador do computador?
  • O antivírus está bloqueando o envio do e-mail?
  • O firewall está bloqueando o envio do e-mail?

Você também pode modificar o seu código para que sejam exibidas mais informações sobre o erro. Para isso, envolva o seu código inteiro neste bloco Try / Catch:

try
{
    // Coloque o seu código aqui
    //
    //
    //
}
catch (Exception ex)
{
    // Esse código vai adicionar os erros internos na mensagem de erro
    var errorMessage = new StringBuilder();
    var currentEx = ex;
    while(currentEx != null)
    {
        errorMessage.AppendLine(currentEx.Message);
        currentEx = currentEx.InnerException;
    }
    throw new InvalidOperationException(errorMessage.ToString());
}

Obrigado @daniel.giacomelli vou verificar com time de infra os pontos que você citou. :+1:t5:

Alterei a minha resposta adicionando informações sobre o novo tipo de objeto Bot de Mensagens.

1 curtida