对于从 java 程序发送的电子邮件,html 内容中的 png 图像未显示在 gmail 客户端上

Posted

技术标签:

【中文标题】对于从 java 程序发送的电子邮件,html 内容中的 png 图像未显示在 gmail 客户端上【英文标题】:png images in html content are not showing up on gmail client for the email sent from java program 【发布时间】:2021-11-17 21:31:03 【问题描述】:

我正在尝试使用 sendgrid 将 html 内容从 java 程序发送到 gmail/outlook。

我在 html 中使用 base64 代码代替图像,并且 Outlook 上的电子邮件按预期正确显示,但在 gmail 上,由于 base 64 图像代码而被剪裁。

在我尝试了下面 html 中给出的 png 图像路径之后。现在在 gmail 上,内容正在显示,但图像是空白的。我该如何解决这个问题。

下面是html和代码。

<table  border="0" cellspacing="0" cellpadding="0" class="em_full_wrap" bgcolor="#ffffff" style="table-layout:fixed;">
  <tr>
    <td align="center" valign="top"><table align="center"  border="0" cellspacing="0" cellpadding="0" class="em_main_table" style="width:600px; table-layout:fixed;">
        <tr>
          <td align="center" valign="top" ><a href="https://www.testexample.com/" target="_blank" style="text-decoration: none;"><img src="emails/header_img.png"   label="testexample_header" border="0" style="display: block; max-width: 600px; font-family: Arial, sans-serif; font-size: 14px; line-height: 16px; color: #000000;" class="em_full_img" /></a></td>
        </tr>
      </table></td>

我正在使用以下代码发送电子邮件。

        
        EmailParams emailParams = new EmailParams();
        Content content = new Content();
        content.setType("text/html");   
        content.setValue("<htmlcontent as a string>");
        List<Content> contents = new ArrayList<Content>();
        contents.add(content);
        EmailObject from = new EmailObject();
        from.setEmail("no-reply@testexample.com");
        EmailObject to = new EmailObject();
        to.setEmail("test@gmail.com");
        List<EmailObject> tos = new ArrayList<EmailObject>();
        tos.add(to);

        Personalization personalization = new Personalization();
        personalization.setSubject("subject");
        personalization.setTo(tos);
        List<Personalization> personalizations = new ArrayList<Personalization>();
        personalizations.add(personalization);
         
        emailParams.setContent(contents);
        emailParams.setFrom(from);
        emailParams.setPersonalizations(personalizations);

        final String requestJson = objectMapper.writeValueAsString(emailParams);
        final HttpEntity<String> requestHttpEntity = new HttpEntity<String>(requestJson,
                getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
        final String endPointUri = new StringBuffer(<SENDGRID_URL>).toString();
        final ResponseEntity<String> messageResponse = restTemplate.exchange(endPointUri, HttpMethod.POST,
                requestHttpEntity, String.class);
    
        return "success";
      
private HttpHeaders getHttpHeaders(MediaType contentType, MediaType accept) 
        final HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setAccept(Collections.singletonList(accept));
        httpHeaders.setContentType(contentType);
        httpHeaders.setBearerAuth("<bearer token value>");
        return httpHeaders;

    ```

【问题讨论】:

您可以使用base64 encoded 字符串作为图像源 我已经用过了。但 gmail 不支持 base64 字符串,它会剪辑整个电子邮件,在整个电子邮件正文中仅显示 base64 字符串 您可以尝试将其作为附件发送或修改此处的代码以满足您的需求:***.com/questions/38599079/…。 【参考方案1】:

这里是 Twilio SendGrid 开发人员宣传员。

您应该将图像作为附件发送,并使用 CID(内容 ID)在电子邮件内容中引用图像。

您可以使用如下代码创建附件:

    Attachments attachments = new Attachments();
    attachments.setContent("BwdW"); // Insert actual content here
    attachments.setType("image/png");
    attachments.setFilename("banner.png");
    attachments.setDisposition("inline"); // This means it can appear inline
    attachments.setContentId("banner"); // This sets the CID
    emailParams.addAttachments(attachments);

然后您可以使用 &lt;img&gt; 标记中的 CID 引用图像,如下所示:

<img src="cid:banner" />

有关详细信息,请参阅embedding images in emails 和 this kitchen sink email example in Java 上的这篇文章。

【讨论】:

以上是关于对于从 java 程序发送的电子邮件,html 内容中的 png 图像未显示在 gmail 客户端上的主要内容,如果未能解决你的问题,请参考以下文章

java发送html模板的高逼格邮件

Java入门 - 高级教程 - 06.邮件收发

Java的发送邮件

java发送html邮件,看完没有不懂的

Java使用javax.mail.jar发送邮件并同意发送附件

使用内嵌图像Flask-Mail发送电子邮件?