如何使用 javamail 将 base64 图像嵌入到电子邮件中

Posted

技术标签:

【中文标题】如何使用 javamail 将 base64 图像嵌入到电子邮件中【英文标题】:How to embed base64 image to an email using javamail 【发布时间】:2014-03-09 08:31:15 【问题描述】:

我正在尝试从 javamail 发送带有嵌入 base64 图像的电子邮件 (img alt='image PNG' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA...AElFTkSuQmCC'")

它适用于小图像,但是当图像较大时,图像不会显示在莲花笔记中。

这里是部分代码

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】:

好的,伙计们,我找到了答案,我不知道我是否做得对,但正在工作。

这是我的代码:

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();

如果需要改进,感谢帮助我改进:)

【讨论】:

使用pmp.setContent( pairs.getValue(), 'image/png' );优于pmp.setText( pairs.getValue() );【参考方案2】:

由于图像不在单独的身体部位,PreencodedMimeBodyPart 对您没有帮助。

你是如何对图像进行 base64 编码的?

另一种方法是使用多部分/相关消息,图像位于单独的部分,使用 cid: URL 引用。

【讨论】:

以上是关于如何使用 javamail 将 base64 图像嵌入到电子邮件中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cordova 应用程序将 base64 图像保存到设备中?

如何使用节点 js 将 base64 数据作为图像上传到 s3?

如何使用 Java 将 base 64 图像插入 BLOB 列? (甲骨文)

如何将 base64 编码的图像保存到磁盘?

如何仅使用 JavaScript 将 base64 编码的图像数据上传到 S3?

将 Base64 编码的图像写入文件