使用Transport.send发送邮件(带附件)
最近做了一个邮件发送功能,遇到的坑不是一般的多,网上的例子大多数获取file都是测试时直接输入文件所在位置,不是从前端上传上来的。于是自己做了一个,开始不带附件很简单,加上文件之后,问题接踵而来,第一次使用form表单直接传,controller使用multiparfile接收得到file,通过file.getAbsolutePath()取得绝对路径,谁知道最后取出来的路径只取得到桌面的路径,其他路径的文件根本取不到,最后有想了一个办法把multiparfile类型转成file类型,找了一下资料,尝试了几次,最后宣告失败。(说明:我是通过 File usFile = new File(filePath);
// 添加附件的内容
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(usFile);
attachmentBodyPart.setDataHandler(new DataHandler(source));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(usFile.getName()));
multipart.addBodyPart(attachmentBodyPart);所以我需要取到上传文件的绝对路径,因为实在取不到文件的绝对路径所以就想直接把multipartfile接收到的file直接转成usFile看看能不能用,结果转换失败GG)思考了好久,最后决定使用ajax直接传文件的绝对路径,捣鼓一波代码终于写好了,因为ojbk,然后迅速打脸,取到的路径根本就不是自己需要的c:\fakefile**,本着不能轻易放弃的原则,又查了度娘,了解到这是由于浏览器安全问题,最后找了好多方法,然而并没有什么卵用,网上大多数是ie,搜狐的解决办法,就是没有谷歌的,通过测试ie是可以取到文件的绝对路径,谷歌失败,扎心了。无论是修改浏览器的安全配置,还是代码啥的,都试过了,只能说句mmp,到这里ajax上传文件绝对路径失败。你以为这样我就会放弃了吗,天真。最后灵机一动反正是毕业设计,既然我不能直接获取文件的绝对路径,我是否可以把文件上传到项目的工程目录,然后在获取他的绝对路径呢,这一刻仿佛看到了胜利的曙光,说干就干,又是一通操作,最后终于黄天不负有心人,我终于成功了,激动到买了一瓶可乐庆祝一下。最后附上代码,希望能对你们有所帮助。
<tr>
<td style="text-align: center;">
<input type="submit" class="btn btn-mini btn-primary" value="提交" />
<!-- <a class="btn btn-mini btn-primary" id="sendEmail">提交</a> -->
<a class="btn btn-mini btn-danger" id="sendEmailCancelLink">取消</a>
</td>
</tr>
</table>
这是后台代码
package com.jiaying.teamanager.controller;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.jiaying.teamanager.model.MyAuthentication;
@RestController
@RequestMapping(value="/javaEmailSender")
public class JavaEmailSenderControler {
@RequestMapping(value="/sendEmail")
public String sendEmail(String EMAIL,String TITLE,String CONTENT,MultipartFile file,HttpServletRequest request)throws Exception{
String path = request.getSession().getServletContext().getRealPath("/images/");
//String path = "D:\\jee-swork2018\\teaManagerSystem\\src\\main\\webapp\\images\\";
String fileName = file.getOriginalFilename();
File dir = new File(path);
if(!dir.exists()){
dir.mkdirs();
}
file.transferTo(new File(path+File.separator+fileName));
String smtpServer ="smtp.qq.com";
String protocol = "smtp";
String username = "邮箱账号";
String password = "获取的密码";
String from ="邮箱账号";
String to = EMAIL;
String subject = TITLE;
String body = CONTENT;
String filePath = "";// jar包的路径
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol);
props.setProperty("mail.host", smtpServer);
props.setProperty("mail.smtp.auth", "true");
MyAuthentication authentication = new MyAuthentication(username, password);
Session session = Session.getInstance(props, authentication);
session.setDebug(true);
//创建代表邮件的MimeMessage对象
Message message = new MimeMessage(session);
//存放附件或摘要
Multipart multipart = new MimeMultipart();
filePath=path+fileName;
if (fileName!=null) {
//File temp = new File(file.getOriginalFilename());
//filePath = temp.getAbsolutePath() + "\\" + file.getOriginalFilename();
//filePath = temp.getAbsolutePath();
//添加附件
File usFile = new File(filePath);
// 添加附件的内容
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(usFile);
attachmentBodyPart.setDataHandler(new DataHandler(source));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(usFile.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
// 添加邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent(body, "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
message.setFrom(new InternetAddress(from));
message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
message.setSentDate(new Date());
message.setSubject(subject);
//message.setText(body);
message.setContent(multipart);
//保存并且生成邮件对象
message.saveChanges();
//建立发送邮件的对象
Transport.send(message);
return "OK";
/*
//或是使用下面的方法
transport.connect();
transport.sendMessage(message, message.getRecipients(RecipientType.TO));
transport.close();
return "OK";
*/
}
}