我正在尝试将多个文件附加到一封电子邮件中。
除了文本文件缺少第一行之外,它运行良好。
注意:为了可读性,删除了所有错误处理。此外,假设收件人/发件人/主题等设置正确(除了附件问题外,电子邮件发送完美)。
首先,这是我正在使用的代码:
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
根据我在几个涉及电子邮件的项目中的经验,无论是否有附件,我都知道以下内容可以完美地工作。我一直使用Java激活框架在我的代码和用于电子邮件合成的各种数据源之间提供额外的抽象层。这个框架几年前已经集成到标准Java发行版中,所以你已经有了它。下面你可以找到一个链接,介绍它的用法,所以我不解释它的工作原理,只向你展示我最近一个涉及发送多部分电子邮件的项目的摘录。以下是配置空MimeMessage的代码,给定Notification对象中提供的电子邮件规范。通知对象有一个Attachment对象数组。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。
以下是激活框架的简单介绍。