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:
Criar Record - Usado para acessar o banco de dados e carregar as configurações de SMTP.
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:
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.
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.
Fiz uma alteração simples de troca de nome das variáveis e consegui mitigar.
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.
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?
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.
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());
}