あなたの問題
私が見る限り、それはあなたがメッセージを作成する方法のように見え、すべてがほとんど正しいです! 適切な MIME タイプとすべてを使用します。
なぜあなたが DataSource と DataHandler を使用し、画像に ContentID を持っているのかわかりませんが、私がさらにトラブルシューティングできるようにするには、質問を完了する必要があります。特に、次の行:
bodyPart.setContent(message, "text/html; charset=ISO-8859-1");
何が入っていmessage
ますか? 含まれています<img src="cid:image" />
か?
String cid = ContentIdGenerator.getContentId();
を使用する代わりに、でContentID を生成しようとしましたかimage
ソース
このブログ記事では、適切なメッセージ タイプの使用方法、画像の添付方法、および HTML 本文から添付ファイルを参照する方法を学びました: How to Send Email with Embedded Images Using Java
詳細
メッセージ
MimeMultipart
クラスを使用してコンテンツを作成する必要があります。文字列をコンストラクターへのパラメーターとして使用して、パーツが「連携して動作して"related"
いる」ことを JavaMail に伝えることが重要です。
MimeMultipart content = new MimeMultipart("related");
コンテンツ識別子
ContentID を生成する必要があります。これは、メールに添付した画像を識別し、メール本文から参照するために使用される文字列です。
String cid = ContentIdGenerator.getContentId();
注: このContentIdGenerator
クラスは架空のものです。コンテンツ ID を作成するか、コンテンツ ID の作成をインライン化できます。私の場合、単純な方法を使用します。
import java.util.UUID;
// ...
String generateContentId(String prefix) {
return String.format("%s-%s", prefix, UUID.randomUUID());
}
HTML 本文
HTML コードはMimeMultipart
コンテンツの一部です。MimeBodyPart
そのためにクラスを使用します。その部分のテキストを設定するときは、 encoding
andを指定することを忘れないでください!"html"
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setText(""
+ "<html>"
+ " <body>"
+ " <p>Here is my image:</p>"
+ " <img src=\"cid:" + cid + "\" />"
+ " </body>"
+ "</html>"
,"US-ASCII", "html");
content.addBodyPart(htmlPart);
画像のソースとして、cid:
生成された ContentID を使用することに注意してください。
画像添付
MimeBodyPart
画像の添付用に別のものを作成できます。
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.attachFile("resources/teapot.jpg");
imagePart.setContentID("<" + cid + ">");
imagePart.setDisposition(MimeBodyPart.INLINE);
content.addBodyPart(imagePart);
<
と の間で同じ ContentID を使用し>
、画像の ContentID として設定することに注意してください。またINLINE
、この画像が添付ファイルとしてではなく、電子メールに表示されることを示すように、性質を に設定しました。
終了メッセージ
それでおしまい!適切なセッションで SMTP メッセージを作成し、そのコンテンツを使用すると、メールに画像が埋め込まれます。例えば:
SMTPMessage m = new SMTPMessage(session);
m.setContent(content);
m.setSubject("Mail with embedded image");
m.setRecipient(RecipientType.TO, new InternetAddress("your@email.com"));
Transport.send(m)
それがうまくいくかどうか教えてください!;)