最佳实践 - 发送 javamail mime 多部分电子邮件 - 和 gmail

2024-01-04

我有一个 Tomcat 应用程序需要发送确认电子邮件等。我已经使用 Javamail (mail.jar) 对电子邮件程序进行了编码以发送多部分文本/html 电子邮件。我的代码基于 Java EE 示例。我在本地服务器上使用 SMTP MTA。

效果很好。在 Outlook 中,我看到 HTML 版本。如果我将其拖到 Outlook 垃圾邮件文件夹中,我会看到文本版本。所以我将其解释为说它有效。

但是,如果我在 Gmail 中查看电子邮件,我只能看到文本版本。我知道 HTML 就在那里(Outlook 就是从那里获取它的)。但 Gmail 没有显示它...我有很多来自其他系统的电子邮件在 Gmail 中显示为 HTML。

谁能指出我所缺少的规范?我需要创建特殊的标头吗?

Thanks

代码如下所示:

Message message = new MimeMessage(session);
Multipart multiPart = new MimeMultipart("alternative");

try {

    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText(text, "utf-8");

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(html, "text/html; charset=utf-8");

    multiPart.addBodyPart(htmlPart);
    multiPart.addBodyPart(textPart);
    message.setContent(multiPart);

    if(from != null){
        message.setFrom(new InternetAddress(from));
    }else
        message.setFrom();

    if(replyto != null)
        message.setReplyTo(new InternetAddress[]{new InternetAddress(replyto)});
    else
        message.setReplyTo(new InternetAddress[]{new InternetAddress(from)});

    InternetAddress[] toAddresses = { new InternetAddress(to) };
    message.setRecipients(Message.RecipientType.TO, toAddresses);
    message.setSubject(subject);
    message.setSentDate(new Date());

    Transport.send(message);

} catch (AddressException e) {
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());

} catch (MessagingException e) {
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());

} finally {     
    System.out.println("Email sent!");
}

解决了!根据多部分 MIME 规范,各部分的顺序似乎很重要。应按照从低保真度到高保真度的顺序添加它们。所以看起来 GMail 遵循规范并使用最后一部分。就我而言,我有 HTML、文本。我刚刚将顺序交换为文本,HTML 和 Gmail 正确呈现了它......

i.e.

MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(text, "utf-8");

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html; charset=utf-8");

multiPart.addBodyPart(textPart); // <-- first
multiPart.addBodyPart(htmlPart); // <-- second
message.setContent(multiPart);

谢谢您的帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最佳实践 - 发送 javamail mime 多部分电子邮件 - 和 gmail 的相关文章

随机推荐

  • ElasticSearch:在groovy脚本中访问文档嵌套值

    我有一个存储在 ElasticSearch 中的文档 如下所示 来源 firstname John lastname Smith medals bucket 100 count 1 bucket 150 count 2 我可以使用访问文档内
  • 使用输入框替换文本区域中的部分字符串(属性)

    主要目标 创建一个可以实时预览 HTML CSS 代码的网站 进一步来说 用户可以在某些特定部分编辑 HTML CSS 代码 因此 实时预览中的代码不会源自文本区域 而是源自 div Image of what I am trying to
  • Android 上使用微信 API 发朋友圈

    我用微信API创建了一个应用程序 我尝试在我的用户墙上发帖 我在iOS上可以成功发布微信朋友圈 提示尚未审核 然而在 Android 上 什么也没发生 这是我的代码 private IWXAPI api api WXAPIFactory c
  • htaccess 403 尝试使用 ErrorDocument 时遇到禁止错误

    我想在我的项目中有一个自定义 403 页面 所以我在 htaccess 文件中添加了这些代码 Order deny allow Deny from all Allow from 192 168 1 0 24 ErrorDocument 40
  • 如何在限制x轴后自动设置y轴限制

    假设我有一定数量的数据集想要一起绘制 然后我想放大某个部分 例如 使用ax set xlim or plt xlim or plt axis 当我这样做时 它仍然保留缩放之前的计算范围 我怎样才能让它重新缩放到当前显示的内容 例如 使用 i
  • 如何构建柔性结构?

    我想用像这样的 CSS构建一个灵活的结构 顶部和底部divs具有固定高度 而中心框具有响应高度 它们都应该覆盖整个容器 div 谁能告诉我该怎么做 body position relative padding 0px margin 0px
  • 如何在 GWT 中获取一年中的周数

    有没有一种简单的方法可以从a获取一年中的一周信息Date对象或从毫秒时间开始GWT在客户端 像这样的事情 Date date new Date Date yearStart new Date date getYear 0 0 int wee
  • 如何保存 nltk FreqDist 图?

    我尝试了不同的方法来保存我的情节 但我尝试过的每件事都出现了空白图像 而且我目前还没有没有想法 有其他可以解决此问题的建议吗 代码示例如下 word frequency nltk FreqDist merged lemmatizedToke
  • 如何使用 SuiteScript 采购订单加载项目?

    朋友们正在使用 NetSuite 和 SuiteScript 我可以保存运行脚本的采购订单并对创建的采购订单进行收费 但是当我将返回数据项值作为空值时 我需要获取该项目的 ID 结果给我的 NetSuite 日志是 采购订单 ID 3706
  • VBScript - 按文件名中的字符串查找文件夹中的文件,将找到的文件移动到不同的文件夹

    我仍在学习 VBS 不确定我是否以正确或最有效的方式进行此操作 测试场景如下 除了常规桌面项目之外 我还添加了三个名为 Tool YouTube welcome to facebook BBC news 当我的代码 底部 运行时 它会按预期
  • 将文本文件中的数据提取到 Excel 中

    我是 VBA 新手 所以完成我的任务是相当困难的 几天来一直在阅读和尝试来自不同线程的代码 但没有成功 所以我希望有人可以帮助我 我有多个文本文件 需要从中提取数据 但我只需要将某些数据 例如日期时间 放在第一列中 将卡号放在第二列中 从该
  • UITableViewCell 中的 AlamofireImage af_setImageWithURL 没有占位符图像

    我使用 AlamofireImage 在 UITableViewCell 中的 UIImageView 上设置图像 如下所示 cell imageView af setImageWithURL url 下载后图像不显示 当从内存缓存加载图像
  • 通过身份验证访问 Samba 共享,无驱动器映射 - C# [重复]

    这个问题在这里已经有答案了 我正在尝试启动与需要身份验证的 samba 共享的连接 我不想映射驱动器 共享的凭据始终相同 一旦通过身份验证 我就可以使用常规路径来使用它 我正在使用 C net 有任何想法吗 我用谷歌搜索了一些东西并阅读了模
  • 在C中,从main调用函数[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 在 C 中
  • 如何限制应用程序仅适用于 Android 手机

    您好 我的目标用户是Android仅限电话 我想限制应用程序的安装Android仅限手机 不适用于平板手机和平板电脑 我需要在 AndroidManifest xml 中应用哪些配置 以便 Google Play 应用程序不会在表格和平板手
  • 使用 pygame.midi 演奏音符

    我正在尝试使用 pygame midi 模块播放声音 这是我的代码 使用 usr bin env python import pygame midi import time pygame midi init print pygame mid
  • 使用 selenium web 驱动程序在多个浏览器上运行测试

    我试图通过 for 循环在多个浏览器上运行相同的测试 但它始终只在 Firefox 上运行 bros FIREFOX CHROME INTERNET EXPLORER for bro in bros print Running bro n
  • 如何将S3存储桶中的图像文件直接读取到内存中?

    我有以下代码 import matplotlib pyplot as plt import matplotlib image as mpimg import numpy as np import boto3 s3 boto3 resourc
  • 有效绘制字节数组流以在 Android 中显示的选项

    简单来说 我需要做的就是在Android中显示视频帧的实时流 每帧都是YUV420格式 我有一个回调函数 我在其中接收单个帧作为字节数组 看起来像这样的东西 public void onFrameReceived byte frame in
  • 最佳实践 - 发送 javamail mime 多部分电子邮件 - 和 gmail

    我有一个 Tomcat 应用程序需要发送确认电子邮件等 我已经使用 Javamail mail jar 对电子邮件程序进行了编码以发送多部分文本 html 电子邮件 我的代码基于 Java EE 示例 我在本地服务器上使用 SMTP MTA