java 实现发送邮件(带中文附件名称)
java 实现发送邮件(带中文附件名称)
代码如下:
/**
* 发送带附件的邮件
*
* @param session 发件人信息
* @param from 发件人地址
* @param subject 邮件标题
* @param content 邮件内容
* @param recipients 收件人地址
*/
public static void sendFileMail(Session session, String from, String recipients, String subject, String content, List<File> attachments) {
MimeMessage message = new MimeMessage(session);
try {
System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
// 创建多重消息
Multipart multipart = new MimeMultipart();
message.setFrom(new InternetAddress(from));
// 邮件标题
message.setSubject(subject);
// 添加邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent(content, "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
message.setSentDate(new Date());
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(recipients);
// Message.RecipientType.TO属性表示接收者的类型为TO
message.setRecipient(Message.RecipientType.TO, to);
// 添加附件的内容
if (attachments != null) {
for (int i = 0; i < attachments.size(); i++) {
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachments.get(i));
attachmentBodyPart.setDataHandler(new DataHandler(source));
// MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeText(attachments.get(i).getName()));
multipart.addBodyPart(attachmentBodyPart);
}
}
// 发送完整消息
message.setContent(multipart);
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
测试类如下:
注意:中文附件名称有可能出现乱码,以下两行代码可以解决乱码问题。
System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
attachmentBodyPart.setFileName(MimeUtility.encodeText(attachments.get(i).getName()));
