Envio de e-mail com anexos

Boa tarde pessoal!

Depois de uma conversa com o super @Fluigor, percebi que muitos colegas aqui possuem as mesmas dores que eu: Envio de e-mails com qualquer tipo de anexo no Fluig, com CO e CCO. Como já trabalhei alguns anos com Java, resolvi escrever um método fácil e simples de fazer isso.

Ilustro abaixo um caso que que preciso enviar os anexos de uma solicitação/workflow com um corpo de e-mail que possua formatação HTML em um evento de processo:

/**
 * Método para enviar os anexos de uma solicitação
 * anexadas em um e-mail
 * 
 * @param {string} assunto Assunto do e-mail
 * @param {string} conteudo Corpo do e-mail escrito em HTML
 * @param {string} to Destinatário principal
 * @param {array} cc Array com as cópias
 * @param {array} cco Array com as cópias ocultas
 * 
 * @returns {void}
 */
function sendMail(assunto, conteudo, to, cc, cco) {
    var docService = fluigAPI.getDocumentService();
    var username = "login@email.com";
    var nameuser = 'Nome Completo';
    var password = "senha";
    var host = "smtp.office365.com";
    var port = "587";

    var tmpHtml = org.jsoup.Jsoup.parse(conteudo);

    var props = new java.util.Properties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.port", port);

    var attachments = hAPI.listAttachments();
    var session = javax.mail.Session.getDefaultInstance(props);
    var message = new javax.mail.internet.MimeMessage(session);
    var messageBodyPart = new javax.mail.internet.MimeBodyPart();
    var multipart = new javax.mail.internet.MimeMultipart("mixed");
    var transport = session.getTransport();

    message.setFrom(new javax.mail.internet.InternetAddress(username, nameuser));
    message.setSubject(assunto);

    message.addRecipient(
        javax.mail.Message.RecipientType.TO,
        new javax.mail.internet.InternetAddress(to)
    );

    if (cc && cc.length) {
        for (var i in cc) {
            message.addRecipient(
                javax.mail.Message.RecipientType.CC,
                new javax.mail.internet.InternetAddress(cc[i])
            );
        }
    }

    if (cco && cco.length) {
        for (var j in cco) {
            message.addRecipient(
                javax.mail.Message.RecipientType.BCC,
                new javax.mail.internet.InternetAddress(cco[j])
            );
        }
    }

    for (var i = 0; i < attachments.size(); i++) {
        var anexo = attachments.get(i);
        var publicUrl = docService.getDownloadURL(anexo.getDocumentId());

        var attachment = new javax.mail.internet.MimeBodyPart();
        attachment.setDataHandler(new javax.activation.DataHandler(new java.net.URL(publicUrl)));
        attachment.setDisposition(javax.mail.internet.MimeBodyPart.ATTACHMENT);
        attachment.setFileName(anexo.getDocumentDescription());

        multipart.addBodyPart(attachment);
    }

    messageBodyPart.setContent(tmpHtml.toString(), "text/html; charset=utf-8");
    multipart.addBodyPart(messageBodyPart);

    message.setContent(multipart);

    transport.connect(username, password);
    transport.sendMessage(message, message.getAllRecipients());
}


Exemplo de chamada:

var cc = ["email_um@email.com", "email_dois@email.com"]
var cco = ["email_tres@email.com", "email_quatro@email.com"]
var corpoHtml = "<h1>Hello e-mail com anexos!</h1>"

try {
    sendMail("Assunto aqui", corpoHtml, "teste@email.com", cc, cco);
} catch (error) {
    log.info("Falha no envio!!");
    log.error(e);
}

Neste caso, o cliente utiliza o Office365, agora é só adaptar de acordo com o cliente de e-mail, inclusive é possível escrever este mesmo código em um dataset, para que você possa utilizar em mais lugares, mas ainda não tive tempo de fazer isso.

Espero que minha primeira contribuição seja de grande utilidade para nossa comunidade!

PS: Se alguém fizer um dataset bonitinho pra isso, por favor, compartilha aqui!!

6 curtidas

Super útil! Obrigado por compartilhar!

Vou tentar implementar.

Aqui só tive 1 situação que precisava mandar 1 anexo no e-mail e acabamos enviando o link de download mesmo.

1 curtida

Parabéns cara, eu também percebi essa dor entre os colegas.

Eu tenho vários processos que utiliza envio de anexos, onde não é possível resolver com o link público, então tive que desenvolver uma aplicação em node js.

Esses dias eu estava olhando essa classe javax.mail e imaginei que fosse realmente possível, mas como meu conhecimento em java é limitado, deixei pra lá rs.

Assim que tiver um tempo vou testar essa solução.

1 curtida

Brabissimo @vinny.silveira

Parabens!

1 curtida

Xá comigo esse dataset!

1 curtida