美文网首页
springboot 发送邮箱附件遇见的奇葩事

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

作者: 进击的奥莉 | 来源:发表于2021-06-28 19:27 被阅读0次

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

    1. 开启邮箱授权码

    • 开启QQ授权码


      开启QQ授权码.png
    • 开启网易授权码


      开启网易授权码.png
    • 开启企业邮箱授权码
      开启企业邮箱授权码1.png
      开启企业邮箱授权码2.png
      注:修改完一定记得点击保存修改,不然不生效哈

    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尝试一下

    相关文章

      网友评论

          本文标题:springboot 发送邮箱附件遇见的奇葩事

          本文链接:https://www.haomeiwen.com/subject/hsnqultx.html