如果发送带有附件的 Email,关键技巧是创建 multipart 类型的消息 —— Email 由多个部分组成,其中一部分是 Email 体,其他部分是附件。
对于发送附件这样的需求来说,SimpleMailMessage 过于简单了。为了发送 multipart 类型的 Email,你需要创建一个 MIME(Multipurpose Internet Mail Extensions)的消息,我们可以从邮件发送器的 createMimeMessage() 方法开始:
MimeMessage message = mailSender.createMimeMessage();
就这样,我们已经有了要使用的 MIME 消息。看起来,我们所需要做的就是指定收件人和发件人地址、主题、一些内容以及一个附件。尽管确实是这样,但并不是你想的那么简单。javax.mail.internet.MimeMessage 本身的 API 有些笨重。好消息是,Spring 提供的 MimeMessageHelper 可以帮助我们。
为了使用 MimeMessageHelper,我们需要实例化它并将 MimeMessage 传给其构造器:
MimeMessageHelper helper = new MimeMessageHelper(message, true);
构造方法的第二个参数,在这里是个布尔值 true,表明这个消息是 multipart 类型的。 得到了 MimeMessageHelper 实例后,我们就可以组装 Email 消息了。这里最主要区别在于使用 helper 的方法来指定 Email 细节,而不再是设置消息对象:
String spitterName = spittle.getSpitter().getFullName();
helper.setFrom("noreply@spitter.com");
helper.setTo(to);
helper.setSubject("New spittle from " + spitterName);
helper.setText(spitterName + " says: " + spittle.getText());
在发送 Email 之前,你唯一还要做的就是添加附件:在本例中,也就是一张图标图片。为了做到这一点,你需要加载图片并将其作为资源,然后将这个资源传递给 helper 的 addAttachment 方法:
FileSystemResource couponImage = new FileSystemResource("/collateral/coupon.png");
helper.addAttachmentt("Coupon.png", couponImage);
在这里,我们使用 Spring 的 FileSystemResource 来加载位于应用类路径下的 coupon.png。然后,调用 addAttachment()。第一个参数是要添加到 Email 中附件的名称,第二个参数是图片资源。
multipart 类型的 Email 已经构建完成了,现在可以发送它了。完整的 sendSpittleEmailWithAttachment() 方法如下所示。
程序清单 19.2 使用 MimeMessageHelper 发送带有附件的 Email
public void sendSpittleEmailWithAttachment(
String to, Spittle spittle) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
String spitterName = spittle.getSpitter().getFullName();
helper.setFrom("noreply@spitter.com");
helper.setTo(to);
helper.setSubject("New spittle from " + spitterName);
helper.setText(spitterName + " says: " + spittle.getText());
FileSystemResource couponImage = new FileSystemResource("/collateral/coupon.png");
helper.addAttachment("Coupon.png", couponImage);
mailSender.send(message);
}
multipart 类型的 Email 能够实现很多的功能,添加附件只是其中之一。除此之外,通过将 Email 体指明为 HTML,我们可以生成比简单文本更漂亮的 Email。接下来,看一下如何使用 MimeMessageHelper 来发送更吸引人的 Email。