2

メールに複数のファイルを添付しようとしています。

テキストファイルの最初の行が欠落しているという事実を除けば、正常に機能しています。

注: 読みやすくするために、すべてのエラー処理を削除しました。また、To / From / Subject などの正しい設定を前提としています (メールは完全に送信されます - 添付ファイルの問題は別として)。

まず、私が使用しているコードは次のとおりです。

MimeMessage oMessage = new MimeMessage(oSession);
// Create a multipart message
Multipart oMultiPart = new MimeMultipart();

// Create the message part 
BodyPart oMessageBodyPart = new MimeBodyPart();

// Set the Message Body
String strFormat = oEmail.getFormat();
String strBody = oEmail.getBody();

oMessageBodyPart.setContent(strBody,strFormat);
oMultiPart.addBodyPart(oMessageBodyPart);


List<String> oAttachmentNames = oEmail.getAttachments();
for (String strAttachmentName : oAttachmentNames)
{                
 // Parse file from URL
 URL oURL = new URL(strAttachmentName);

 MimeBodyPart oAttachmentPart = new MimeBodyPart(oURL.openStream());

     oAttachmentPart.setFileName(strAttachmentName);
     oMultiPart.addBodyPart(oAttachmentPart);
}
// Add all contents (body + attachments)
oMessage.setContent(oMultiPart);

ちなみにテキストファイルは以下の通りです。

This is the Test file
   (intentional line break)
Line 1
Line 2

デバッグ出力は次のとおりです。

Content-Type: multipart/mixed; 
boundary="----=_Part_0_29194312.1354442889470"

------=_Part_0_29194312.1354442889470
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Plain Text Email.

------=_Part_0_29194312.1354442889470
This is the Test file
Content-Disposition: attachment; 
filename="http://mysite.com/temp/Test.txt"

Line 1
Line 2

------=_Part_0_29194312.1354442889470--
.
250 OK id=1Tf6T5-0004E9-Nn
QUIT
4

1 に答える 1

3

添付ファイルの有無にかかわらず、電子メール メッセージを含むいくつかのプロジェクトでの私の経験から、私は次のことが問題なく動作することを知っています。私は常に Java Activation フレームワークを使用して、コードと電子メール作成用の多様なデータ ソースとの間に追加の抽象化レイヤーを提供してきました。このフレームワークは、数年前に標準の Java ディストリビューションに統合されたので、既にお持ちです。以下に、その使用法を簡単に紹介するリンクを示します。そのため、仕組みについては説明しませんが、マルチパート メールの送信に関する最新のプロジェクトの 1 つからの抜粋を示します。以下は、Notification オブジェクトで提供される電子メールの仕様に基づいて、空の MimeMessage を構成するコードです。通知オブジェクトには、Attachment オブジェクトの配列があります。

private void configureMessage(Message message, Notification notification) throws MessagingException {
    DataHandler messageDataHandler = new DataHandler(notification.getMessage(), "text/plain; charset=\"UTF-8\"");
    if (notification.getAttachments() != null && !notification.getAttachments().isEmpty()) {
        log.debug("configureMessage: Adding attachments.");
        MimeMultipart multipart = new MimeMultipart();

        // een body part voor de tekstuele boodschap
        BodyPart mainBodyPart = new MimeBodyPart();
        mainBodyPart.setDataHandler(messageDataHandler);
        multipart.addBodyPart(mainBodyPart);

        for (Attachment attachment : notification.getAttachments()) {
            log.debugv("configureMessage: Adding attachment {0}.", attachment);
            // een body part voor de attachment
            MimeBodyPart attachmentPart = new MimeBodyPart();
            ByteArrayDataSource attachmentDataSource =
                    new ByteArrayDataSource(attachment.getBytes(), attachment.getMimeType());
            attachmentPart.setDataHandler(new DataHandler(attachmentDataSource));
            attachmentPart.setDisposition(Part.ATTACHMENT);
            attachmentPart.setFileName(attachment.getFileName());
            multipart.addBodyPart(attachmentPart);
        }
        message.setContent(multipart);
    } else {
        log.debug("configureMessage: No attachments.");
        message.setDataHandler(messageDataHandler);
    }
}

ご覧のとおり、メッセージに入るすべてのデータは、最初に DataHandler にラップされます。テキスト メッセージは、次のようにデータ ハンドラーに入ります。

  DataHandler messageDataHandler = new DataHandler(notification.getMessage(), "text/plain; charset=\"UTF-8\"");

ボディ パーツの入力が単なる文字列ではなく、他の形式である場合は、入力の種類に固有の DataSource を使用します。URL がある場合は、URLDataSource を使用します。ファイルがある場合は、FileDataSource を使用します。この例では、データが別の場所で生成されたバイト配列である添付ファイルのみを扱います。したがって、データ ソースは ByteArrayDataSource です。

Activation Frameworkの簡単な紹介を次に示します。

于 2012-12-02T13:40:20.147 に答える