页面输入:excel文件、多个word文件、主题、附件(可输)、发件人邮箱、授权码
处理逻辑:excel文件记录了序号和收件人邮箱,根据名字为“序号_序号”查找到具体的word文件,将Word文件里面内容“文字和表格图片”作为正文发送出去。
前端:
邮件发送
WELCOME!
后端:
Controller.java
@PostMapping("/upload2")
@ResponseBody
public String uploadFile(@RequestParam("texts") MultipartFile[] files,
@RequestPart("excel") MultipartFile excel,
@RequestParam("sender") String sender,
@RequestParam("code") String code,
@RequestPart("extra") MultipartFile extra,
@RequestParam("extra1") Boolean hasExtra,
@RequestParam("theme") String theme,
HttpServletRequest request) {
MultipartFile text = null;
ArrayList> receiverList = ExcelAnalysisUtil.analysisByCol(excel);
JavaMailSender mailSender = emailUtil.init(sender,code);
for (int i = 0; i < receiverList.get(0).size(); i++) {
String filename = concat(receiverList.get(0).get(i), "_", receiverList.get(0).get(i));
text = findFile(filename, files); // 获得正文
if (text == null) {
return "搜寻不到正文,请确认是否遗漏";
}
try {
// 正文转换为html文件
File f = FileUtil.MultipartFileToFile1((text));
String html = WordToHtml2.docx2Html(f);
if(f.exists()){
f.delete();
}
String receiver = receiverList.get(1).get(i); // 收件人
emailUtil.sendMail(mailSender,sender,html, receiver, hasExtra, extra, theme);
}catch(MailException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
return e.toString();
}
}
return "success";
}
// 从正文列表中根据名称获得对应正文文件
public MultipartFile findFile(String name,MultipartFile[] files) {
for(MultipartFile m:files) {
int prefix = m.getOriginalFilename().lastIndexOf(".");
String filename = m.getOriginalFilename().substring(0,prefix);
if(name.equals(filename)){
return m;
}
}
return null;
}
analysisByCol()是解析excel文件方法,可直接上网查,在此不赘述了。
@Component
public class EmailUtil {
public JavaMailSender init(String sender, String code) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
String host = sender.substring(sender.lastIndexOf("@")+1);
mailSender.setHost("smtp." + host);
mailSender.setUsername(sender);
mailSender.setPassword(code);
mailSender.setDefaultEncoding("UTF-8");
return mailSender;
}
public boolean sendMail(JavaMailSender mailSender, String sender, String text, String receiver, boolean hasExtra, MultipartFile extra, String theme) {
//创建复杂有限发送对象
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
// 有附件
if (hasExtra) {
MimeMessageHelper messageHelper = null;
messageHelper = new MimeMessageHelper(mimeMessage, true);
messageHelper.setFrom(sender); // 设置发件人邮箱(若配置默认邮箱则不用再设置)
messageHelper.setTo(receiver); // 设置收件人邮箱
messageHelper.setSubject(theme); // 设置邮件主题
FileSystemResource resource = new FileSystemResource(FileUtil.MultipartFileToFile1(extra));
messageHelper.addAttachment(
Objects.requireNonNull(resource.getFilename()),//附件名称
resource, //附件流
Files.probeContentType(Paths.get(Objects.requireNonNull(resource.getFilename()))));//附件类型
//设置邮件内容 cid:资源id 在内容中引用资源 后面true代表是html内容
messageHelper.setText(text, true);
//发送
mailSender.send(mimeMessage);
} else {// 没有附件
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setFrom(sender);
helper.setTo(receiver);
helper.setSubject(theme);
helper.setSentDate(new Date());//发送时间
//第一个参数要发送的内容,第二个参数是不是Html格式。
helper.setText(text, true);
mailSender.send(mimeMessage);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
public class FileUtil {
public static File MultipartFileToFile1(MultipartFile multipartFile) throws IOException {
String path = "I:/" + multipartFile.getOriginalFilename();
File file = new File(path);
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
return file;
}
}
WordToHtml2:
public static String docx2Html(File docxFile){
String html = null;
String imagePath=docxFile.getAbsolutePath().replaceAll(docxFile.getName(),"")+"docxImage/";
File imageFile=new File(imagePath);
if(!docxFile.exists()){
System.out.println("文件不存在!");
}
try {
InputStream in=new FileInputStream(docxFile);
XWPFDocument document=new XWPFDocument(in);
//存储图片
XHTMLOptions options=XHTMLOptions.create();
//存放图片的文件夹
options.setIgnoreStylesIfUnused(false);
options.setFragment(true);
options.setImageManager(new Base64EmbedImgManager());
// 3) 将 XWPFDocument转换成XHTML
// OutputStream out = new FileOutputStream(new File(tempPath+"\a.html"));
// XHTMLConverter.getInstance().convert(document, out, options);
//也可以使用字符数组流获取解析的内容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XHTMLConverter.getInstance().convert(document, baos, options);
html = new String(baos.toByteArray());
in.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
} catch (XWPFConverterException e) {
e.printStackTrace();
}
return html;
}



