我正在开发一个将邮件发送到列表等的应用程序。它是用Java编写的,使用javax.mail api。 这里的问题是,我无法使用CID嵌入图像。
这是发送邮件的来源:
Delivered-To: -@gmail.com
Received: by 10.43.50.4 with SMTP id vc4csp85536icb;
Tue, 17 Apr 2012 05:08:00 -0700 (PDT)
Received: by 10.204.141.25 with SMTP id k25mr4406030bku.72.1334664479298;
Tue, 17 Apr 2012 05:07:59 -0700 (PDT)
Return-Path: <-@gmail.com>
Received: from mail-bk0-f43.google.com (mail-bk0-f43.google.com [209.85.214.43])
by mx.google.com with ESMTPS id ad16si7984294bkc.150.2012.04.17.05.07.58
(version=TLSv1/SSLv3 cipher=OTHER);
Tue, 17 Apr 2012 05:07:59 -0700 (PDT)
Received-SPF: pass (google.com: domain of -@gmail.com designates 209.85.214.43 as permitted sender) client-ip=209.85.214.43;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of - designates 209.85.214.43 as permitted sender) smtp.mail=-; dkim=pass header.i=@gmail.com
Received: by mail-bk0-f43.google.com with SMTP id j5so5978375bkw.2
for <-@gmail.com>; Tue, 17 Apr 2012 05:07:58 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20120113;
h=date:from:to:message-id:subject:mime-version:content-type;
bh=Xj44O9fBIzirvcquOGxJbYLtbqgBc2Ags7prNUuAtSQ=;
b=WWTCdrFgs3RCT/g2qXHR0fLCTc73TmNMA15sff0oIDksB6Nn3IwTYAqTVmoGiNrkW5
08WDpTRADEKAOvjQ5FC9/uBCh1RXWTjxtawfjHc7vfUpqKbXOCj8Ab6GWXQMmX/+WB6T
KVYLhk3/+GddIJI1XsAX9zprSYVcP6MMJ5/U+idIDlC7xQGGNuvzvpAnlnlGuWzgKc6j
qPoFSAAaio6zICY9uSaI0deBIYTEQ2hIuBDJG8oaRvGVvpjhzJaBK+ab+rPJEboHPg8S
3WSCG/Pp212VOw/YXOLUQV0jmMbuqAbsGdeER+Okbwe11sWi+zvPz+jhplB0NB2wq0Fn
mWzA==
Received: by 10.204.130.13 with SMTP id q13mr4084640bks.128.1334664478358;
Tue, 17 Apr 2012 05:07:58 -0700 (PDT)
Return-Path: <-t@gmail.com>
Received: from Akoya ([xx])
by mx.google.com with ESMTPS id z14sm37467763bky.15.2012.04.17.05.07.51
(version=SSLv3 cipher=OTHER);
Tue, 17 Apr 2012 05:07:54 -0700 (PDT)
Date: Tue, 17 Apr 2012 05:07:54 -0700 (PDT)
From: BP MM <-@gmail.com>
To: xx xx <-@gmail.com>
Message-ID: <404745073.01334664469900.JavaMail.xx@Akoya>
Subject: TestImage
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_2_854532868.1334664469871"
------=_Part_2_854532868.1334664469871
Content-Type: multipart/mixed;
boundary="----=_Part_1_1457048287.1334664469871"
------=_Part_1_1457048287.1334664469871
Content-Type: image/png; name=logo.png
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=logo.png
Content-ID: img_cid
[base64 data]
------=_Part_1_1457048287.1334664469871--
------=_Part_2_854532868.1334664469871
Content-Type: multipart/alternative;
boundary="----=_Part_0_1033690582.1334664469858"
------=_Part_0_1033690582.1334664469858
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hello
------=_Part_0_1033690582.1334664469858
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
<html>
<body>
<H1>Hello</H1>
<img src="cid:img_cid">
</body>
</html>
------=_Part_0_1033690582.1334664469858--
------=_Part_2_854532868.1334664469871--
我尝试过不同的CID,添加&lt;和&gt;到CID,设置内联,验证HTML等的处置。 无法让这个工作,Thunderbird和Gmail查看带有“死”图像的邮件。 我已经读过客户端在邮件中查找cid,所以我认为应该正确获取图像。 发送附件确实有效,但嵌入不起作用。 谁有线索?它与Multipart结构有关吗?
用于创建消息的java代码(我已经注释了一些尝试解决它的行...)
/*
* The method to create a MimeMessage, this message can be sent with the transport method.
*/
private Message createMessage(final Mail mail, final Member member, final MailingList list,
final MailAccount mailAccount, final Session session)
throws MessagingException, UnsupportedEncodingException {
// Get attachments
@SuppressWarnings("unchecked")
List<File> attachments = (List<File>) mail.getProperty(Mail.ATTACHMENTS_KEY);
// Create content parts
String plainContent = templateEngine.replaceTemplateTags(mail, member, list, mailAccount);
String htmlContent = templateEngine.replaceHTMLTemplateTags(mail, member, list, mailAccount);
Multipart multiContentPart = new MimeMultipart("alternative");
// Multipart attachmentsBodyPart = new MimeMultipart();
Multipart rootBodyPart = new MimeMultipart();
// Create plain text part
if (!plainContent.equals("")) {
BodyPart plainMessageBodyPart = new MimeBodyPart();
plainMessageBodyPart.setContent(plainContent, "text/plain");
multiContentPart.addBodyPart(plainMessageBodyPart);
}
// Create html part
if (!htmlContent.equals("")) {
BodyPart htmlMessageBodyPart = new MimeBodyPart();
htmlMessageBodyPart.setContent(htmlContent, "text/html");
multiContentPart.addBodyPart(htmlMessageBodyPart);
}
// Create attachments
if (attachments != null && attachments.size() > 0) {
for (int i = 0; i < attachments.size(); i++) {
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachments.get(i));
attachmentBodyPart.setDataHandler(new DataHandler(source));
attachmentBodyPart.setFileName(attachments.get(i).getName());
attachmentBodyPart.setHeader("Content-ID", "<img_cid>");
attachmentBodyPart.setDisposition(Part.INLINE);
// attachmentsBodyPart.addBodyPart(attachmentBodyPart);
rootBodyPart.addBodyPart(attachmentBodyPart);
}
// Build attachments
// BodyPart attachmentsWrapper = new MimeBodyPart();
// attachmentsWrapper.setContent(attachmentsBodyPart);
// rootBodyPart.addBodyPart(attachmentsWrapper);
}
// Build content
BodyPart contentWrapper = new MimeBodyPart();
contentWrapper.setContent(multiContentPart);
rootBodyPart.addBodyPart(contentWrapper);
// Create message
Message message = new MimeMessage(session);
message.setRecipient(Message.RecipientType.TO, new InternetAddress(
member.getEmail(), member.getName()));
message.setSubject((String) mail.getProperty(Mail.SUBJECT_KEY));
message.setContent(rootBodyPart);
// Add headers
message.setFrom(new InternetAddress(mailAccount.getFromAddress(),
mailAccount.getFromName()));
if (mailAccount.getReplyTo() != "" && mailAccount.getReplyTo() != null)
message.setReplyTo(InternetAddress.parse(mailAccount.getReplyTo()));
return message;
}
不要介意每个附件的CID是相同的,稍后这将是文件名 - 我现在只测试一个附件。希望这会有所帮助..
答案 0 :(得分:4)
我发现邮件来源没有任何问题。这是邮件客户端处理CID的方式。 Gmail.com要求在&lt;之间设置CID。和&gt;。 Thunderbird还没有显示我的图像.. 我认为它需要是某种独特的..仍然没有想到为什么以及如何解决它。 通过Embedding images into html email with java mail
找到它答案 1 :(得分:0)
CID工作正常, 问题是当你发送邮件到mutilple email id, 每次不会出现错误时,你必须初始化MimeMessage
MimeMessage m = new MimeMessage(mailSession);
答案 2 :(得分:0)
看起来令人难以置信,但所有html标签必须在同一条线上。介于'&lt;'之间和'&gt;'没有回车。解析器非常肮脏。