Como enviar e-mail pelo AX sem configurar o Outlook
Autor: Alexssander Valdoski | Publicado: 2011-02-17T15:00:00-02:00


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 &gt; Configuração &gt; Parâmetros de email. 

&nbsp; 







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 &gt; Ferramentas &gt; Opções e vamos configurar a conta de email do usuário no campo Email: 

&nbsp; 



Feito isso vamos alterar o código reportSendMail() da classe Info:

void reportSendMail(PrintJobSettings p1)
{
&nbsp;&nbsp;&nbsp; System.Net.Mail.MailMessage myMailMessage;
&nbsp;&nbsp;&nbsp; System.Net.Mail.Attachment attachment;
&nbsp;&nbsp;&nbsp; System.Net.Mail.AttachmentCollection attachementCollection;
&nbsp;&nbsp;&nbsp; System.Net.Mail.SmtpClient myMail;
&nbsp;&nbsp;&nbsp; System.Net.NetworkCredential myNC;

&nbsp;&nbsp;&nbsp; //Atribui o nome de usuário e senha dos parâmetros para as variáveis&nbsp;
&nbsp;&nbsp;&nbsp; str myLogin = SysEmailParameters::find(true).SMTPUserName;
&nbsp;&nbsp;&nbsp; str myPassword = SysEmailParameters::password();

&nbsp;&nbsp;&nbsp; str userMailAddress;&nbsp;
&nbsp;&nbsp;&nbsp; str receiverMailAddress;
&nbsp;&nbsp;&nbsp; str mailBody;
&nbsp;&nbsp;&nbsp; str smtpServer;
&nbsp;&nbsp;&nbsp; str mail;
&nbsp;&nbsp;&nbsp; str fileName = 'axaptareport';

&nbsp;&nbsp;&nbsp; FileNameOpen&nbsp;&nbsp;&nbsp; fileNameForEmail;&nbsp;
&nbsp;&nbsp;&nbsp; FileIOPermission perm;
&nbsp;&nbsp;&nbsp; ;

&nbsp;&nbsp;&nbsp; //Verifica o tipo do Anexo&nbsp;
&nbsp;&nbsp;&nbsp; if (p1.format() == PrintFormat::ASCII)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'TXT';&nbsp;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else if (p1.format() == PrintFormat::RTF)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'RTF';
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else if (p1.format() == PrintFormat::HTML)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'HTM';
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else if (p1.format() == PrintFormat::PDF || p1.format() == PrintFormat::PDF_EMBED_FONTS)&nbsp;
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'PDF';
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; mail = subStr(fileNameforEmail,(strlen(fileNameforEmail)-8),9);&nbsp;
&nbsp;&nbsp;&nbsp; fileNameforEmail = winApi::getTempPath() + mail;

&nbsp;&nbsp;&nbsp; perm = new FileIOPermission(fileNameforEmail,'w');

&nbsp;&nbsp;&nbsp; //Verifica se o usuário tem permissão&nbsp;
&nbsp;&nbsp;&nbsp; if (!perm)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw error("Não é possível mover o anexo para a pasta Temp.");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perm.assert();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw error("Não é possível acessar a pasta Temp.");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userMailAddress = SysUserInfo::find().Email;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; receiverMailAddress = p1.mailTo() + "," + p1.mailCc();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailBody = "E-mail enviado a partir da " + CompanyInfo::name() + ", pelo Microsoft Dynamics AX";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; smtpServer = SysEmaiLParameters::find(false).SMTPRelayServerName;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myMailMessage = new System.Net.Mail.MailMessage(userMailAddress,receiverMailAddress);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myMailmessage.set_Subject(p1.mailSubject());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myMailmessage.set_Body(mailBody);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; winapi::moveFile(p1.fileName(), fileNameforEmail);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachementCollection = myMailMessage.get_Attachments();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachment = new System.Net.Mail.Attachment(fileNameforEmail);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachementCollection.Add(attachment);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myMail = new System.Net.Mail.SmtpClient(smtpServer);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myNC= new System.Net.NetworkCredential(mylogin,mypassword);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myMail.set_Credentials(myNC);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myMail.Send(myMailmessage);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Box::info("E-mail enviado com sucesso!");
&nbsp;&nbsp;&nbsp; }
}


Para testar, vamos realizar o envio do e-mail de um relatório de clientes no módulo Contas a receber &gt; Relatórios &gt; Dados Básicos &gt; 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