如何将邮件中的base64图像附加到JavaMail和MimeMessageHelper?

时间:2018-10-04 11:14:14

标签: java spring email

我正在尝试发送带有图片附件的Mime电子邮件,但确实知道该怎么做。我尝试了在线解决方案,但是没有用。我将获得编码的图像,并且需要解码并附加到邮件中。这是我的代码

public class SendEmail{

public static void main( String[] args ) throws javax.mail.MessagingException, IOException
{  

    String value= "Wyk+HjAxHTAyNzg3MDUdODQwHTAxOR0wMDAwMDAwMDAwMDAwMDAd" +
            "RkRFQh0wMDAwMDAwHTA0MB0dMS8xHTUwLjVMQh1OHVcgMzR0aCBTdHJlZXQdQ" +
            "XVzdGluHVRYHSAeMDYdMTBaR0QwMDQdMTFaUmVjaXBpZW50IENvbXBhbnkgTmFt" +
            "ZR0xMlo5MDEyNjM3OTA2HTE0WioqVEVTVCBMQUJFTCAtIERPIE5PVCBTSElQKio" +
            "dMjNaTh0yMlocWR0yMFogHDAdMjZaNjEzMxwdHgQ=";     

      JavaMailSender mailSender = getJavaMailSender();

    MimeMessage mimeMessage = mailSender.createMimeMessage();
    MimeMessageHelper helper;
    Map<String,Object> map = new HashMap<>();

    try{
        helper = new MimeMessageHelper(mimeMessage, true, "utf-8");
        String sendTo = "abc@gmail.com";
        String htmlMsg = "<h1> hello </h1>";

        mimeMessage.setContent(htmlMsg, "text/html");

        // add attachment encode in base64
        byte[] decodedImg  Base64.decodeBase64(value);
        // dont know how to attache the decode img 


        helper.setTo(sendTo);
        helper.setSubject("Subject");
        mailSender.send(mimeMessage);
    } catch (MessagingException e) {
        e.printStackTrace();
    }



}

4 个答案:

答案 0 :(得分:2)

尝试:

helper.addAttachment("MyImageName.jpg", new ByteArrayResource(value.getBytes()));

但是请阅读: 从代码来看,您似乎已经对图像进行了编码。 “值”似乎是Base64格式。 您不应该为自己做这些。

// you can attach a file directly to the helper
FileSystemResource file = new FileSystemResource(new File("image_file.jpg"));
helper.addAttachment("MyImageName.jpg", file);

如果附件不是磁盘上的文件,则可以使用此文件:

helper.addAttachment("MyImageName.jpg", new ByteArrayResource(IOUtils.toByteArray(attachment)));

如果这是一个输入流或这个:

helper.addAttachment("MyImageName.jpg", new ByteArrayResource(value.getBytes()));

答案 1 :(得分:1)

用波纹管代码修改代码后,我的问题解决了。

value= value.replaceFirst("^data:image/[^;]*;base64,?", "");
byte[] bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(value);
helper.addAttachment("MyImageName.jpg", new ByteArrayResource(bytes));

答案 2 :(得分:0)

添加为附件已得到答复。或者,嵌入图像的方式如下:

htmlMsg += "<img width=\"400\" height=\"400\" "
    + "alt=\"View of the object.\" src=\"data:image/jpeg;base64,"
    + value + "\">";

值是Base64数据,必须调整哑剧类型image/jpeg的宽度和高度。

某些邮件收件人可能会禁止使用纯文本格式的富文本邮件,但是只要<img>不指向www(确认您已打开电子邮件),就可以使用富文本版本。

答案 3 :(得分:0)

下面是使用java邮件api发送base64编码的字符串(图像)作为附件的代码。

@Autowired
private JavaMailSender emailSender;

public void sendMessageWithAttachment(String from,String replyTo, String to, String cc, String subject,  String emailContent, String base64EncodedString) {

MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);

helper.setFrom(from);
helper.setReplyTo(replyTo);
helper.setTo(to);
helper.setCc(cc);
helper.setSubject(subject);
helper.setText(emailContent, true);

// Use MimeDecoder for decoding in order to avoid illegal argument exception
byte[] imgBytes = Base64.getMimeDecoder().decode(base64EncodedString);
ByteArrayDataSource dSource = new ByteArrayDataSource(imgBytes, "image/*");
helper.addAttachment("AttachedFile.jpg", dSource);
emailSender.send(message);

}