> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/untitled-12/untitled-2/untitled-1.md).

# 19.2.1　添加附件

如果发送带有附件的 Email，关键技巧是创建 multipart 类型的消息 —— Email 由多个部分组成，其中一部分是 Email 体，其他部分是附件。

对于发送附件这样的需求来说，SimpleMailMessage 过于简单了。为了发送 multipart 类型的 Email，你需要创建一个 MIME（Multipurpose Internet Mail Extensions）的消息，我们可以从邮件发送器的 createMimeMessage() 方法开始：

```java
MimeMessage message = mailSender.createMimeMessage();
```

就这样，我们已经有了要使用的 MIME 消息。看起来，我们所需要做的就是指定收件人和发件人地址、主题、一些内容以及一个附件。尽管确实是这样，但并不是你想的那么简单。javax.mail.internet.MimeMessage 本身的 API 有些笨重。好消息是，Spring 提供的 MimeMessageHelper 可以帮助我们。

为了使用 MimeMessageHelper，我们需要实例化它并将 MimeMessage 传给其构造器：

```java
MimeMessageHelper helper = new MimeMessageHelper(message, true);
```

构造方法的第二个参数，在这里是个布尔值 true，表明这个消息是 multipart 类型的。 得到了 MimeMessageHelper 实例后，我们就可以组装 Email 消息了。这里最主要区别在于使用 helper 的方法来指定 Email 细节，而不再是设置消息对象：

```java
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 方法：

```java
FileSystemResource couponImage = new FileSystemResource("/collateral/coupon.png");
helper.addAttachmentt("Coupon.png", couponImage);
```

在这里，我们使用 Spring 的 FileSystemResource 来加载位于应用类路径下的 coupon.png。然后，调用 addAttachment()。第一个参数是要添加到 Email 中附件的名称，第二个参数是图片资源。

multipart 类型的 Email 已经构建完成了，现在可以发送它了。完整的 sendSpittleEmailWithAttachment() 方法如下所示。

{% code title="程序清单 19.2 使用 MimeMessageHelper 发送带有附件的 Email" %}

```java
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);
}
```

{% endcode %}

multipart 类型的 Email 能够实现很多的功能，添加附件只是其中之一。除此之外，通过将 Email 体指明为 HTML，我们可以生成比简单文本更漂亮的 Email。接下来，看一下如何使用 MimeMessageHelper 来发送更吸引人的 Email。
