SpringBoot集成网易企业邮箱,亲测可用

本文档详细介绍了如何使用SpringBoot配置并实现邮件服务,包括引入依赖、配置application.yml、创建配置类以及具体的服务实现。邮件服务涉及SMTP的SSL端口994,确保其开启以避免超时。邮件内容可以是纯文本或HTML,并支持附件和模板渲染,同时通过Redis保证幂等性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:

服务器需要打开994的端口。不然会超时。

第一步

引入依赖。

<!-- SpringBoot——邮件服务 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

第二步

配置application.yml文件

spring:
    ##邮件服务
    mail:
      host: smtphz.qiye.163.com
      username: 你的邮箱
      password: 你的授权码
      senderName: 你的邮箱
      default-encoding: utf-8
      properties:
        mail:
          smtp:
            ssl:
              enable: true
            auth: true
      port: 994

第三步

增加配置类。

package com.penghu.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author :Mall
 */
@Configuration
@Data
public class EmailConfig {
    @Value("${spring.mail.senderName}")
    private String senderName;
}

第四步

实现类。

package com.penghu.service.email;

import com.penghu.config.EmailConfig;
import com.penghu.dao.email.EmailSendlogMapper;
import com.penghu.entity.email.EmailSendlog;
import com.penghu.utils.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import javax.annotation.Resource;
import javax.mail.internet.MimeMessage;
import java.time.Duration;

/**
 * @author :Mall
 * @description : 邮件发送服务层实现
 */
@Service
public class EmailService {
    // 日志
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    // Redis对象,主要用于保证幂等性
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // Email发送对象
    @Resource
    private JavaMailSender javaMailSender;

    // template模板
    @Autowired
    private SpringTemplateEngine templateEngine;

    // Email邮件配置
    @Autowired
    private EmailConfig emailConfig;


    /**
     * 发送普通文本内容
     *
     * @param to       发送给谁
     * @param title    标题
     * @param content  内容
     * @param identity 唯一标识
     * @return
     */
    public Result<Object> sendText(String to, String title, String content, MultipartFile file, String identity) {
        // 用redis的setNx操作,保证幂等性
        Result<Object> result = new Result<Object>();
        if (stringRedisTemplate.opsForValue().setIfAbsent(identity + "Text", to, Duration.ofMinutes(5))) {
            EmailSendlog emailSendlog = new EmailSendlog();
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, file != null);

                //邮件的标题
                messageHelper.setSubject(title);
                messageHelper.setFrom(emailConfig.getSenderName());
                //邮件接收者(可发送多个)
                String[] toArray = to.split("[,]");
                messageHelper.setTo(toArray);

                //邮件的内容,不是Html
                messageHelper.setText(content, false);
                //添加附件
                if (file != null)
                    messageHelper.addAttachment(file.getOriginalFilename(), file);

                javaMailSender.send(messageHelper.getMimeMessage());
                logger.info(identity + ":" + to + "发送成功");
                return result;
            } catch (Exception e) {
                logger.info(e.getMessage());
                result.success("发送失败");
                return result;
            } finally {
                // 发送成功后,删除key
                stringRedisTemplate.delete(identity + "Text");
            }
        } else {
            result.error("发送中,请稍后");
            return result;
        }
    }

    /**
     * 发送Html内容
     *
     * @param to       发送给谁
     * @param title    标题
     * @param content  内容
     * @param identity 唯一标识
     * @return
     */
    public Result<Object> sendHtml(String to, String title, String content, MultipartFile file, String identity) {
        Result<Object> result = new Result<>();
        // 用redis的setNx操作,保证幂等性
        if (stringRedisTemplate.opsForValue().setIfAbsent(identity + "Html", to, Duration.ofMinutes(5))) {
            EmailSendlog emailSendlog = new EmailSendlog();
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, file != null);
                //邮件的标题
                messageHelper.setSubject(title);
                messageHelper.setFrom(emailConfig.getSenderName());
                //邮件接收者(可发送多个)
                String[] toArray = to.split("[,]");
                messageHelper.setTo(toArray);

                //邮件的内容
                messageHelper.setText(content, true);
                //添加附件
                if (file != null) {
                    messageHelper.addAttachment(file.getOriginalFilename(), file);
                }

                javaMailSender.send(messageHelper.getMimeMessage());
                logger.info(identity + ":" + to + "发送成功");
                result.success("发送成功");
                return result;
            } catch (Exception e) {
                e.printStackTrace();
                logger.info(e.getMessage());
                result.success("发送失败");
                return result;
            } finally {
                // 发送成功后,删除key
                stringRedisTemplate.delete(identity + "Html");
            }
        } else {
            result.success("发送中,请稍后");
            return result;
        }
    }

    /**
     * 发送模板1内容
     *
     * @param to       发送给谁
     * @param title    标题
     * @param content  内容
     * @param identity 唯一标识
     * @return
     */
    public Result<Object> sendTemplate1(String to, String title, String content, MultipartFile file, String identity) {
        Result<Object> result = new Result<>();
        // 用redis的setNx操作,保证幂等性
        if (stringRedisTemplate.opsForValue().setIfAbsent(identity + "Html", to, Duration.ofMinutes(5))) {
            EmailSendlog emailSendlog = new EmailSendlog();
            try {
                MimeMessage mimeMessage = javaMailSender.createMimeMessage();
                MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, file != null);
                //邮件的标题
                messageHelper.setSubject(title);


                messageHelper.setFrom(emailConfig.getSenderName());
                //邮件接收者(可发送多个)
                String[] toArray = to.split("[,]");
                messageHelper.setTo(toArray);


                //邮件的内容,利用 Thymeleaf 模板构建 html 文本
                Context ctx = new Context();
                ctx.setVariable("title", title);
                ctx.setVariable("content", content);
                String emailText = templateEngine.process("template1", ctx);
                //发送内容
                messageHelper.setText(emailText, true);
                //添加附件
                if (file != null) {
                    messageHelper.addAttachment(file.getOriginalFilename(), file);
                }
                javaMailSender.send(messageHelper.getMimeMessage());
                logger.info(identity + ":" + to + "发送成功");

                result.success("发送成功");
                return result;
            } catch (Exception e) {
                logger.info(e.getMessage());
                result.success("发送失败");
                return result;
            } finally {
                // 发送成功后,删除key
                stringRedisTemplate.delete(identity + "Html");
            }
        } else {
            result.success("发送中,请稍后");
            return result;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁蛋的铁,铁蛋的蛋

留一杯咖啡钱给作者吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值