GMail不显示用JavaMail API发送的电子邮件的HTML-/内联部分
每当我遇到Java问题时,我总是在stackoverflow上找到答案,而不需要自己问问题,但这次连谷歌都帮不了我。我就是想不出确切的问题,试着吻我的问题 当我接收并打开用JavaMail API创建和发送的邮件时,Thunderbird中的一切都很好。HTML部分显示其内联图像,纯文本在底部,但Gmail不会显示HTML部分。相反,它只显示纯文本和附件(因此我的内联图像根本不可见)。Gmail说电子邮件没有编码,我不确定这是否会导致问题 邮件的结构如下:GMail不显示用JavaMail API发送的电子邮件的HTML-/内联部分,java,html,gmail,jakarta-mail,inline,Java,Html,Gmail,Jakarta Mail,Inline,每当我遇到Java问题时,我总是在stackoverflow上找到答案,而不需要自己问问题,但这次连谷歌都帮不了我。我就是想不出确切的问题,试着吻我的问题 当我接收并打开用JavaMail API创建和发送的邮件时,Thunderbird中的一切都很好。HTML部分显示其内联图像,纯文本在底部,但Gmail不会显示HTML部分。相反,它只显示纯文本和附件(因此我的内联图像根本不可见)。Gmail说电子邮件没有编码,我不确定这是否会导致问题 邮件的结构如下: - MimeMultipart
- MimeMultipart mixed
-- BodyPart (attachment)
-- BodyPart (as a container)
--- MimeMultipart alternative
---- BodyPart (plaintext)
---- BodyPart (as a second container)
----- MimeMultipart related
------ BodyPart (html)
------ BodyPart (inline)
我创建消息的部分:
MimeBodyPart BPhtml = new MimeBodyPart();
BPhtml.setContent("<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"></head><body>Take a look at this image:<br><br><IMG src=\"cid:fileNamePlusUniqueHash\"></body></html>", "text/html; charset=utf-8");
MimeBodyPart BPinline = new MimeBodyPart();
BPinline.setDataHandler(new DataHandler(new FileDataSource(pathToImage)));
BPinline.setFileName(fileName);
// Note: my CID is a combination of the image's fileName and a salt/hash - unique:
BPinline.setHeader("Content-ID", "<fileNamePlusUniqueHash>");
BPinline.setDisposition(MimeBodyPart.INLINE);
MimeMultipart MPrel = new MimeMultipart("related");
MPrel.addBodyPart(BPhtml);
MPrel.addBodyPart(BPinline);
MimeBodyPart BPcon1 = new MimeBodyPart();
BPcon1.setContent(MPrel);
MimeBodyPart BPplain = new MimeBodyPart();
BPplain.setText("Plain text", "text/plain; charset=utf-8");
MimeMultipart MPalt = new MimeMultipart("alternative");
MPalt.addBodyPart(BPcon1);
MPalt.addBodyPart(BPplain);
MimeBodyPart BPcon2 = new MimeBodyPart();
BPcon2.setContent(MPalt);
MimeBodyPart BPattach = new MimeBodyPart();
BPattach.attachFile(new File(pathToAttachment));
MimeMultipart MPmx = new MimeMultipart();
MPmx.addBodyPart(BPcon2);
MPmx.addBodyPart(BPattach);
MimeMessage message = new MimeMessage(Session.getInstance(properties, null));
message.setContent(MPmx);
// ... set recipients, sender, subject, e.g. ...
Transport.send(message);
MimeBodyPart BPhtml=新的MimeBodyPart();
setContent(“看看这个图像:
”,“text/html;charset=utf-8”);
MimeBodyPart BPinline=新的MimeBodyPart();
setDataHandler(新的DataHandler(新的FileDataSource(pathToImage));
BPinline.setFileName(文件名);
//注意:我的CID是图像文件名和salt/hash的组合-唯一:
BPinline.setHeader(“内容ID”,即“”);
setDisposition(MimeBodyPart.INLINE);
MimMultipart MPrel=新的MimMultipart(“相关”);
MPrel.addBodyPart(BPhtml);
MPrel.addBodyPart(BPinline);
MimeBodyPart BPcon1=新的MimeBodyPart();
BPcon1.设置内容(MPrel);
MimeBodyPart BPplain=新的MimeBodyPart();
setText(“纯文本”、“文本/纯文本;字符集=utf-8”);
MimMultipart MPalt=新的MimMultipart(“备选方案”);
MPalt.附加车身部件(BPcon1);
MPalt.附加车身部件(BPplain);
MimeBodyPart BPcon2=新的MimeBodyPart();
BPcon2.设置内容(MPalt);
MimeBodyPart BPattach=新的MimeBodyPart();
attachFile(新文件(pathToAttachment));
MimeMultipart MPmx=新的MimeMultipart();
MPmx.addBodyPart(BPcon2);
MPmx.addBodyPart(BPattach);
MimeMessage message=新的MimeMessage(Session.getInstance(properties,null));
message.setContent(MPmx);
// ... 设置收件人、发件人、主题,例如。。。
传输。发送(消息);
电子邮件来源:
[...] (delivered, received, subject, e.g., ask for more if important)
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_1248658274.1455785789602"
------=_Part_0_1248658274.1455785789602
Content-Type: multipart/alternative;
boundary="----=_Part_1_860340994.1455785789629"
------=_Part_1_860340994.1455785789629
Content-Type: multipart/related;
boundary="----=_Part_2_743690907.1455785789629"
------=_Part_2_743690907.1455785789629
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>Take a look at this image:<br><br></html><IMG src="cid:blabla.pngPlusUniqueHash"></body>
------=_Part_2_743690907.1455785789629
Content-Type: application/octet-stream; name=blabla.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=blabla.png
Content-ID: <blabla.pngPlusUniqueHash>
iVBORw0KGgoAAAANSUhEUgAAAPEAAAEdCAIAAABSWBYTAAAYpklEQVR4nO2dXawkR3mGR4 [...] (some hundred lines more)
------=_Part_2_743690907.1455785789629--
------=_Part_1_860340994.1455785789629
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
plain text
------=_Part_1_860340994.1455785789629--
------=_Part_0_1248658274.1455785789602
Content-Type: application/octet-stream; name=blabla.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=blabla.pdf
UEsDBBQACAgIAERuSEgAAAAAAAAAAAAAAAALAAAARW50aXR5U3RvcmXsfQl8G8W5+NqxfM [...] (some hundred lines more)
------=_Part_0_1248658274.1455785789602--
[…](交付、接收、主题,如重要时要求更多)
MIME版本:1.0
内容类型:多部分/混合;
boundary=“---=\u Part\u 0\u 1248658274.1455785789602”
------=_部分_0_1248658274.1455785789602
内容类型:多部分/备选;
boundary=“---=\u Part_1\u 860340994.1455785789629”
------=_第1部分_860340994.1455785789629
内容类型:多部分/相关;
boundary=“---=\u Part\u 2\u 743690907.1455785789629”
------=\u第2部分\u 743690907.1455785789629
内容类型:text/html;字符集=utf-8
内容传输编码:7bit
请看这张图片:
------=\u第2部分\u 743690907.1455785789629
内容类型:应用程序/八位字节流;name=blabla.png
内容传输编码:base64
内容配置:内联;filename=blabla.png
内容ID:
IVBORW0KGGOAAAANSUHEUGAAPEADCAIAABSWBYTAAYPKLEQVR4NO2DXAWKR3MGR4[…](还有几百行)
------=\u第2部分\u 743690907.1455785789629--
------=_第1部分_860340994.1455785789629
内容类型:文本/纯文本;字符集=美国ascii码
内容传输编码:7bit
纯文本
------=_第1部分_860340994.1455785789629--
------=_部分_0_1248658274.1455785789602
内容类型:应用程序/八位字节流;name=blabla.pdf
内容传输编码:base64
内容处置:附件;filename=blabla.pdf
UESDBBQacagiaerusegaaaaaaaaaaarw50axr5u3rvcmxsfql8g8w5+NqxfM[…](还有大约一百行)
------=_部分_0_1248658274.1455785789602--
我尝试了很多不同的方法来添加附件/内联(例如InputStreamReader),但没有任何改变。你能帮我找出错误吗?我推测这条消息的结构不正确
向你问好,芬利尔
编辑
我将邮件发送给了另一个提供商(GMX),在HTML部分的表示方面没有问题,所以我想这是Gmail本身的问题。是否有避免此问题的最佳做法?更新 所以我尝试了一些不同的邮件结构,最后得到了一封可以正常工作的Gmail邮件!但是解决办法很奇怪,我还是不明白 我唯一更改的是多部分替代MimeType。而不是使用
MPalt = new MimeMultipart("alternative");
我把它改成了
MPalt = new MimeMultipart();
然后将HTML BodyPart和内联BodyPart添加到其中。但在我看来,这毫无意义——有人能解释这种奇怪的行为吗
注意:非工作邮件源代码-“代码”和工作邮件源代码之间没有区别。我很困惑
向你问好,芬利尔
编辑:
单击此处查看屏幕截图:
我对我的Gmail收件箱做了一个截图,正如你所看到的,谷歌只对PLINHT(一种用普通、html和内联图像创建的邮件)和PLINHTAT有问题
case PLINHTAT:
mimeMultipart = new MimeMultipart("mixed");
bpHtml = new MimeBodyPart();
bpHtml.setContent(this.htmlText, "text/html; charset=utf-8");
mpRel = new MimeMultipart("related");
mpRel.addBodyPart(bpHtml);
bpInlines = this.getInlineAttachmentBodyParts();
for (int i = 0; i < bpInlines.length; i++)
mpRel.addBodyPart(bpInlines[i]);
bpCon1 = new MimeBodyPart();
bpCon1.setContent(mpRel);
bpPlain = new MimeBodyPart();
bpPlain.setText(this.plainText);
mpAlt = new MimeMultipart("alternative");
mpAlt.addBodyPart(bpPlain);
mpAlt.addBodyPart(bpCon1);
bpCon2 = new MimeBodyPart();
bpCon2.setContent(mpAlt);
mimeMultipart.addBodyPart(bpCon2);
bpAttaches = this.getAttachmentBodyParts();
for (int i = 0; i < bpAttaches.length; i++)
mimeMultipart.addBodyPart(bpAttaches[i]);
break;
case PLINHT:
bpHtml = new MimeBodyPart();
bpHtml.setContent(this.htmlText, "text/html; charset=utf-8");
mpRel = new MimeMultipart("related");
mpRel.addBodyPart(bpHtml);
bpInlines = this.getInlineAttachmentBodyParts();
for (int i = 0; i < bpInlines.length; i++)
mpRel.addBodyPart(bpInlines[i]);
bpCon1 = new MimeBodyPart();
bpCon1.setContent(mpRel);
bpPlain = new MimeBodyPart();
bpPlain.setText(this.plainText);
mimeMultipart = new MimeMultipart("alternative");
mimeMultipart.addBodyPart(bpCon1);
mimeMultipart.addBodyPart(bpPlain);
break;
case PLINHTAT:
mimeMultipart=新的mimeMultipart(“混合”);
bpHtml=新的MimeBodyPart();
setContent(this.htmlText,“text/html;charset=utf-8”);
mpRel=新的MimeMultipart(“相关”);
mpRel.addBodyPart(bpHtml);
bpInlines=this.getInlineAttachmentBodyParts();
for(int i=0;i case ATHTIN:
bpHtml = new MimeBodyPart();
bpHtml.setContent(this.htmlText, "text/html; charset=utf-8");
mpRel = new MimeMultipart("related");
mpRel.addBodyPart(bpHtml);
bpInlines = this.getInlineAttachmentBodyParts();
for (int i = 0; i < bpInlines.length; i++)
mpRel.addBodyPart(bpInlines[i]);
bpCon1 = new MimeBodyPart();
bpCon1.setContent(mpRel);
mimeMultipart = new MimeMultipart("mixed");
mimeMultipart.addBodyPart(bpCon1);
bpAttaches = this.getAttachmentBodyParts();
for (int i = 0; i < bpAttaches.length; i++)
mimeMultipart.addBodyPart(bpAttaches[i]);
break;
case PLHT:
bpHtml = new MimeBodyPart();
bpHtml.setContent(this.htmlText, "text/html; charset=utf-8");
bpPlain = new MimeBodyPart();
bpPlain.setText(this.plainText);
mimeMultipart = new MimeMultipart("alternative");
mimeMultipart.addBodyPart(bpPlain);
mimeMultipart.addBodyPart(bpHtml);
break;
case PLINHTAT:
mimeMultipart = new MimeMultipart("mixed");
bpHtml = new MimeBodyPart();
bpHtml.setContent(this.htmlText, "text/html; charset=utf-8");
mpRel = new MimeMultipart("related");
mpRel.addBodyPart(bpHtml);
bpInlines = this.getInlineAttachmentBodyParts();
for (int i = 0; i < bpInlines.length; i++)
mpRel.addBodyPart(bpInlines[i]);
bpCon1 = new MimeBodyPart();
bpCon1.setContent(mpRel);
bpPlain = new MimeBodyPart();
bpPlain.setText(this.plainText);
mpAlt = new MimeMultipart("alternative");
mpAlt.addBodyPart(bpPlain);
mpAlt.addBodyPart(bpCon1);
bpCon2 = new MimeBodyPart();
bpCon2.setContent(mpAlt);
mimeMultipart.addBodyPart(bpCon2);
bpAttaches = this.getAttachmentBodyParts();
for (int i = 0; i < bpAttaches.length; i++)
mimeMultipart.addBodyPart(bpAttaches[i]);
break;