@
目录
《Spring的学习与实战》
Spring框架提供了一种使用JavaMailSender接口发送电子邮件的简单抽象方法,而Spring Boot为其提供了自动配置以及启动程序模块。
public interface JavaMailSender extends MailSender { MimeMessage createMimeMessage(); MimeMessage createMimeMessage(InputStream var1) throws MailException; void send(MimeMessage var1) throws MailException; void send(MimeMessage... var1) throws MailException; void send(MimeMessagePreparator var1) throws MailException; void send(MimeMessagePreparator... var1) throws MailException; }
Spirng实现邮件发送功能,需要以下步骤: 1. 添加maven依赖 2. 添加Spring邮件配置 3. 创建邮件管理Bean并注入Spring应用上下文 4. 修改业务逻辑,调用邮件发送功能
<!-- pom.xml --> <dependencies> <!-- 邮件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> </dependencies>
### application.yml spring: #mail配置 mail: host: smtp.163.com username: [email protected] password: 自行设置邮箱密码 default-encoding: UTF-8
/** * 邮件发送Bean * * @author zhuhuix * @date 2020-07-13 */ @Service @Component public class MailManager { private final org.slf4j.Logger logger = LoggerFactory.getLogger(Logger.class); // 发件人 @Value("${spring.mail.username}") private String from; @Autowired private JavaMailSender javaMailSender; /** * 普通文本邮件发送 * * @param to 收件人 * @param subject 主题 * @param text 内容 */ public void sendSimpleMail(String to, String subject, String text) { SimpleMailMessage msg = new SimpleMailMessage(); msg.setFrom(this.from); msg.setTo(to); msg.setSubject(subject); msg.setText(text); try { this.javaMailSender.send(msg); logger.info(msg.toString()); } catch (MailException ex) { logger.error(ex.getMessage()); } } /** * HTML邮件发送 * * @param to 收件人 * @param subject 主题 * @param text 内容 */ public void sendHTMLMail(String to, String subject, String text) { try { MimeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(msg, true); mimeMessageHelper.setFrom(this.from); mimeMessageHelper.setTo(to); mimeMessageHelper.setSubject(subject); mimeMessageHelper.setText(text, true); this.javaMailSender.send(msg); logger.info("to=" + to + "," + "subject=" + subject + "," + "text=" + text); } catch (MailException ex) { logger.error(ex.getMessage()); } catch (MessagingException ex) { logger.error(ex.getMessage()); } } /** * 发送带有附件的邮件 * @param to 收件人 * @param subject 主题 * @param text 内容 * @param filePath 附件 */ public void sendAttachmentMail(String to, String subject, String text, String filePath) { try { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo(to); mimeMessageHelper.setSubject(subject); mimeMessageHelper.setText(text, true); FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath)); String fileName = fileSystemResource.getFilename(); mimeMessageHelper.addAttachment(fileName, fileSystemResource); javaMailSender.send(mimeMessage); logger.info("to=" + to + "," + "subject=" + subject + "," + "text=" + text); } catch (MailException ex) { logger.error(ex.getMessage()); } catch (MessagingException ex) { logger.error(ex.getMessage()); } } }
业务流程图
业务逻辑
/** * 基于SpringMVC框架开发web应用--用户服务类 * * @author zhuhuix * @date 2020-07-03 * @date 2020-07-04 增加通过jdbcTemplate处理数据 * @date 2020-07-07 将jdbcTemplate处理数据程序改为Spring Data JPA的处理方式 * @date 2020-07-10 增加删除deleteUser和查找findUser * @date 2020-07-13 首次保存用户后通过邮件管理器发送通知邮件 */ @Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private MailManager mailManager; // 返回所有的用户 public List<User> listUsers() { return (List<User>) userRepository.findAll(); } // 保存用户 public User saveUser(User user) { boolean firstRegister = false; if ((user.getId() == null || user.getId().equals(0L))) { firstRegister = true; } // 首次保存用户成功后发送通知邮件 if (userRepository.save(user) != null && firstRegister == true) { sendMail(user); } return user; } // 发送邮件 private void sendMail(User user) { // 发送文本邮件 String text = "您的邮箱信息已登记!"; mailManager.sendSimpleMail(user.getEmail(), "用户通知(文本邮件)", text); // 发送HTML邮件 String content = "<html>\n" + "<body>\n" + "<h3> <font color=\"red\"> " + text + "</font> </h3>\n" + "</body>\n" + "</html>"; mailManager.sendHTMLMail(user.getEmail(), "用户通知(HTML邮件)", content); // 发送带有附件的邮件 String attachFilePath = "c:\\csdn-logo.png"; mailManager.sendAttachmentMail(user.getEmail(), "用户通知(带有附件的邮件)", content, attachFilePath); } // 删除用户 public void deleteUser(Long id) { userRepository.deleteById(id); } // 查找用户 public User findUser(Long id) { return userRepository.findById(id).get(); } // 根据名称查找用户 public List<User> searchUser(String name) { return userRepository.findByName(name); } }
登记用户
登录邮箱查看
以上我们通过JavaMailSender接口实现了文本、超文本及带有附件的邮件的发送功能。 在书写这些程序时,采用了硬编码,可能会碰到如下问题:
RabbitMQ可以说是AMQP(Advanced Message Queue,高级消息队列协议)最杰出的实现。
本文只对Direct模型进行展开处理,其他类型请读者自行研究。关于如何绑定队列到Exchange的更详细的描述,可以参考Alvaro Videla和Jason J.W. Williams编写的RabbitMQ in Action (RabbitMQ实战)。
<!-- pom.xml rabbitmq --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
### application.yml spring: #RabbitMQ配置 rabbitmq: host: 192.168.0.1 port: 5672 username: rabbitmq password: rabbitmq virtual-host: / connection-timeout: 10000 listener: simple: acknowledge-mode: auto # 自动应答 auto-startup: true default-requeue-rejected: false # 不重回队列 concurrency: 5 max-concurrency: 20 prefetch: 1 # 每次只处理一个信息 retry: enabled: false template: exchange: web.demo routing-key: user.key
/** * rabbitmq 配置类 * * @author zhuhuix * @date 2020-07-14 */ @Configuration(value = "rabbitMQConfig") public class RabbitMQConfig { // 获取exchange和routing-key定义 @Value("${spring.rabbitmq.template.exchange}") private String exchange; @Value("${spring.rabbitmq.template.routing-key}") private String routingKey; public String getExchange() { return exchange; } public String getRoutingKey() { return routingKey; } // 自定义消息转换器 @Bean public MessageConverter messageConverter() { return new SimpleMessageConverter() { @Override protected Message createMessage(Object object, MessageProperties messageProperties) throws MessageConversionException { Message message = super.createMessage(object, messageProperties); return message; } }; } }
/** * rabbitmq 接收器 * * @author zhuhuix * @date 2020-07-14 */ @Component public class RabbitMQReceiver { private final org.slf4j.Logger logger = LoggerFactory.getLogger(Logger.class); // 邮件集成请参考上篇文章《Spring全家桶的深入学习(八):Spring集成JavaMailSender实现邮件发送》 @Autowired private MailManager mailManager; @Autowired private RabbitTemplate rabbitTemplate; // 监听消息队列 @RabbitHandler @RabbitListener(bindings = @QueueBinding( exchange = @Exchange("#{rabbitMQConfig.getExchange()}"), key = "#{rabbitMQConfig.getRoutingKey()}", value = @Queue("user.queue"))) public void receiveMessage(Message message) { try { User user = (User) rabbitTemplate.getMessageConverter().fromMessage(message); logger.info("接收到消息:[{}]", user.toString()); // 收到完整消息后,调用邮件发送程序,发送通知邮件 if (user != null) { sendMail(user); } } catch (Exception ex) { logger.error(ex.getMessage()); } } // 发送邮件 // 请参考上篇文章《Spring全家桶的深入学习(八):Spring集成JavaMailSender实现邮件发送》 private void sendMail(User user) { // 发送文本邮件 String text = "您的邮箱信息已登记!"; mailManager.sendSimpleMail(user.getEmail(), "用户通知(文本邮件)", text); // 发送HTML邮件 String content = "<html>\n" + "<body>\n" + "<h3> <font color=\"red\"> " + text + "</font> </h3>\n" + "</body>\n" + "</html>"; mailManager.sendHTMLMail(user.getEmail(), "用户通知(HTML邮件)", content); // 发送带有附件的邮件 String attachFilePath = "c:\\csdn-logo.png"; mailManager.sendAttachmentMail(user.getEmail(), "用户通知(带有附件的邮件)", content, attachFilePath); } }
/** * 基于SpringMVC框架开发web应用--用户服务类 * * @author zhuhuix * @date 2020-07-03 * @date 2020-07-04 增加通过jdbcTemplate处理数据 * @date 2020-07-07 将jdbcTemplate处理数据程序改为Spring Data JPA的处理方式 * @date 2020-07-10 增加删除deleteUser和查找findUser * @date 2020-07-13 首次保存用户后通过邮件管理器发送通知邮件 * @date 2020-07-14 将同步发送通知邮件的功能变更为通过消息队列异步发送 */ @Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private RabbitTemplate rabbitTemplate; // 返回所有的用户 public List<User> listUsers() { return (List<User>) userRepository.findAll(); } // 保存用户 public User saveUser(User user) { boolean firstRegister = false; if ((user.getId() == null || user.getId().equals(0L))) { firstRegister = true; } // 首次保存用户成功后发送消息队列实现异步发送通知邮件 if (userRepository.save(user) != null && firstRegister == true) { rabbitTemplate.convertAndSend(user); } return user; } // 删除用户 public void deleteUser(Long id) { userRepository.deleteById(id); } // 查找用户 public User findUser(Long id) { return userRepository.findById(id).get(); } // 根据名称查找用户 public List<User> searchUser(String name) { return userRepository.findByName(name); } }
原文链接:https://www.cnblogs.com/zhuhuix/p/13298965.html