java mail pom_集成JavaMail

我们在发送Email和接收Email中已经介绍了如何通过JavaMail来收发电子邮件。在Spring中,同样可以集成JavaMail。

因为在服务器端,主要以发送邮件为主,例如在注册成功、登录时、购物付款后通知用户,基本上不会遇到接收用户邮件的情况,所以本节我们只讨论如何在Spring中发送邮件。

在Spring中,发送邮件最终也是需要JavaMail,Spring只对JavaMail做了一点简单的封装,目的是简化代码。为了在Spring中集成JavaMail,我们在pom.xml中添加以下依赖:

org.springframework:spring-context-support:5.2.0.RELEASE

javax.mail:javax.mail-api:1.6.2

com.sun.mail:javax.mail:1.6.2

以及其他Web相关依赖。

我们希望用户在注册成功后能收到注册邮件,为此,我们先定义一个JavaMailSender的Bean:

@Bean

JavaMailSender createJavaMailSender(

// smtp.properties:

@Value("${smtp.host}") String host,

@Value("${smtp.port}") int port,

@Value("${smtp.auth}") String auth,

@Value("${smtp.username}") String username,

@Value("${smtp.password}") String password,

@Value("${smtp.debug:true}") String debug)

{

var mailSender = new JavaMailSenderImpl();

mailSender.setHost(host);

mailSender.setPort(port);

mailSender.setUsername(username);

mailSender.setPassword(password);

Properties props = mailSender.getJavaMailProperties();

props.put("mail.transport.protocol", "smtp");

props.put("mail.smtp.auth", auth);

if (port == 587) {

props.put("mail.smtp.starttls.enable", "true");

}

if (port == 465) {

props.put("mail.smtp.socketFactory.port", "465");

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

}

props.put("mail.debug", debug);

return mailSender;

}

这个JavaMailSender接口的实现类是JavaMailSenderImpl,初始化时,传入的参数与JavaMail是完全一致的。

另外注意到需要注入的属性是从smtp.properties中读取的,因此,AppConfig导入的就不止一个.properties文件,可以导入多个:

@Configuration

@ComponentScan

@EnableWebMvc

@EnableTransactionManagement

@PropertySource({ "classpath:/jdbc.properties", "classpath:/smtp.properties" })

public class AppConfig {

...

}

下一步是封装一个MailService,并定义sendRegistrationMail()方法:

@Component

public class MailService {

@Value("${smtp.from}")

String from;

@Autowired

JavaMailSender mailSender;

public void sendRegistrationMail(User user) {

try {

MimeMessage mimeMessage = mailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, "utf-8");

helper.setFrom(from);

helper.setTo(user.getEmail());

helper.setSubject("Welcome to Java course!");

String html = String.format("

Hi, %s,

Welcome to Java course!

Sent at %s

", user.getName(), LocalDateTime.now());

helper.setText(html, true);

mailSender.send(mimeMessage);

} catch (MessagingException e) {

throw new RuntimeException(e);

}

}

}

观察上述代码,MimeMessage是JavaMail的邮件对象,而MimeMessageHelper是Spring提供的用于简化设置MimeMessage的类,比如我们设置HTML邮件就可以直接调用setText(String text, boolean html)方法,而不必再调用比较繁琐的JavaMail接口方法。

最后一步是调用JavaMailSender.send()方法把邮件发送出去。

在MVC的某个Controller方法中,当用户注册成功后,我们就启动一个新线程来异步发送邮件:

User user = userService.register(email, password, name);

logger.info("user registered: {}", user.getEmail());

// send registration mail:

new Thread(() -> {

mailService.sendRegistrationMail(user);

}).start();

因为发送邮件是一种耗时的任务,从几秒到几分钟不等,因此,异步发送是保证页面能快速显示的必要措施。这里我们直接启动了一个新的线程,但实际上还有更优化的方法,我们在下一节讨论。

练习

小结

Spring可以集成JavaMail,通过简单的封装,能简化邮件发送代码。其核心是定义一个JavaMailSender的Bean,然后调用其send()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值