2

我正在尝试将多个文件附加到电子邮件中。

除了文本文件缺少第一行之外,它工作正常。

注意:为了便于阅读,删除了所有错误处理。此外,假设正确设置了收件人/发件人/主题等(电子邮件发送完美 - 除了附件问题)。

首先,这是我正在使用的代码:

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 发行版中,因此您已经拥有它。您可以在下面找到有关其用法的一些简要介绍的链接,因此我不会解释其工作原理,而只是向您展示我的一个涉及发送多部分电子邮件的最新项目的摘录。根据 Notification 对象中提供的电子邮件规范,这是配置空 MimeMessage 的代码。通知对象有一个附件对象数组。

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。

这里简单介绍一下激活框架。

于 2012-12-02T13:40:20.147 回答