阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

集成JavaMail

24次阅读
没有评论

共计 2804 个字符,预计需要花费 8 分钟才能阅读完成。

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

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

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

  • org.springframework:spring-context-support:6.0.0
  • jakarta.mail:jakarta.mail-api:2.0.1
  • com.sun.mail:jakarta.mail:2.0.1

以及其他 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("<p>Hi, %s,</p><p>Welcome to Java course!</p><p>Sent at %s</p>", 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 发送邮件。

下载练习

小结

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计2804字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中