我正在尝试将多个文件附加到电子邮件中。
除了文本文件缺少第一行之外,它工作正常。
注意:为了可读性,删除了所有错误处理。另外,假设“收件人”/“发件人”/“主题”等设置正确(电子邮件发送完美 - 除了附件问题)。
首先,这是我正在使用的代码:
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 Activation 框架在我的代码和电子邮件撰写的不同数据源之间提供额外的抽象层。这个框架几年前就已经集成到标准 Java 发行版中,所以您已经拥有它了。下面您可以找到有关其用法的一些简短介绍的链接,因此我不会解释其工作原理,而只是向您展示我最新的一个涉及发送多部分电子邮件的项目的摘录。考虑到通知对象中提供的电子邮件规范,以下是配置空 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\"");
如果正文部分的输入不仅仅是字符串,而是其他形式,那么您可以使用特定于您的输入类型的数据源。如果您有 URL,则使用 URLDataSource;如果您有文件,则使用 FileDataSource。 在此示例中,我们仅处理其数据是其他地方生成的字节数组的附件。因此数据源是ByteArrayDataSource。
这是一个简单的 introduction进入激活框架。
关于JavaMail 附件第一行之前的内容配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13668405/