Java Mail 发送邮件(带附件)
SpringBoot框架集成的有Java MailSender,相比Java Mail,MailSender使用起来其实更加的方便
1、MultiPartFile与File互相转换
网上能查到很多种方式,我这里只记录两种。
1、利用工具类创建临时文件
//伪代码,只是展示处理逻辑
//邮件内容
MimeMultipart mm = new MimeMultipart();
//前段传来的MultipartFile类型的附件
MultipartFile file = mailRecord.getFile();
String originalFilename = file.getOriginalFilename();
//利用File.createTempFile(prefix,sufix)创建临时文件
//这里要注意,prefix不能小于三个字符,否则会抛出异常
//利用FilenameUtils提供的方法分别获取原文件的前缀和后缀,附件名称可另外设置,这里不用在意名称显示得对不对,错了也无所谓
File tempFile = File.createTempFile(FilenameUtils.getBaseName(originalFilename), FilenameUtils.getExtension(originalFilename));
MimeBodyPart attachPart = new MimeBodyPart();
//临时文件作为附件,添加到邮件内容中
attachPart.attachFile(tempFile);
//这里是另外设置附件的名称,所以上面才会说临时文件的名字不会影响最终效果
attachPart.setFileName(MimeUtility.encodeText(file.getOriginalFilename()));
mm.addBodyPart(attachPart);
//别忘了删除临时文件
tempFile.deleteOnExit();
2、手写IO流转换代码
//真实代码,可直接复制使用
public static File multipartFileToFile(MultipartFile multipartFile) {
File file = null;
//判断是否为null
if (multipartFile.getSize() <= 0) {
return null;
}
//MultipartFile转换为File
InputStream ins = null;
OutputStream os = null;
try {
ins = multipartFile.getInputStream();
String fileName = multipartFile.getOriginalFilename();
file = new File(fileName);
os = new FileOutputStream(file);
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ins != null){
try {
ins.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
//邮件内容
MimeMultipart mm = new MimeMultipart();
//前段传来的MultipartFile类型的附件
MultipartFile file = mailRecord.getFile();
//类型转换
File file1 = multipartFileToFile(file);
MimeBodyPart attachPart = new MimeBodyPart();
attachPart.attachFile(file1);
//另外设置附件名称,我这里直接拿的原文件名称
attachPart.setFileName(MimeUtility.encodeText(file.getOriginalFilename()));
mm.addBodyPart(attachPart);
//一定不要忘了删除文件
if (file1 != null){
file1.deleteOnExit();
}
2、附件名称乱码问题
没有设置的话,附件里有中文的话很容易出现乱码问题
我们可以使用MimeUtility.encodeText()方法进行设置
//上面的两种方式都进行了编码设置,这样就不会出现乱码了
attachPart.setFileName(MimeUtility.encodeText(file.getOriginalFilename()));
标签:邮件附件,Java,File,attachPart,乱码,file,附件
From: https://www.cnblogs.com/bbttz/p/16700655.html