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:
- void reportSendMail(PrintJobSettings p1)
- {
- System.Net.Mail.MailMessage myMailMessage;
- System.Net.Mail.Attachment attachment;
- System.Net.Mail.AttachmentCollection attachementCollection;
- System.Net.Mail.SmtpClient myMail;
- System.Net.NetworkCredential myNC;
- //Atribui o nome de usuário e senha dos parâmetros para as variáveis
- str myLogin = SysEmailParameters::find(true).SMTPUserName;
- str myPassword = SysEmailParameters::password();
- str userMailAddress;
- str receiverMailAddress;
- str mailBody;
- str smtpServer;
- str mail;
- str fileName = 'axaptareport';
- FileNameOpen fileNameForEmail;
- FileIOPermission perm;
- ;
- //Verifica o tipo do Anexo
- if (p1.format() == PrintFormat::ASCII)
- {
- fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'TXT';
- }
- else if (p1.format() == PrintFormat::RTF)
- {
- fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'RTF';
- }
- else if (p1.format() == PrintFormat::HTML)
- {
- fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'HTM';
- }
- else if (p1.format() == PrintFormat::PDF || p1.format() == PrintFormat::PDF_EMBED_FONTS)
- {
- fileNameForEmail = subStr(p1.fileName(),strLen(p1.fileName())-3,-999)+'PDF';
- }
- mail = subStr(fileNameforEmail,(strlen(fileNameforEmail)-8),9);
- fileNameforEmail = winApi::getTempPath() + mail;
- perm = new FileIOPermission(fileNameforEmail,'w');
- //Verifica se o usuário tem permissão
- if (!perm)
- {
- throw error("Não é possível mover o anexo para a pasta Temp.");
- return;
- }
- else
- {
- try
- {
- perm.assert();
- }
- catch
- {
- throw error("Não é possível acessar a pasta Temp.");
- return;
- }
- userMailAddress = SysUserInfo::find().Email;
- receiverMailAddress = p1.mailTo() + "," + p1.mailCc();
- mailBody = "E-mail enviado a partir da " + CompanyInfo::name() + ", pelo Microsoft Dynamics AX";
- smtpServer = SysEmaiLParameters::find(false).SMTPRelayServerName;
- myMailMessage = new System.Net.Mail.MailMessage(userMailAddress,receiverMailAddress);
- myMailmessage.set_Subject(p1.mailSubject());
- myMailmessage.set_Body(mailBody);
- winapi::moveFile(p1.fileName(), fileNameforEmail);
- attachementCollection = myMailMessage.get_Attachments();
- attachment = new System.Net.Mail.Attachment(fileNameforEmail);
- attachementCollection.Add(attachment);
- myMail = new System.Net.Mail.SmtpClient(smtpServer);
- myNC= new System.Net.NetworkCredential(mylogin,mypassword);
- myMail.set_Credentials(myNC);
- myMail.Send(myMailmessage);
- Box::info("E-mail enviado com sucesso!");
- }
- }
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