2014-02-11 4 views
3

Я пытаюсь отправить электронное письмо из javamail с встроенным изображением base64 (img alt = 'изображение PNG' src = 'data: image/png; base64, iVBORw0KGgoAAAANSUhEUgA ... AElFTkSuQmCC «")Как вставить изображение base64 в электронную почту с помощью javamail

Он работает с маленьким изображением, но когда изображение крупнее изображение не показывает в лотосе записке.

Вот часть кода

Transport transport = mailSession.getTransport(); 
MimeMessage message = new MimeMessage(mailSession); 
message.setSubject(subject); 
message.setFrom(new InternetAddress(me)); 
message.setContent(bodyWithEmbeddedBase64Image, "text/html"); 
transport.connect(); 
transport.sendMessage(message, message.getAllRecipients()); 
transport.close();` 

Я хотел бы использовать PreencodedMimeBodyPart для тестирования но я не знаю, как его использовать Может кто-нибудь помогите мне пожалуйста :)?

ответ

1

Поскольку изображение не находится в отдельной части тела, PreencodedMimeBodyPart вам не поможет.

Как вы кодируете изображение base64?

Альтернативой является использование сообщения multipart/related, с изображением в отдельной части, на которое ссылается URL-адрес cid:.

6

Хорошо, ребята, я нашел ответы, я не знаю, правильно ли я поступаю, но работает.

Вот мой код:

private static final Pattern imgRegExp = Pattern.compile("<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>"); 
public send(email) throws Exception{ 

    Map<String, String> inlineImage = new HashMap<String, String>(); 
    String body = email.getBody(); 
    final Matcher matcher = imgRegExp.matcher(body); 
    int i = 0; 
    while (matcher.find()) { 
     String src = matcher.group(); 
     if (body.indexOf(src) != -1) { 
     String srcToken = "src=\""; 
     int x = src.indexOf(srcToken); 
     int y = src.indexOf("\"", x + srcToken.length()); 
     String srcText = src.substring(x + srcToken.length(), y); 
     String cid = "image" + i; 
     String newSrc = src.replace(srcText, "cid:" + cid); 
     inlineImage.put(cid, srcText.split(",")[1]); 
     body = body.replace(src, newSrc); 
     i++; 
     } 
    } 
    Transport transport = mailSession.getTransport(); 
    MimeMessage message = new MimeMessage(mailSession); 
    message.setSubject(email.getObjet()); 
    message.setSender(new InternetAddress(email.getSender())); 
    message.setFrom(new InternetAddress(email.getFrom())); 
    BodyPart bp = new MimeBodyPart(); 
    bp.setContent(body, "text/html"); 
    MimeMultipart mmp = new MimeMultipart(); 
    mmp.addBodyPart(bp); 
    Iterator<Entry<String, String>> it = inlineImage.entrySet().iterator(); 
    while (it.hasNext()) { 
     Entry<String, String> pairs = it.next(); 
     PreencodedMimeBodyPart pmp = new PreencodedMimeBodyPart("base64"); 
     pmp.setHeader("Content-ID", "<" + pairs.getKey() + ">"); 
     pmp.setDisposition(MimeBodyPart.INLINE); 
     pmp.setText(pairs.getValue()); 
     mmp.addBodyPart(pmp); 
    } 
    message.setContent(mmp); 
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(email.getTo())); 
    transport.connect(); 
    transport.sendMessage(message, message.getAllRecipients()); 
    transport.close(); 
} 

Благодаря помочь мне улучшить, если это необходимо улучшить :)

+1

Использование 'pmp.setContent (pairs.getValue(), 'изображение/PNG') ; 'лучше, чем' pmp.setText (pairs.getValue()); '. –

Смежные вопросы