1

わかりましたので、Java Mail を使用してアプリから電子メールを送信するために彼が送信した別の開発者からの古いコードを変更する必要があります。これは長い間問題なく機能していましたが、現在は PDF の添付ファイルも送信する必要があります。

したがって、基本的に以下では、テキストおよび html メッセージのゲッターと、ファイルシステムからロードしてメールに添付するための pdf ファイル名のゲッターを持つオブジェクト「mail」があると仮定します。

以下のコードのマークされた箇所を変更したので、添付する pdf がある場合は、ファイル システムからロードして添付します。前のコードと同じ構造を使用しようとしましたが、すべてが必要なわけではありませんか?

            Multipart mp = new MimeMultipart("alternative");

            // Create a "text" Multipart message
            BodyPart textPart = new MimeBodyPart();
            textPart.setContent(mail.getText(), "text/plain");
            mp.addBodyPart(textPart);

            // Create a "HTML" Multipart message
            Multipart htmlContent = new MimeMultipart("related");
            BodyPart htmlPage = new MimeBodyPart();

            htmlPage.setContent(mail.getHtml(), "text/html; charset=UTF-8");
            htmlContent.addBodyPart(htmlPage);
            BodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent(htmlContent);
            mp.addBodyPart(htmlPart);

            // NEW CODE STARTS HERE
            if(StringUtils.isNotBlank(mail.getPdfAttachmentFileName())) {
                Multipart pdfContent = new MimeMultipart("mixed"); //<---- this appears to be an issue???
                BodyPart pdfPage = new MimeBodyPart();

                File file = new File(uploadDir + "/" + mail.getPdfAttachmentFileName());
                DataSource dataSource = new ByteArrayDataSource(new FileInputStream(file), "application/pdf");

                pdfPage.setDataHandler(new DataHandler(dataSource));
                pdfPage.setFileName(mail.getPdfAttachmentFileName());
                pdfContent.addBodyPart(pdfPage);


                BodyPart pdfPart = new MimeBodyPart();
                pdfPart.setContent(pdfContent);
                mp.addBodyPart(pdfPart);
            }
            // NEW CODE ENDS HERE

            mimeMessage.setContent(mp);

いずれにせよ、上記は機能します。エラーや例外はなく、メッセージが送信されます。ただし、メールを受信する電子メール クライアントによっては、添付ファイルが表示されません。

上記のコードを使用すると、Outlook はメッセージを読み取り可能として受信し、添付ファイルは表示およびダウンロード可能になります。これは完璧です。しかし、GMail では、メッセージはまだ読めます。クリップは添付ファイルがあることを示しているように見えますが、ダウンロードする添付ファイルはありませんか?

「Multipart pdfContent = new MimeMultipart("mixed");」を切り替えると、「混合」ではなく「関連」することは、正反対です。GMail は完全に受信しますが、Outlook はメッセージとクリップのみを取得し、実際の添付ファイルは取得しません。

明らかに、顧客が電子メールを開くために使用した電子メールクライアントを知らずに、顧客に電子メールを送信する必要があります! 明らかに、私は Java Mail の初心者なので、提案されたコードを単にコピーしましたが、これは既存のコードではうまく機能しません!

上記を変更して、完全にメールクライアントに依存しないようにする方法はありますか?

4

1 に答える 1

2

さて、Spring には、この混乱をすべて隠しておくためのヘルパー クラスがあることがわかりました。

上記のコードをすべて次のようにリファクタリングしましたが、うまく機能します。

            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            message.setTo(mail.getTo());
            message.setFrom(mail.getFrom());
            message.setSubject(mail.getSubject());
            message.setText(mail.getText(), mail.getHtml());

            if(StringUtils.isNotBlank(mail.getPdfAttachmentFileName())) {
                File file = new File(uploadDir + "/" + mail.getPdfAttachmentFileName());
                DataSource dataSource = new ByteArrayDataSource(new FileInputStream(file), "application/pdf");
                message.addAttachment(mail.getPdfAttachmentFileName(), dataSource);
            }
于 2012-11-30T16:49:21.653 に答える