图像嵌入在Java邮件中 - CID无法正常工作

时间:2012-04-17 12:18:43

标签: java html image email

我正在开发一个将邮件发送到列表等的应用程序。它是用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是相同的,稍后这将是文件名 - 我现在只测试一个附件。希望这会有所帮助..

3 个答案:

答案 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;'没有回车。解析器非常肮脏。