diff --git a/pom.xml b/pom.xml
index edecd81..d14eeaf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,7 +110,11 @@
3.10.2
-
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/controller/MailController.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/controller/MailController.java
new file mode 100644
index 0000000..e6dcbdd
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/controller/MailController.java
@@ -0,0 +1,44 @@
+package com.chinaunicom.mall.ebtp.extend.mail.controller;
+
+import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse;
+import com.chinaunicom.mall.ebtp.extend.mail.entity.MailRequest;
+import com.chinaunicom.mall.ebtp.extend.mail.service.IMailService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/v1/mails")
+@Api(tags = "邮件服务API")
+public class MailController {
+
+ @Resource
+ private IMailService mailService;
+
+ @PostMapping("/simple")
+ @ApiOperation(value = "发送简单文本邮件", notes = "发送纯文本格式的邮件")
+ public BaseResponse sendSimpleMail(@RequestBody MailRequest request) {
+ try {
+ mailService.sendSimpleMail(request.getTo(), request.getSubject(), request.getContent());
+ return BaseResponse.success("邮件发送成功");
+ } catch (Exception e) {
+ return BaseResponse.fail("邮件发送失败: " + e.getMessage());
+ }
+ }
+
+ @PostMapping("/html")
+ @ApiOperation(value = "发送HTML格式邮件", notes = "发送HTML格式的邮件,支持富文本内容")
+ public BaseResponse sendHtmlMail(@RequestBody MailRequest request) {
+ try {
+ mailService.sendHtmlMail(request.getTo(), request.getSubject(), request.getContent());
+ return BaseResponse.success("HTML邮件发送成功");
+ } catch (Exception e) {
+ return BaseResponse.fail("HTML邮件发送失败: " + e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/dao/MailLogMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/dao/MailLogMapper.java
new file mode 100644
index 0000000..7ddf757
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/dao/MailLogMapper.java
@@ -0,0 +1,7 @@
+package com.chinaunicom.mall.ebtp.extend.mail.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chinaunicom.mall.ebtp.extend.mail.entity.MailLog;
+
+public interface MailLogMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/entity/MailLog.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/entity/MailLog.java
new file mode 100644
index 0000000..4fe5d3c
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/entity/MailLog.java
@@ -0,0 +1,23 @@
+package com.chinaunicom.mall.ebtp.extend.mail.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("t_mail_log")
+public class MailLog {
+ @TableId(type = IdType.AUTO)
+ private Long id;
+ private String mailFrom;
+ private String mailTo;
+ private String subject;
+ private String content;
+ private Date sendTime;
+ private Integer status;
+ private String errorMsg;
+ private Boolean isHtml;
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/entity/MailRequest.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/entity/MailRequest.java
new file mode 100644
index 0000000..b64f54e
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/entity/MailRequest.java
@@ -0,0 +1,19 @@
+package com.chinaunicom.mall.ebtp.extend.mail.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("邮件请求参数")
+public class MailRequest {
+ @ApiModelProperty(value = "收件人邮箱", required = true, example = "recipient@example.com")
+ private String to;
+
+ @ApiModelProperty(value = "邮件主题", required = true, example = "测试邮件")
+ private String subject;
+
+ @ApiModelProperty(value = "邮件内容", required = true,
+ example = "这是一封测试邮件")
+ private String content;
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/service/IMailService.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/service/IMailService.java
new file mode 100644
index 0000000..8ba3180
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/service/IMailService.java
@@ -0,0 +1,22 @@
+package com.chinaunicom.mall.ebtp.extend.mail.service;
+
+import javax.mail.MessagingException;
+
+public interface IMailService {
+ /**
+ * 发送简单文本邮件
+ * @param to 收件人邮箱
+ * @param subject 邮件主题
+ * @param text 邮件内容
+ */
+ void sendSimpleMail(String to, String subject, String text);
+
+ /**
+ * 发送HTML格式邮件
+ * @param to 收件人邮箱
+ * @param subject 邮件主题
+ * @param htmlContent HTML格式的邮件内容
+ * @throws MessagingException 邮件发送异常
+ */
+ void sendHtmlMail(String to, String subject, String htmlContent) throws MessagingException;
+}
diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/service/impl/MailServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/service/impl/MailServiceImpl.java
new file mode 100644
index 0000000..fdf6724
--- /dev/null
+++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/mail/service/impl/MailServiceImpl.java
@@ -0,0 +1,85 @@
+package com.chinaunicom.mall.ebtp.extend.mail.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chinaunicom.mall.ebtp.extend.mail.dao.MailLogMapper;
+import com.chinaunicom.mall.ebtp.extend.mail.entity.MailLog;
+import com.chinaunicom.mall.ebtp.extend.mail.service.IMailService;
+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.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.util.Date;
+
+@Service
+public class MailServiceImpl extends ServiceImpl implements IMailService {
+
+ @Resource
+ private JavaMailSender mailSender;
+ @Resource
+ private MailLogMapper mailLogMapper;
+
+ @Value("${spring.mail.username}")
+ private String from;
+
+ @Transactional
+ public void sendSimpleMail(String to, String subject, String text) {
+ MailLog log = createLog(to, subject, text, false);
+ try {
+ SimpleMailMessage message = new SimpleMailMessage();
+ message.setFrom(from);
+ message.setTo(to);
+ message.setSubject(subject);
+ message.setText(text);
+ mailSender.send(message);
+ updateLogStatus(log.getId(), 1, null);
+ } catch (Exception e) {
+ updateLogStatus(log.getId(), 2, e.getMessage());
+ throw new RuntimeException("邮件发送失败", e);
+ }
+ }
+
+ @Transactional
+ public void sendHtmlMail(String to, String subject, String htmlContent) throws MessagingException {
+ MailLog log = createLog(to, subject, htmlContent, true);
+ try {
+ MimeMessage message = mailSender.createMimeMessage();
+ MimeMessageHelper helper = new MimeMessageHelper(message, true);
+ helper.setFrom(from);
+ helper.setTo(to);
+ helper.setSubject(subject);
+ helper.setText(htmlContent, true);
+ mailSender.send(message);
+ updateLogStatus(log.getId(), 1, null);
+ } catch (Exception e) {
+ updateLogStatus(log.getId(), 2, e.getMessage());
+ throw e;
+ }
+ }
+
+ private MailLog createLog(String to, String subject, String content, boolean isHtml) {
+ MailLog log = new MailLog();
+ log.setMailFrom(from);
+ log.setMailTo(to);
+ log.setSubject(subject);
+ log.setContent(content);
+ log.setSendTime(new Date());
+ log.setStatus(0);
+ log.setIsHtml(isHtml);
+ mailLogMapper.insert(log);
+ return log;
+ }
+
+ private void updateLogStatus(Long id, int status, String errorMsg) {
+ MailLog log = new MailLog();
+ log.setId(id);
+ log.setStatus(status);
+ log.setErrorMsg(errorMsg);
+ mailLogMapper.updateById(log);
+ }
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index bbdc8a5..1d19592 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -76,7 +76,7 @@ spring:
redis:
sentinel:
master: mymaster
-# nodes: 10.125.164.124:32718, 10.125.164.118:32716, 10.125.164.121:32716
+# nodes: 10.60.161.59:26379, 10.60.161.59:26380, 10.60.161.59:26381
nodes: localhost:26379, localhost:26380, localhost:26381
password: pass
database:
@@ -85,6 +85,30 @@ spring:
cache: 1
userinfo: 1
+ # 邮件配置
+ mail:
+# host: smtp.126.com
+# username: clc0820@126.com
+# password: WGZnauWK9RXHYQcJ
+ host: mailtest.coscoshipping.com
+ username: bidding.test@coscoshipping.com
+ password: WBksH6GjtBBV7q6e
+ port: 465
+ default-encoding: UTF-8
+ properties:
+ mail:
+ smtp:
+ auth: true
+ starttls:
+ enable: true
+# required: true
+ ssl:
+ enable: true
+ trust: mailtest.coscoshipping.com
+# checkServerIdentity: false
+ socketFactory:
+ class: javax.net.ssl.SSLSocketFactory
+
mybatis-plus:
configuration:
# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射