发送带附件和图片的邮件
发送纯文本邮件任务的实现相对来说非常简单,但多数时候,可能需要在发送邮件的内容中嵌入静态资源(例如一张图片),而不是简单的文本内容,甚至是在发送邮件的时候需要携带附件,针对上述这种需求,需要编写不同的业务处理方式。下面,使用Spring Boot框架实现邮件中包含静态资源和附件的复杂邮件的发送任务。
(1)定制邮件发送服务
由于在前一个案例中实现发送纯文本邮件功能时,已经在项目中添加了邮件服务依赖和相关配置,因此,后续操作时可以直接使用。打开之前创建的邮件发送任务的业务处理类SendEmailService,在该类中编写一个发送带附件和图片邮件的业务方法,示例代码如下。
/**
* 发送复杂邮件(包括静态资源和附件)
* @param to 收件人地址
* @param subject 邮件标题
* @param text 邮件内容
* @param filePath 附件地址
* @param rscId 静态资源唯一标识
* @param rscPath 静态资源地址
*/
public void sendComplexEmail(String to,String subject,String text,
String filePath,String rscId,String rscPath){
// 定制复杂邮件信息MimeMessage
MimeMessage message = mailSender.createMimeMessage();
try {
// 使用MimeMessageHelper帮助类,并设置multipart多部件使用为true
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text, true);
// 设置邮件静态资源
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
// 设置邮件附件
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
// 发送邮件
mailSender.send(message);
System.out.println("复杂邮件发送成功");
} catch (MessagingException e) {
System.out.println("复杂邮件发送失败 "+e.getMessage());
e.printStackTrace();
}
}
上述代码中,sendComplexEmail()方法需要接收的参数除了基本的发送信息外,还包括静态资源唯一标识、静态资源路径和附件路径,具体信息在注释中都有说明。另外,在定制复杂邮件信息时使用了MimeMessageHelper类对邮件信息封装处理,包括设置内嵌静态资源和邮件附件。其中,设置邮件内嵌静态资源的方法为addInline(String contentId, Resource resource),设置邮件附件的方法为addAttachment(String attachmentFilename, InputStreamSource inputStreamSource)。
(2)复杂邮件发送效果测试
在项目测试类Chapter09ApplicationTests中添加一个方法调用带附件和图片的复杂邮件发送的方法实现邮件发送效果测试,示例代码如下。
@Test
public void sendComplexEmailTest() {
String to="2127269781@qq.com";
String subject="【复杂邮件】标题";
// 定义邮件内容
StringBuilder text = new StringBuilder();
text.append("<html><head></head>");
text.append("<body><h1>祝大家元旦快乐!</h1>");
// cid为固定写法,rscId自定义的资源唯一标识
String rscId = "img001";
text.append("<img src='cid:" +rscId+"'/></body>");
text.append("</html>");
// 指定静态资源文件和附件路径
String rscPath="F:\\email\\newyear.jpg";
String filePath="F:\\email\\元旦放假注意事项.txt";
// 发送复杂邮件
sendEmailService.sendComplexEmail(to,subject,text.toString(),
filePath,rscId,rscPath);
}
上述代码中,根据前面定义的复杂邮件发送业务方法定制了各种参数。其中,在定义邮件内容时使用了Html标签编辑邮件内容,并内嵌了一个标识为rscId的图片,并为邮件指定了携带的附件路径。在邮件发送之前,务必保证指定路径下存放有对应的静态资源和附件文件。
需要说明的是,编写内嵌静态资源文件时,cid为嵌入式静态资源文件关键字的固定写法,如果改变将无法识别;rscId则属于自定义的静态资源唯一标识,一个邮件内容中可能会包括多个静态资源,该属性是为了区别唯一性的。
启动单元测试方法sendComplexEmailTest()进行效果测试,控制台会出现“复杂邮件发送成功“的提示消息。与此同时,打开设置的收件人邮箱核对发送的邮件,效果如图1所示。
图1 复杂邮件发送效果
从图1可以看出,指定的收件人邮箱正确接收到了定制的复杂邮件,该复杂邮件包括一张内嵌在邮件内容中的静态资源图片以及一个附件文件,这说明前面编写的带附件和图片的邮件业务实现成功。