Páginas

Como enviar e-mail pelo AX sem configurar o Outlook

Essa semana precisei fazer o AX enviar e-mails direto, sem precisar configurar o Outlook.

Para isso verifiquei em alguns blogs de referência e no final criei um código simples e com algumas configurações do sistema fiz o envio diretamente pelo AX.

Antes de alterar qualquer código, vamos parametrizar a conta que o AX utiliza para fazer o envio, para isso vamos acessar o módulo Administração > Configuração > Parâmetros de email.
 

Nessa tela vamos configurar o servidor de saída, computador local, porta SMTP, tamanho do anexo e outras configurações como nome do usuário, senha e se iremos utilizar autenticação NTLM (que é um protocolo de autenticação para transações entre dois computadores em que um ou ambos estejam executando o Windows NT 4.0 ou anterior).

Ao enviar os e-mail eu não quero que apareça a conta que configuramos como remetente para executar o envio, para isso o usuário que está logado no sistema precisa ter a sua conta configurada nas opções de usuário.

Para configurar vamos no Painel de Navegação do Microsoft Dynamics AX > Ferramentas > Opções e vamos configurar a conta de email do usuário no campo Email:
 

Feito isso vamos alterar o código reportSendMail() da classe Info:
  1. void reportSendMail(PrintJobSettings p1)
  2. {
  3.     System.Net.Mail.MailMessage myMailMessage;
  4.     System.Net.Mail.Attachment attachment;
  5.     System.Net.Mail.AttachmentCollection attachementCollection;
  6.     System.Net.Mail.SmtpClient myMail;
  7.     System.Net.NetworkCredential myNC;
  8.     //Atribui o nome de usuário e senha dos parâmetros para as variáveis 
  9.     str myLogin = SysEmailParameters::find(true).SMTPUserName;
  10.     str myPassword = SysEmailParameters::password();
  11.     str userMailAddress; 
  12.     str receiverMailAddress;
  13.     str mailBody;
  14.     str smtpServer;
  15.     str mail;
  16.     str fileName = 'axaptareport';
  17.     FileNameOpen    fileNameForEmail; 
  18.     FileIOPermission perm;
  19.     ;
  20.     //Verifica o tipo do Anexo 
  21.     if (p1.format() == PrintFormat::ASCII)
  22.     {
  23.         fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'TXT'; 
  24.     }
  25.     else if (p1.format() == PrintFormat::RTF)
  26.     {
  27.         fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'RTF';
  28.     }
  29.     else if (p1.format() == PrintFormat::HTML)
  30.     {
  31.         fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'HTM';
  32.     }
  33.     else if (p1.format() == PrintFormat::PDF || p1.format() == PrintFormat::PDF_EMBED_FONTS) 
  34.     {
  35.         fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'PDF';
  36.     }
  37.     mail = subStr(fileNameforEmail,(strlen(fileNameforEmail)-8),9); 
  38.     fileNameforEmail = winApi::getTempPath() + mail;
  39.     perm = new FileIOPermission(fileNameforEmail,'w');
  40.     //Verifica se o usuário tem permissão 
  41.     if (!perm)
  42.     {
  43.         throw error("Não é possível mover o anexo para a pasta Temp.");
  44.         return;
  45.     }
  46.     else
  47.     {
  48.         try
  49.         {
  50.             perm.assert();
  51.         }
  52.         catch
  53.         {
  54.             throw error("Não é possível acessar a pasta Temp.");
  55.             return;
  56.         }
  57.         userMailAddress = SysUserInfo::find().Email;
  58.         receiverMailAddress = p1.mailTo() + "," + p1.mailCc();
  59.         mailBody = "E-mail enviado a partir da " + CompanyInfo::name() + ", pelo Microsoft Dynamics AX";
  60.         smtpServer = SysEmaiLParameters::find(false).SMTPRelayServerName;
  61.         myMailMessage = new System.Net.Mail.MailMessage(userMailAddress,receiverMailAddress);
  62.         myMailmessage.set_Subject(p1.mailSubject());
  63.         myMailmessage.set_Body(mailBody);
  64.         winapi::moveFile(p1.fileName(), fileNameforEmail);
  65.         attachementCollection = myMailMessage.get_Attachments();
  66.         attachment = new System.Net.Mail.Attachment(fileNameforEmail);
  67.         attachementCollection.Add(attachment);
  68.         myMail = new System.Net.Mail.SmtpClient(smtpServer);
  69.         myNC= new System.Net.NetworkCredential(mylogin,mypassword);
  70.         myMail.set_Credentials(myNC);
  71.         myMail.Send(myMailmessage);
  72.         Box::info("E-mail enviado com sucesso!");
  73.     }
  74. }
Para testar, vamos realizar o envio do e-mail de um relatório de clientes no módulo Contas a receber > Relatórios > Dados Básicos > Cliente


Filtrei apenas alguns clientes e agora vamos no botão Opções, selecionar a opção Destinatário do email, Preencher o assunto, destinatário, formato do anexo e depois Ok:


Você terá uma mensagem informando que o e-mail foi enviado com sucesso e receberá o e-mail com o relatório.
Note que o e-mail do remetente é o e-mail que configuramos nas opções do usuário.
E por fim temos o relatório do cliente em anexo.



Fiz um código meio que as pressas para isso e tenho certeza que dá para melhorar, cheguei a ver até que você pode configurar um template do corpo do email, por isso aceito sugestões e dúvidas.

Quando tiver um tempo vou dar uma olhada com calma nessa parte dos templates e crio um novo post futuramente.

[]'s
Alexssander

Um comentário:

  1. Oi Sou Renan,

    Gostaria de saber como você faria para enviar email onde sua rotina seria executada no servidro, entretanto este email deve conter acesso.

    O WinApi não funciona, tentei usar WinApiServer mas da erro de CLR de permissão.

    ResponderExcluir