From 74a5a03a1b144ba2d6af6a29a8fc32ecb71c675b Mon Sep 17 00:00:00 2001 From: qinyingjie Date: Mon, 19 Dec 2022 22:47:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=8F=91=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 + .../kwan/springbootkwan/entity/MailInfo.java | 28 +++ .../service/ISendMsgHandle.java | 28 +++ .../service/impl/EmailSendMsgHandleImpl.java | 176 ++++++++++++++++++ src/main/resources/application.yaml | 13 ++ .../springbootkwan/UserServiceImplTest.java | 17 +- 6 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kwan/springbootkwan/entity/MailInfo.java create mode 100644 src/main/java/com/kwan/springbootkwan/service/ISendMsgHandle.java create mode 100644 src/main/java/com/kwan/springbootkwan/service/impl/EmailSendMsgHandleImpl.java diff --git a/pom.xml b/pom.xml index 7e28bdb..508ff1f 100644 --- a/pom.xml +++ b/pom.xml @@ -109,6 +109,10 @@ springfox-swagger-ui 2.6.1 + + org.springframework.boot + spring-boot-starter-mail + diff --git a/src/main/java/com/kwan/springbootkwan/entity/MailInfo.java b/src/main/java/com/kwan/springbootkwan/entity/MailInfo.java new file mode 100644 index 0000000..c9d8862 --- /dev/null +++ b/src/main/java/com/kwan/springbootkwan/entity/MailInfo.java @@ -0,0 +1,28 @@ +package com.kwan.springbootkwan.entity; + +import lombok.Data; + +import java.util.Map; + +/** + * 邮件实体 + * + * @author : qinyingjie + * @version : 2.2.0 + * @date : 2022/12/19 22:41 + */ +@Data +public class MailInfo { + // 邮件接收人 + private String[] receiver; + // 邮件主题 + private String subject; + // 邮件的文本内容 + private String content; + // 抄送人 + private String[] cc; + // 邮件附件的文件名 + private String[] attachFileNames; + // 邮件内容内嵌图片 + private Map imageMap; +} diff --git a/src/main/java/com/kwan/springbootkwan/service/ISendMsgHandle.java b/src/main/java/com/kwan/springbootkwan/service/ISendMsgHandle.java new file mode 100644 index 0000000..c827efd --- /dev/null +++ b/src/main/java/com/kwan/springbootkwan/service/ISendMsgHandle.java @@ -0,0 +1,28 @@ +package com.kwan.springbootkwan.service; + +import com.kwan.springbootkwan.entity.MailInfo; + +public interface ISendMsgHandle { + + /** + * 功能描述:发送text邮件 + * + * @param mailInfo 邮件信息 + */ + void sendSimpleTextEmail(MailInfo mailInfo); + + /** + * 功能描述:发送html邮件 + * + * @param mailInfo 邮件信息 + * @param html 是否是html邮件 + */ + void sendHtmlEmail(MailInfo mailInfo, boolean html); + + /** + * 功能描述:发送文本内容(内嵌图片)且带附件的html邮件 + * + * @param mailInfo 邮件信息 + */ + void sendEnclosureEmail(MailInfo mailInfo); +} diff --git a/src/main/java/com/kwan/springbootkwan/service/impl/EmailSendMsgHandleImpl.java b/src/main/java/com/kwan/springbootkwan/service/impl/EmailSendMsgHandleImpl.java new file mode 100644 index 0000000..e795768 --- /dev/null +++ b/src/main/java/com/kwan/springbootkwan/service/impl/EmailSendMsgHandleImpl.java @@ -0,0 +1,176 @@ +package com.kwan.springbootkwan.service.impl; + +import com.kwan.springbootkwan.entity.MailInfo; +import com.kwan.springbootkwan.service.ISendMsgHandle; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.annotation.Resource; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import java.util.Date; +import java.util.Map; +import java.util.Set; + +@Slf4j +@Component +public class EmailSendMsgHandleImpl implements ISendMsgHandle { + @Resource + private JavaMailSender javaMailSender; + @Value(value = "${spring.mail.username}") + private String emailFrom; + + @Override + public void sendSimpleTextEmail(MailInfo mailInfo) { + try { + SimpleMailMessage mailMessage = new SimpleMailMessage(); + //发件人 + mailMessage.setFrom(emailFrom); + //接收人 + mailMessage.setTo(mailInfo.getReceiver()); + //邮件主题 + mailMessage.setSubject(mailInfo.getSubject()); + //邮件抄送 + mailMessage.setCc(mailInfo.getCc()); + //邮件内容 + mailMessage.setText(mailInfo.getContent()); + //发送邮件 + javaMailSender.send(mailMessage); + } catch (Exception e) { + log.error("邮件发送失败:{}", e.getMessage()); + } + } + + @Override + public void sendHtmlEmail(MailInfo mailInfo, boolean html) { + try { + MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); + //true 表示需要创建一个multipart message + MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage); + //发件人 + mimeMessageHelper.setFrom(emailFrom); + //接收人 + mimeMessageHelper.setTo(mailInfo.getReceiver()); + //邮件主题 + mimeMessageHelper.setSubject(mailInfo.getSubject()); + //邮件抄送 + mimeMessageHelper.setCc(mailInfo.getCc()); + //邮件内容 + mimeMessageHelper.setText(mailInfo.getContent(), html); + javaMailSender.send(mimeMailMessage); + } catch (Exception e) { + log.error("邮件发送失败:{}", e.getMessage()); + } + } + + @Override + public void sendEnclosureEmail(MailInfo mailInfo) { + try { + MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); + //true 表示需要创建一个multipart message + MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); + //发件人 + mimeMessageHelper.setFrom(emailFrom); + //邮件接收人 + mimeMessageHelper.setTo(mailInfo.getReceiver()); + //邮件主题 + mimeMessageHelper.setSubject(mailInfo.getSubject()); + //邮件抄送 + mimeMessageHelper.setCc(mailInfo.getCc()); + //设置显示的发件时间 + mimeMessageHelper.setSentDate(new Date()); + MimeMultipart allMultipart = new MimeMultipart(); + //创建代表邮件正文和附件的各个MimeBodyPart对象 + MimeBodyPart contentPart = createContent(mailInfo.getContent(), mailInfo.getImageMap()); + allMultipart.addBodyPart(contentPart); + //创建用于组合邮件正文和附件的MimeMultipart对象 + for (int i = 0; i < mailInfo.getAttachFileNames().length; i++) { + allMultipart.addBodyPart(createAttachment(mailInfo.getAttachFileNames()[i])); + } + //设置整个邮件内容为最终组合出的MimeMultipart对象 + mimeMailMessage.setContent(allMultipart); + mimeMailMessage.saveChanges(); + javaMailSender.send(mimeMailMessage); + } catch (Exception e) { + log.error("邮件发送失败:{}", e.getMessage()); + } + } + + /** + * 功能描述:邮件附件 + * + * @param filename 文件路径 + * @return {@link MimeBodyPart} + * @author wi-gang + * @date 2021/12/29 2:50 下午 + */ + public MimeBodyPart createAttachment(String filename) throws Exception { + //创建保存附件的MimeBodyPart对象,并加入附件内容和相应的信息 + MimeBodyPart attachPart = new MimeBodyPart(); + FileDataSource fsd = new FileDataSource(filename); + attachPart.setDataHandler(new DataHandler(fsd)); + attachPart.setFileName(fsd.getName()); + return attachPart; + } + + /** + * 功能描述:文本内容 + * + * @param body html格式的文本内容 + * @return {@link MimeBodyPart} + * @author wi-gang + * @date 2021/12/29 2:50 下午 + */ + public MimeBodyPart createContent(String body) throws Exception { + //创建代表组合Mime消息的MimeMultipart对象,将该MimeMultipart对象保存到MimeBodyPart对象 + MimeBodyPart contentPart = new MimeBodyPart(); + MimeMultipart contentMultipart = new MimeMultipart("related"); + //创建用于保存HTML正文的MimeBodyPart对象,并将它保存到MimeMultipart中 + MimeBodyPart htmlBodyPart = new MimeBodyPart(); + htmlBodyPart.setContent(body, "text/html;charset=UTF-8"); + contentMultipart.addBodyPart(htmlBodyPart); + //将MimeMultipart对象保存到MimeBodyPart对象 + contentPart.setContent(contentMultipart); + return contentPart; + } + + /** + * 功能描述:文本内嵌图片 + * + * @param body html格式的文本内容 + * @param map 图片集合 + * @return {@link MimeBodyPart} + * @author wi-gang + * @date 2021/12/29 2:50 下午 + */ + public MimeBodyPart createContent(String body, Map map) throws Exception { + //创建代表组合Mime消息的MimeMultipart对象,将该MimeMultipart对象保存到MimeBodyPart对象 + MimeBodyPart contentPart = new MimeBodyPart(); + MimeMultipart contentMultipart = new MimeMultipart("related"); + //创建用于保存HTML正文的MimeBodyPart对象,并将它保存到MimeMultipart中 + MimeBodyPart htmlBodyPart = new MimeBodyPart(); + htmlBodyPart.setContent(body, "text/html;charset=UTF-8"); + contentMultipart.addBodyPart(htmlBodyPart); + if (map != null && map.size() > 0) { + Set> set = map.entrySet(); + for (Map.Entry entry : set) { + //创建用于保存图片的MimeBodyPart对象,并将它保存到MimeMultipart中 + MimeBodyPart gifBodyPart = new MimeBodyPart(); + FileDataSource fds = new FileDataSource(entry.getValue());//图片所在的目录的绝对路径 + gifBodyPart.setDataHandler(new DataHandler(fds)); + gifBodyPart.setContentID(entry.getKey()); //cid的值 + contentMultipart.addBodyPart(gifBodyPart); + } + } + //将MimeMultipart对象保存到MimeBodyPart对象 + contentPart.setContent(contentMultipart); + return contentPart; + } +} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index eafea58..8424365 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -6,6 +6,19 @@ swagger: #兼容swagger配置 spring: + mail: + host: smtp.qq.com + # 发送者的邮箱账号 + username: 327782001@qq.com + # 邮箱密码授权码 + password: kypxnmwfniqrcbeh + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true redis: database: 0 # Redis数据库索引(默认为0) host: 120.79.36.53 #Redis服务器地址 diff --git a/src/test/java/com/kwan/springbootkwan/UserServiceImplTest.java b/src/test/java/com/kwan/springbootkwan/UserServiceImplTest.java index d33147c..0508fc6 100644 --- a/src/test/java/com/kwan/springbootkwan/UserServiceImplTest.java +++ b/src/test/java/com/kwan/springbootkwan/UserServiceImplTest.java @@ -1,22 +1,37 @@ package com.kwan.springbootkwan; +import com.kwan.springbootkwan.entity.MailInfo; import com.kwan.springbootkwan.entity.User; import com.kwan.springbootkwan.mapper.UserMapper; +import com.kwan.springbootkwan.service.ISendMsgHandle; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; - @SpringBootTest public class UserServiceImplTest { @Autowired private UserMapper userService; + @Autowired + private ISendMsgHandle isSendMsgHandle; @Test public void queryAll() { User user = userService.selectById(1); System.out.println(user); } + + /** + * 发邮件 + */ + @Test + void sendSimpleTextEmail() { + MailInfo mailInfo = new MailInfo(); + mailInfo.setReceiver(new String[]{"qinyingjie@deepexi.com"}); + mailInfo.setSubject("测试主题"); + mailInfo.setContent("邮件内容"); + isSendMsgHandle.sendSimpleTextEmail(mailInfo); + } } \ No newline at end of file -- GitLab