1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > SpringBoot:用腾讯企业微信邮箱发送邮件

SpringBoot:用腾讯企业微信邮箱发送邮件

时间:2024-03-05 11:46:19

相关推荐

SpringBoot:用腾讯企业微信邮箱发送邮件

需求

商户审核状态需要异步发送短信、站内通知和发送邮件通知商户,且发送账户限定为腾讯企业微信邮箱

准备

准备发送邮箱的账户和密码写入配置文件引入发送邮箱jar包写异步线程发送固定html格式的邮件

实现代码

配置文件

mail:transport:protocol: sslsmtp:host: smtp. # 企业微信的hostport: 465auth: truessl:enable : trueenable: trueaccount: 企业邮箱账户password: 企业邮箱密码

引入发送邮箱jar包

<dependency><groupId>com.sun.mail</groupId><artifactId>jakarta.mail</artifactId><version>1.6.7</version></dependency>

代码块

定义一个接口:ISendEmailService

import java.util.List;public interface ISendEmailService{/*** 发送邮件* @param fromAliasName 别名* @param to 发送目标* @param subject 主题* @param content 内容* @param attachFileList 附件*/void send(String fromAliasName,String to,String subject,String content, List<String> attachFileList);}

接口实现类:SendEmailServiceImpl

/*** 邮件发送工具类* 注:腾讯企业微信邮箱需要用SSL方式发送*/@Slf4j@Servicepublic class SendEmailServiceImpl implements ISendEmailService{@Value("${mail.account}")private String account ;/*** 登录密码*/@Value("${mail.password}")private String password;/*** 发信协议*/@Value("${mail.transport.protocol}")private String protocol;/*** 邮件服务器地址*/@Value("${mail.smtp.host}")private String host;/*** 发信端口*/@Value("${mail.smtp.port}")private String port ;/*** 发信端口*/@Value("${mail.smtp.auth}")private String auth ;@Value("${mail.smtp.ssl.enable}")private String sslEnable ;/*** 发送邮件*/@Override@Async(value = ExecutorConfig.EMAIL_ASYNC)public void send(String fromAliasName,String to,String subject,String content,List<String> attachFileList) {// 设置邮件属性Properties prop = new Properties();prop.setProperty("mail.transport.protocol", protocol);prop.setProperty("mail.smtp.host", host);prop.setProperty("mail.smtp.port", port);prop.setProperty("mail.smtp.auth", auth);MailSSLSocketFactory sslSocketFactory = null;try {sslSocketFactory = new MailSSLSocketFactory();sslSocketFactory.setTrustAllHosts(true);} catch (GeneralSecurityException e1) {e1.printStackTrace();}if (sslSocketFactory == null) {log.error("开启 MailSSLSocketFactory 失败");} else {prop.put("mail.smtp.ssl.enable",sslEnable);prop.put("mail.smtp.ssl.socketFactory", sslSocketFactory);// 创建邮件会话(注意,如果要在一个进程中切换多个邮箱账号发信,应该用 Session.getInstance)Session session = Session.getDefaultInstance(prop, new MyAuthenticator(account, password));try {MimeMessage mimeMessage = new MimeMessage(session);// 设置发件人别名(如果未设置别名就默认为发件人邮箱)if (fromAliasName != null && !fromAliasName.trim().isEmpty()) {mimeMessage.setFrom(new InternetAddress(account, fromAliasName));}// 设置主题和收件人、发信时间等信息mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));mimeMessage.setSubject(subject);mimeMessage.setSentDate(new Date());// 如果有附件信息,则添加附件Multipart multipart = new MimeMultipart();MimeBodyPart body = new MimeBodyPart();body.setContent(content, "text/html; charset=UTF-8");multipart.addBodyPart(body);// 添加所有附件(添加时判断文件是否存在)if (CollectionUtils.isNotEmpty(attachFileList)){for(String filePath : attachFileList){if(Files.exists(Paths.get(filePath))){MimeBodyPart tempBodyPart = new MimeBodyPart();tempBodyPart.attachFile(filePath);multipart.addBodyPart(tempBodyPart);}}}mimeMessage.setContent(multipart);// 开始发信mimeMessage.saveChanges();Transport.send(mimeMessage);}catch (Exception e) {log.error("发送邮件错误:{}",e.getMessage());}}}/*** 认证信息*/static class MyAuthenticator extends Authenticator {/*** 用户名*/String username = null;/*** 密码*/String password = null;/*** 构造器** @param username 用户名* @param password 密码*/public MyAuthenticator(String username, String password) {this.username = username;this.password = password;}@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(username, password);}}}

异步线程池配置

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;@Configuration@EnableAsyncpublic class ExecutorConfig{private int corePoolSize = 10;private int maxPoolSize = 50;private int queueCapacity = 100;/*** 邮件相关的异步*/public static final String EMAIL_ASYNC="emailAsync";@Beanpublic Executor emailAsync(){ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setThreadNamePrefix(EMAIL_ASYNC);// rejection-policy:当pool已经达到max size的时候,如何处理新任务// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}}

调用方式

@RestController@AllArgsConstructorpublic class SendEmailController {@Autowiredprivate ISendEmailService sendEmailService;/*** 发送邮件*/@GetMapping("/sendMail")@ApiOperationSupport(order = 1)@ApiOperation(value = "发送邮件")public void 发送sendMail() {sendEmailService.send("别名","邮件","【审核通过】","内容","附件");}

结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。