6

リストなどにメールを送信するアプリケーションに取り組んでいます。javax.mail API を使用して Java で記述されています。ここでの問題は、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 に < と > を追加し、気質をインラインに設定し、HTML を検証するなど、さまざまな CID を試しました。クライアントがメールでcidを探すと読んだので、画像を正しく取得する必要があると考えました。添付ファイルの送信は機能しますが、埋め込みは機能しません。手がかりを持っている人はいますか?マルチパート構造に関連していますか?

メッセージを作成するための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 が同じであることは気にしないでください。後でこれがファイル名になります。今のところ、1 つの添付ファイルでのみテストしています。お役に立てれば..

4

3 に答える 3

4

メールの送信元に問題がないことがわかりました。メールクライアントが CID を処理する方法です。Gmail.com では、CID を < と > の間に設定する必要があります。Thunderbird はまだ私の画像を表示していません.. ある種の一意である必要があると思います.. 理由と修正方法はまだわかりません. Javaメールを使用してhtmlメールに画像を埋め込むことで見つけました

于 2012-04-18T11:04:38.240 に答える
0

信じられないかもしれませんが、すべての html タグが同じ行にある必要があります。'<' と '>' の間にキャリッジ リターンは使用できません。パーサーは非常に怪しいです。

于 2015-05-06T02:17:47.277 に答える
0

CID は正しく機能しています。問題は、複数の電子メール ID にメールを送信する場合です。エラーが発生しないたびに MimeMessage を初期化する必要があります。

MimeMessage m = new MimeMessage(mailSession);

于 2013-09-17T19:21:39.493 に答える