Spring boot尝试实现简单的发送邮件功能

一、依赖引入

1、maven

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

2、gradle

compile("org.springframework.boot:spring-boot-starter-mail")

二、spring boot配置文件(这里用的是yml方式,层级更加明确)

spring:
  mail:
    host: smtp.126.com #主机地址,这里已126邮箱为例(网易企业邮箱:smtp.ym.163.com)
    username: *** #发件人邮箱地址
    password: *** #这里不是邮箱登录密码,而是授权码,可以登录邮箱在设置里面获取授权码(企业邮箱可能是邮箱密码)
    properties:
      mail.smtp.socketFactory.fallback : true
      mail.smtp.starttls.enable: true
      mail.smtp.starttls.required: true

三、工具类编写

第一种写法:

@Component
public class MailUtil {
    @Autowired
    private JavaMailSender mailSender;

    //获取yml配置文件的配置信息
    @Value("${spring.mail.username}")
    private String sender;


    /**
     * 发送邮件(不带附件)
     * @param target 收件人邮箱地址
     * @param subject 邮件主题
     * @param toDoer 邮件正文标题
     * @param contexts 邮件内容
     */
    public void sendOneEmail(String target, String subject, String toDoer, String[] contexts) {
        SimpleMailMessage message = new SimpleMailMessage();
        //发件人
        message.setFrom(sender);
        //收件人
        message.setTo(target);
        //设置邮件主题
        message.setSubject(subject);
        //设置邮件内容
        StringBuilder sb = new StringBuilder();
        if (!StringUtils.isEmpty(toDoer)) {
            sb.append(toDoer);
        }
        if (contexts != null && contexts.length >0) {
            for (String context : contexts) {
                if (!StringUtils.isEmpty(context)) {
                    //换行
                    sb.append(System.getProperty("line.separator"))
                            .append(context);
                }
            }
        }
        message.setText(sb.toString());
        //发送邮件
        mailSender.send(message);
    }

    /**
     * 发送邮件(带附件)
     * @param target 收件人邮箱地址
     * @param subject 邮件主题
     * @param toDoer 邮件正文标题
     * @param contexts 邮件内容
     * @param fileArray 附件路径数组
     */
    public void sendFileEmail(String target, String subject, String toDoer, String[] contexts, String[] fileArray) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message,true);
            //发件人
            helper.setFrom(sender);
            //收件人
            helper.setTo(target);
            //设置邮件主题
            helper.setSubject(subject);
            //设置邮件内容
            StringBuilder sb = new StringBuilder();
            if (!StringUtils.isEmpty(toDoer)) {
                sb.append(toDoer);
            }
            if (contexts != null && contexts.length >0) {
                for (String context : contexts) {
                    if (!StringUtils.isEmpty(context)) {
                        //换行
                        sb.append(System.getProperty("line.separator"))
                                .append(context);
                    }
                }
            }
            helper.setText(sb.toString());
            //邮件附件
            //验证文件数据是否为空
            if(null != fileArray){
                FileSystemResource file=null;
                for (int i = 0; i < fileArray.length; i++) {
                    //添加附件
                    file=new FileSystemResource(fileArray[i]);
                    helper.addAttachment(fileArray[i].substring(fileArray[i].lastIndexOf(File.separator)), file);
                }
            }
            //发送邮件
            mailSender.send(message);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

注意:

1、工具类也是需要交给spring管理。需要在工具类上加上@Component注解。

2、JavaMailSender 变量加上@Autowired,将它注入进来,不可以使用static修饰,如果想写静态工具类方法,尝试以下第二种写法。

3、在Application.java启动类上面加上@ServletComponentScan(basePackages = {"com.demo"})注解,该工具类要在改扫描包下面。

第二种写法:

@Component
public class MailUtil {
    @Autowired
    private JavaMailSender mailSender;

    public static MailUtil mailUtil;

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

    @PostConstruct
    public void init() {
        mailUtil = this;
        mailUtil.mailSender = this.mailSender;
        mailUtil.sender = this.sender;
    }

    /**
     * 发送邮件(不带附件)
     * @param target 收件人邮箱地址
     * @param subject 邮件主题
     * @param toDoer 邮件正文标题
     * @param contexts 邮件内容
     */
    public static void sendOneEmail(String target, String subject, String toDoer, String[] contexts) {
        SimpleMailMessage message = new SimpleMailMessage();
        //发件人
        message.setFrom(mailUtil.sender);
        //收件人
        message.setTo(target);
        //设置邮件主题
        message.setSubject(subject);
        //设置邮件内容
        StringBuilder sb = new StringBuilder();
        if (!StringUtils.isEmpty(toDoer)) {
            sb.append(toDoer);
        }
        if (contexts != null && contexts.length >0) {
            for (String context : contexts) {
                if (!StringUtils.isEmpty(context)) {
                    //换行
                    sb.append(System.getProperty("line.separator"))
                            .append(context);
                }
            }
        }
        message.setText(sb.toString());
        //发送邮件
        mailUtil.mailSender.send(message);
    }

    /**
     * 发送邮件(带附件)
     * @param target 收件人邮箱地址
     * @param subject 邮件主题
     * @param toDoer 邮件正文标题
     * @param contexts 邮件内容
     * @param fileArray 附件路径数组
     */
    public static void sendFileEmail(String target, String subject, String toDoer, String[] contexts, String[] fileArray) {
        MimeMessage message = mailUtil.mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message,true);
            //发件人
            helper.setFrom(mailUtil.sender);
            //收件人
            helper.setTo(target);
            //设置邮件主题
            helper.setSubject(subject);
            //设置邮件内容
            StringBuilder sb = new StringBuilder();
            if (!StringUtils.isEmpty(toDoer)) {
                sb.append(toDoer);
            }
            if (contexts != null && contexts.length >0) {
                for (String context : contexts) {
                    if (!StringUtils.isEmpty(context)) {
                        //换行
                        sb.append(System.getProperty("line.separator"))
                                .append(context);
                    }
                }
            }
            helper.setText(sb.toString());
            //邮件附件
            //验证文件数据是否为空
            if(null != fileArray){
                FileSystemResource file=null;
                for (int i = 0; i < fileArray.length; i++) {
                    //添加附件
                    file=new FileSystemResource(fileArray[i]);
                    helper.addAttachment(fileArray[i].substring(fileArray[i].lastIndexOf(File.separator)), file);
                }
            }
            //发送邮件
            mailUtil.mailSender.send(message);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

四、工具类调用实现发送邮件

1、第一种工具类调用方式:

由于方法不是静态的,但是也不能直接用new对象调用,这样不会被spring容器创建bean,会报空指针异常。所以需要在调用的类上将该工具类注入进来

@Resource
private MailUtil mailUtil;

调用

//邮件内容
String[] strs = new String[]{"云想衣裳花想容","春风拂槛露华浓"};
//附件地址数组
String [] fileArray={"F:\\360MoveData\\Users\\admin\\Desktop\\mailView.txt","F:\\360MoveData\\Users\\admin\\Desktop\\a.jpg"};
//发送不带附件的
mailUtil.sendOneEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs);
//发送带附件的
mailUtil.sendFileEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs, fileArray);

2、第二种工具类调用方式:

这种方式由于其中的方法是静态的,直接可以类名.方法调用实现

//邮件内容
String[] strs = new String[]{"云想衣裳花想容","春风拂槛露华浓"};
//附件地址数组
String [] fileArray={"F:\\360MoveData\\Users\\admin\\Desktop\\mailView.txt","F:\\360MoveData\\Users\\admin\\Desktop\\a.jpg"};
//发送不带附件的
MailUtil.sendOneEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs);
//发送带附件的
MailUtil.sendFileEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs, fileArray);

五、测试效果

1、不带附件

2、带附件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值