springCloud实现邮件发送

眉间皱痕 提交于 2020-01-21 05:15:13

在现有项目中有使用到邮件服务,所有在空闲之余,将邮件模块独立出来。
需要pom对邮件的jar依赖。

<!-- 邮件发送 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

邮件的发送发配置,这一块的配置根据实际情况可独立写到一个单独的配置文件上mail.yml,后期方便维护配置

spring:
	mail:
	    host: 你的邮件服务
	    username: 发送方的邮箱
	    password: 邮箱的授权密码
	    port: 465 # 这个端口根据实际情况配置,一般都是465
	    protocol: smtp # 这里应该是不用改的,我没试过其他的配置
	    test-connection: false
	    default-encoding: UTF-8
	    properties:
	      mail:
	        debug: true
	        smtp:
	          auth: true
	          connectiontimeout: 10000
	          timeout: 10000
	          writetimeout: 10000
	          socketFactory:
	            class: javax.net.ssl.SSLSocketFactory
	            port: 465
	          starttls:
	            enable: true
	            required: true

邮件发送的逻辑代码

/**
 * 邮件发送
 * @author tanzhiming
 * @version 
 */
@Slf4j
@Service("sendMailService")
public class SendMailServiceImpl implements SendMailService {
    @Resource
    private JavaMailSender    mailSender;

    @Value("${spring.mail.username}")
    private String            from;

    @Async
    @Override
    public void sendMail(Send2EmailDTO send2EmailDTO) {
        log.info("开始向邮箱【{}】发送邮件", send2EmailDTO.getTo());
        Date date = new Date();
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = null;
        List<String> delPaths = new ArrayList<>();
        try {
            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            String nick = "";
            try {
                // 使用邮箱别名
                nick = javax.mail.internet.MimeUtility.encodeText(MailsmsBusiApiConstant.EMAIL_NICK_NAME);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            mimeMessageHelper.setFrom(new InternetAddress(nick + "<" + from + ">"));
            mimeMessageHelper.setTo(send2EmailDTO.getTo());
            mimeMessageHelper.setSubject(send2EmailDTO.getSubject());
            mimeMessageHelper.setText(send2EmailDTO.getText(), true);


            List<EmailAnnex> emailAnnexList = new ArrayList<>();
            for (String filePath : send2EmailDTO.getOssFilePath()) {
                String fileName = UUID.randomUUID().toString().replace("-", "");
                String pathname = tempFilePath + fileName;
                // 下载文件至本都服务路径
                FileUtils.downloadFromUrl(filePath, pathname); // 请参考 (https://blog.csdn.net/tanzhming/article/details/103803952)
                // 邮件附件
                File file = new File(pathname);
                FileSystemResource fileSystemResource = new FileSystemResource(file);
                mimeMessageHelper.addAttachment(file.getName(), fileSystemResource);
                delPaths.add(pathname);
            }


            // 发送邮件
            mailSender.send(mimeMessage);
            delPaths.forEach(s -> {
                // 删除文件
                FileUtils.del(s);
            });
        } catch (SMTPAddressFailedException e) {
            log.error("邮件发送失败,邮箱地址错误,检查邮箱输入是否有误 ex={}", e.getMessage(), e);
        } catch (MessagingException e) {
            log.error("邮件发送失败 ex={}", e.getMessage(), e);
        }
        log.info("邮件发送成功");
    }
}

Send2EmailDTO .java

import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotNull;
import java.util.Map;

/**
 * @desc 发送邮件
 * @com 
 * @Author tanzhiming(Jruoning) 2019/11/12 15:29
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class Send2EmailDTO {

    /** 邮件主题 */
    @NotNull(message = "邮件主题不能为空")
    private String subject;
    /** 接收邮箱 */
    @NotNull(message = "收件邮箱不能为空")
    private String to;
    /** 收件人名称 */
    private String toName;
    /** oss的文件访问路径(邮件附件) */
    private String[] ossFilePath;
    /** 邮件正文 */
    private String text;
    /** 操作用户id */
    @NotNull(message = "操作用户id不能为空")
    private String currentUserId;
    /** 操作用户名称 */
    @NotNull(message = "操作用户名称不能为空")
    private String currentUserName;
}

实际项目中,在发送邮件的过程中会记录邮件发送记录及邮件附件等信息,这里呢我就没有把代码贴出来了,根据需要,自行添加。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!