springboot 发送邮箱附件遇见的奇葩事

2021-06-28  本文已影响0人  进击的奥莉

今天,老板突然接到一个需求,要求给客户发邮件,并将线上文件作为附件本以为是个很easy的功能,想着两个小时绝对搞定,没想到花费了我两天时间,还请教了高手。
在网上搜索,发现没人提起我所遇见的问题,今天记录一下,希望帮到有需要的人。

1. 开启邮箱授权码

2. 接下来进入springboot 代码书写阶段,pom.xml 引入依赖

因为是前后端分离,所以只需要引入一个依赖,且此依赖没有版本号
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

3. yml文件中配置email信息

mail要紧挨着spring,否则配置不生效
application.yml

spring:
  mail:      #这个mail一定要紧挨spring,否则配置可能会无效
    host: smtp.exmail.qq.com
    port: 587   # 我设置465无效,企业邮箱改为587才生效
    protocol: smtp  # 和邮箱设置里保持一致
    username: test1111@qiye.com
    password: yjFCZ****8jTzfPf  # 授权码,不是登录密码哟
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

4. 发送附件代码

  /**
     * 发送带附件的邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @param filePath 附件
     */
  public void sendAttachmentsMail(String to, String subject, String content, String filePath) {

        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,true);
            //携带远程地址附件
            URL url  = new URL(filePath);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            InputStream is = conn.getInputStream();
            String filename = subject.substring(0,subject.length()-10).concat(".pdf");
            messageHelper.addAttachment(filename, new ByteArrayResource(IOUtils.toByteArray(is)));
            // 携带本地附件
            //FileSystemResource file = new FileSystemResource(filePath);
            //String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            //messageHelper.addAttachment(fileName,file);
            javaMailSender.send(message);
            log.info("邮件加附件发送成功!");
        } catch (MessagingException | javax.mail.MessagingException e) {
            log.error("发送失败:"+e);
        }catch (FileNotFoundException e2) {
            log.error("发送失败:"+e2);
        }catch (Exception  e3) {
            log.error("发送失败:"+e3);
            e3.printStackTrace();
        }
    }

** 大功告成 **
值得注意的是:

  1. yml里面的mail配置要紧挨着spring写,我是因为写在最后面一直读取不到配置,怎么调试都不行
    2.因为是附件,需要在yml里面添加上传文件大小的限制
spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

3.如果邮箱端口号设置465无效,修改为587尝试一下

上一篇下一篇

猜你喜欢

热点阅读