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属性驼峰命名的类似映射