> 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-3/untitled-1.md).

# 19.1.1　配置邮件发送器

按照最简单的形式，我们只需在 @Bean 方法中使用几行代码就能将 JavaMailSenderImpl 配置为一个 bean：

```java
@Bean
public MailSender mailSender(Environment env) {
  JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
  mailSender.setHost(env.getProperty("mailserver.host"));
  return mailSender;
}
```

属性 host 是可选的（它默认是底层 JavaMail 会话的主机），但你可能希望设置该属性。它指定了要用来发送 Email 的邮件服务器主机名。按照这里的配置，会从注入的 Environment 中获取值，这样我们就能在 Spring 之外管理邮件服务器的配置（比如在属性文件中）。

默认情况下，JavaMailSenderImpl 假设邮件服务器监听 25 端口 （标准的 SMTP 端口）。如果你的邮件服务器监听不同的端口，那么可以使用 port 属性指定正确的端口号。例如：

```java
@Bean
public MailSender mailSender(Environment env) {
  JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
  mailSender.setHost(env.getProperty("mailserver.host"));
  mailSender.setPort(env.getProperty("mailserver.port"));
  return mailSender;
}
```

类似地，如果邮件服务器需要认证的话，你还需要设置 username 和 password 属性：

```java
@Bean
public MailSender mailSender(Environment env) {
  JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
  mailSender.setHost(env.getProperty("mailserver.host"));
  mailSender.setPort(env.getProperty("mailserver.port"));
  mailSender.setUsername(env.getProperty("mailserver.username"));
  mailSender.setPassword(env.getProperty("mailserver.password"));
  return mailSender;
}
```

到目前为止，JavaMailSenderImpl 已经配置完成，它可以创建自己的邮件会话，但是你可能已经在 JNDI 中配置了 javax.mail.MailSession（也可能是你的应用服务器放在那里的）。如果这样的话，那就没有必要为 JavaMailSenderImpl 配置详细的服务器细节了。我们可以配置它使用 JNDI 中已就绪的 MailSession。

借助 JndiObjectFactoryBean，我们可以在如下的 @Bean 方法中配置一个 bean，它会从 JNDI 中查找 MailSession：

```java
@Bean
public JndiObjectFactoryBean mailSession() {
  JndiObjectFactoryBean jndi = new JndiObjectFactoryBean();
  jndi.setJndiName("mail/Session");
  jndi.setProxyInterface(MailSession.class);
  jndi.setResourceRef(true);
  return jndi;
}
```

我们已经看到过如何使用 Spring 的 \<jee:jndi-lookup> 元素从 JNDI 中获取对象，这里可以使用 \<jee:jndi-lookup> 来创建一个 bean， 它引用了 JNDI 中的邮件会话：

```markup
<jee:jndi-lookup id="mailSession"
  jndi-name="mail/Session" resource-ref="true" />
```

邮件会话准备就绪之后，我们现在可以将其装配到 mailSender bean 中了：

```java
@Bean
public MailSender mailSender(MailSession mailSession) {
  JavaMailSenderImpl mailSender = new JavaMailSenderImp();
  mailSender.setSession(mailSession);
  return mailSender;
}
```

通过将邮件会话装配到 JavaMailSenderImpl 的 session 属性中，我们已经完全替换了原来的服务器（以及用户名/密码）配置。现在邮件会话完全通过 JNDI 进行配置和管理。JavaMailSenderImpl 能够专注于发送邮件而不必自己处理邮件服务器了。
