我正在尝试将多个文件附加到电子邮件中。
除了文本文件缺少第一行之外,它工作正常。
注意:为了便于阅读,删除了所有错误处理。此外,假设正确设置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
答案 0 :(得分:3)
根据我对涉及电子邮件的多个项目的经验,无论是否有附件,我都知道以下内容可以完美地运作。我一直使用Java Activation框架在我的代码和电子邮件组合的各种数据源之间提供额外的抽象层。几年前,该框架已集成到标准Java发行版中,因此您已经拥有它。下面是一些关于其用法的一小部分介绍的链接,因此我不会解释其工作原理,只是向您展示我最近涉及发送多部分电子邮件的项目的摘录。以下是根据Notification对象中提供的电子邮件规范配置空MimeMessage的代码。通知对象具有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。
这是激活框架中的一个简单的introduction。