.使用javax.mail, spring的JavaMailSender,springboot发送邮件

邮件的基本信息类

@DatapublicclassJavaMailInfo{/**

    * 使用java mail 发送邮件 邮件的协议有SMTP POP IMAP MIME 等 协议具体内容可自行百度  SMTP 为简单邮件传输协议 比较常用

    */// 邮件服务器地址privateString mailSeverHost;// 邮件服务器端口privateString mailServerPort;// 邮件发送者privateString fromAddress;// 发送者用户名privateString userName;// 发送者密码privateString password;// 收件人地址privateString toAddress;// 邮件主题privateString subject;// 邮件内容privateString content;// 图片地址集合privateList photoUrlList;// 附件地址集合privateList attachList;/**    * 获取邮件会话属性 ,对邮件Session进行设置 此部分的内容可以通过加载配置文件的方式进行设置    *@return*/publicPropertiesgetProperties(){      Properties properties =newProperties();      properties.put("mail.transport.protocol","smtp");// 连接协议properties.put("mail.smtp.host",this.mailSeverHost);// 主机名properties.put("mail.smtp.port",this.mailServerPort);// 端口号properties.put("mail.smtp.auth","true");//设置smtp是否需要认证properties.put("mail.smtp.ssl.enable","true");// 设置是否使用ssl安全连接 ---一般都使用properties.put("mail.debug","true");// 设置是否显示debug信息 true 会在控制台显示相关信息properties.put("mail.smtp.timeout",20000);// 超时时间returnproperties;  }}

权限认证类

@Data@NoArgsConstructor@AllArgsConstructorpublicclassMyJavaMailAuthenticatorextendsAuthenticator{privateString userName =null;privateString password =null;/**

    * 此类用于储存授权时使用的用户名和密码 用于构建邮件Session对象 便于需要认证时邮件Session知道需要使用哪个类验证

    * 以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器

    * 自定义的类需要继承Authenticator类 重写getPasswordAuthentication() 方法 注意导包 需要使用javax.mail包下的相关类

    */@OverrideprotectedPasswordAuthenticationgetPasswordAuthentication(){returnnewPasswordAuthentication(this.userName,this.password);  }}

发送邮件工具类

publicclassJavaMailSendUtils{/**    * 实际使用    *@paramargs    */publicstaticvoidmain(String[] args){      JavaMailInfo javaMailInfo =newJavaMailInfo();      javaMailInfo.setMailSeverHost("smtp.qq.com");      javaMailInfo.setMailServerPort("465");// 465或587(使用ssl)javaMailInfo.setFromAddress("发件人");      javaMailInfo.setUserName("您邮箱用户名");      javaMailInfo.setPassword("您邮箱授权码");// 密码需要使用对应邮箱的授权码授权码javaMailInfo.setToAddress("收件人");      javaMailInfo.setSubject("邮件主题");      javaMailInfo.setContent("邮件内容");      List photoUrlList =newArrayList<>();      photoUrlList.add("图片1");      photoUrlList.add("图片2");      javaMailInfo.setPhotoUrlList(photoUrlList);      List attachList =newArrayList<>();      attachList.add("附件1");      attachList.add("附件2");      javaMailInfo.setAttachList(attachList);      sendJavaMail(javaMailInfo);  }/**

    * 此工具类可根据邮件基本信息进行邮件的发送

    *//**    * 发送邮件方法    *@paramjavaMailInfo    *@return*/publicstaticbooleansendJavaMail(JavaMailInfo javaMailInfo){// 获取邮件session的相关配置参数Properties properties = javaMailInfo.getProperties();// 创建授权验证类MyJavaMailAuthenticator myJavaMailAuthenticator =newMyJavaMailAuthenticator();      myJavaMailAuthenticator.setUserName(javaMailInfo.getUserName());      myJavaMailAuthenticator.setPassword(javaMailInfo.getPassword());// 构建邮件Session会话对象 带不带default均可 查看源码可知 带default的是获取该类的属性 不带获取的是新创建的Session mailSession = Session.getDefaultInstance(properties, myJavaMailAuthenticator);// 开启debug properties中设置了此处就无须设置// mailSession.setDebug(true);// 邮差对象 也可使用静态方法进行发送Transport transport =null;try{// 获取消息 也就是发送的内容// Message message = createSimpleMail(mailSession, javaMailInfo);// Message message = createImageMail(mailSession, javaMailInfo);// Message message = createAttachMail(mailSession, javaMailInfo);Message message = createPhotoAndAttachMail(mailSession, javaMailInfo);// 设置规范 具体是什么规范呢? 固定写法MailcapCommandMap defaultCommandMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();          defaultCommandMap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");          defaultCommandMap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");          defaultCommandMap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");          defaultCommandMap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");          defaultCommandMap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");          CommandMap.setDefaultCommandMap(defaultCommandMap);// 发送邮件 Transport.send(message); 或者获取Transport对象发送transport = mailSession.getTransport();          transport.connect(javaMailInfo.getUserName(), javaMailInfo.getUserName());          transport.sendMessage(message, message.getAllRecipients());          System.out.println("邮件发送成功");returntrue;      }catch(MessagingException e) {          e.printStackTrace();          System.out.println("邮件发送失败");returnfalse;      }finally{if(null!= transport) {try{                  transport.close();              }catch(MessagingException e) {                  e.printStackTrace();              }          }      }  }/**    * 根据邮件Session和邮件信息创建邮件内容(文本类 html)    *@parammailSession    *@paramjavaMailInfo    *@return*/privatestaticMessagecreateSimpleMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{/**

        * Message是一 个抽象类,我们使用MimeMessage这个子类, 该类是使用MIME类型、MIME信息头的 邮箱信息

        * 信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用

        */// 根据邮件session创建消息对象MimeMessage mimeMessage =newMimeMessage(mailSession);// 设置发件人 setFrom 和 setReplyTo 均可 有多个发件人使用 addFroms(Address[] addresses)mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress()));// 设置收件人 收件人类型 Message.RecipientType.TO(接受者) Message.RecipientType.CC(抄送着) Message.RecipientType.BCC(密送者)// setRecipients(Message.RecipientType var1, Address[] var2) 设置多个收件人mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress()));// 设置标题mimeMessage.setSubject(javaMailInfo.getSubject(),"text/plain;charset=utf-8");// 设置内容 是文本可直接使用setText()mimeMessage.setContent(javaMailInfo.getContent(),"text/html;charset=utf-8");// 设置发送时间mimeMessage.setSentDate(newDate());      mimeMessage.saveChanges();returnmimeMessage;  }/**    * 根据邮件Session和邮件信息创建邮件内容(图片类 可多个图片)    *@parammailSession    *@paramjavaMailInfo    *@return*/privatestaticMessagecreateImageMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{/**

        * Message表示一个邮件,messgaes.getContent()返回一个Multipart对象。一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)

        * Multipart的content-type

        * 总体来说,MIME消息由消息头和消息体两大部分组成。现在我们关注的是MIME邮件,因此在以下的讨论中姑且称“消息”为“邮件”。

        * 邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。

        * 域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。

        * 邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。有时也会出现的multipart类型,是MIME邮件的精髓。

        * 邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。

        * multipart/mixed:附件。

        * multipart/related:内嵌资源。

        * multipart/alternative:纯文本与超文本共存。

        */MimeMessage mimeMessage =newMimeMessage(mailSession);      mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress()));      mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress()));      mimeMessage.setSubject(javaMailInfo.getSubject(),"text/plain;charset=utf-8");      List photoUrlList = javaMailInfo.getPhotoUrlList();// 创建消息体 以下方式每个图片都有一个标题MimeMultipart mimeMultipart =newMimeMultipart();if(!CollectionUtils.isEmpty(photoUrlList)) {for(String photoUrl : photoUrlList) {              MimeBodyPart text =newMimeBodyPart();// 设置图片标题 注意img标签的引用位置 用cid:开头String cid = UUID.randomUUID().toString();              text.setContent(javaMailInfo.getContent() +"
","text/html;charset=utf-8");// 使用数据处理器处理图片MimeBodyPart image =newMimeBodyPart();              image.setDataHandler(newDataHandler(newFileDataSource(photoUrl)));              image.setContentID(cid);// 描述正文和图片的关系MimeMultipart photo =newMimeMultipart();              photo.addBodyPart(text);              photo.addBodyPart(image);              photo.setSubType("related");              MimeBodyPart mimeBodyPart =newMimeBodyPart();              mimeBodyPart.setContent(photo);// 将图片放入body中mimeMultipart.addBodyPart(mimeBodyPart);          }      }/*// 以下方式所有图片公用一个标题

      MimeMultipart photo = new MimeMultipart();

      MimeBodyPart text = new MimeBodyPart();

      photo.addBodyPart(text);

      StringBuilder textContent = new StringBuilder(javaMailInfo.getContent());

      if (!CollectionUtils.isEmpty(photoUrlList)) {

          for (String photoUrl : photoUrlList) {

              // 设置图片标题 注意img标签的引用位置 用cid:开头

              String cid = UUID.randomUUID().toString();

              textContent.append("
");

              // 使用数据处理器处理图片

              MimeBodyPart image = new MimeBodyPart();

              image.setDataHandler(new DataHandler(new FileDataSource(photoUrl)));

              image.setContentID(cid);

              // 描述正文和图片的关系

              photo.addBodyPart(image);

          }

          photo.setSubType("related");

      }

      text.setContent(textContent.toString(), "text/html;charset=utf-8");*/// 设置消息体mimeMessage.setContent(mimeMultipart);// mimeMessage.setContent(photo);mimeMessage.setSentDate(newDate());      mimeMessage.saveChanges();returnmimeMessage;  }/**    * 根据邮件Session和邮件信息创建邮件内容(附件类 可多个附件)    *@parammailSession    *@paramjavaMailInfo    *@return*/privatestaticMessagecreateAttachMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{      MimeMessage mimeMessage =newMimeMessage(mailSession);      mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress()));      mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress()));      mimeMessage.setSubject(javaMailInfo.getSubject(),"text/plain;charset=utf-8");      List attachList = javaMailInfo.getAttachList();// 创建消息体MimeMultipart mimeMultipart =newMimeMultipart();      MimeBodyPart text =newMimeBodyPart();      text.setContent(javaMailInfo.getSubject(),"text/html;charset=utf-8");      mimeMultipart.addBodyPart(text);if(!CollectionUtils.isEmpty(attachList)) {for(String attach : attachList) {// 创建附件MimeBodyPart mimeBodyPart =newMimeBodyPart();              DataHandler dataHandler =newDataHandler(newFileDataSource(attach));              mimeBodyPart.setDataHandler(dataHandler);              mimeBodyPart.setFileName(dataHandler.getName());// 加入最外面的容器mimeMultipart.addBodyPart(mimeBodyPart);          }// 描述关系mimeMultipart.setSubType("mixed");      }      mimeMessage.setContent(mimeMultipart);      mimeMessage.setSentDate(newDate());      mimeMessage.saveChanges();returnmimeMessage;  }/**    * 根据邮件Session和邮件信息创建邮件内容(多图片 多附件)    *@parammailSession    *@paramjavaMailInfo    *@return*/privatestaticMessagecreatePhotoAndAttachMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{      MimeMessage mimeMessage =newMimeMessage(mailSession);      mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress()));      mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress()));      List photoUrlList = javaMailInfo.getPhotoUrlList();// 获取所有的图片 公用一个主题MimeMultipart photo =newMimeMultipart();      MimeBodyPart text =newMimeBodyPart();      photo.addBodyPart(text);      StringBuilder textContent =newStringBuilder(javaMailInfo.getContent());if(!CollectionUtils.isEmpty(photoUrlList)) {for(String photoUrl : photoUrlList) {// 设置图片标题 注意img标签的引用位置 用cid:开头String cid = UUID.randomUUID().toString();              textContent.append("
");// 使用数据处理器处理图片MimeBodyPart image =newMimeBodyPart();              image.setDataHandler(newDataHandler(newFileDataSource(photoUrl)));              image.setContentID(cid);// 描述正文和图片的关系photo.addBodyPart(image);          }          photo.setSubType("related");      }      text.setContent(textContent.toString(),"text/html;charset=utf-8");// 将图片包裹成一个body 作为 其内容MimeBodyPart content =newMimeBodyPart();      content.setContent(photo);// 获取所有的附件List attachList = javaMailInfo.getAttachList();      MimeMultipart attach =newMimeMultipart();if(!CollectionUtils.isEmpty(attachList)) {for(String attachUrl : attachList) {// 创建附件MimeBodyPart mimeBodyPart =newMimeBodyPart();              DataHandler dataHandler =newDataHandler(newFileDataSource(attachUrl));              mimeBodyPart.setDataHandler(dataHandler);              mimeBodyPart.setFileName(dataHandler.getName());// 加入最外面的容器attach.addBodyPart(mimeBodyPart);          }      }// 将图片body 和 附件组合attach.addBodyPart(content);      attach.setSubType("mixed");      mimeMessage.setContent(attach);      mimeMessage.setSentDate(newDate());      mimeMessage.saveChanges();returnmimeMessage;  }}

三、使用spring的JavaMailSender发送邮件(简单,带图片,带附件,带图片和附件,freemarker模板)

spring提供的JavaMailSender是对原始的javax.mail进行了简化

再其使用过程中可以注册到spring容器中,也可不用注册

导入依赖

javax.mail的依赖包org.springframeworkspring-context-support

邮件的基本信息类

@DatapublicclassJavaMailSenderInfo{// 收件人地址privateString toAddress;// 邮件主题privateString subject;// 邮件内容privateString content;// 是否是html 注意字段boolean类型 不要用is开头 idea会生成get,set方法会进行优化 isHtml -> isHtml(),getHtml() -- html -> isHtml(),getHtml()privatebooleanhtml =false;// 图片地址集合privateList photoList;// 附件地址集合privateList attachList;}

准备mail.propertise配置文件(也就是设置会话的属性),文件放在resource目录下

#传输协议mail.transport.protocol=smtp#服务器主机名mail.smtp.host=smtp.qq.com#服务器端口号 465或587(使用ssl)mail.smtp.port=465#是否进行用户名密码校验 配置了否 就不能配置 用户名和密码 否则会去获取用户名密码进行验证mail.smtp.auth=true#设置是否使用ssl安全连接 ---一般都使用mail.smtp.ssl.enable=true#设置是否显示debug信息 true 会在控制台显示相关信息mail.debug=true#设置超时时间mail.smtp.timeout=20000#编码格式mail.smtp.defaultEncoding=utf-8#你的邮箱地址[email protected]#你的授权码(第三方使用时代替密码)mail.smtp.password=xxxxxx

加载配置文件,初始化JavaMailSender

publicclassInitJavaMailSender{/**    * 此类的作用是加载配置文件来创建JavaMailSender对象  JavaMailSenderImpl是该接口的实现类    * 因此我们需要对JavaMailSenderImpl进行配置 在spring的环境下 我们可以使用加载配置文件的方式 或者    * 在spring配置文件中直接配置该bean(由spring托管)使用时@Autowired直接注入即可    *     *     *     *     *     *     *     * ${mail.smtp.auth}    * ${mail.smtp.timeout}    *    ...    *     *     *     * 本次采用加载配置文件的方式    * 由spring提供 其底层使用的仍然是javax.mail进行邮件的发送    * JavaMailSenderImpl 依赖javax.mail 和 spring-context-support包    */// 传输协议privatestaticString protocol;// 服务器主机名privatestaticString host;// 服务器端口号privatestaticString port;// 是否进行用户名密码校验privatestaticString auth;// 设置是否使用ssl安全连接privatestaticString enableSSL;// 设置是否显示debug信息privatestaticString debug;// 超时时间privatestaticString timeout;// 编码格式privatestaticString defaultEncoding;// 邮箱地址publicstaticString username;// 授权码privatestaticString password;privatestaticJavaMailSenderImpl javaMailSenderImpl;static{      init();  }privatestaticvoidinit(){// 加载配置文件Properties properties =newProperties();      InputStream resourceAsStream = JavaMailSender.class.getClassLoader().getResourceAsStream("mail.properties");try{          properties.load(resourceAsStream);          protocol = properties.getProperty("mail.transport.protocol");          host = properties.getProperty("mail.smtp.host");          port = properties.getProperty("mail.smtp.port");          auth = properties.getProperty("mail.smtp.auth");          enableSSL = properties.getProperty("mail.smtp.ssl.enable");          debug = properties.getProperty("mail.debug");          timeout = properties.getProperty("mail.smtp.timeout");          defaultEncoding = properties.getProperty("mail.smtp.defaultEncoding");          username = properties.getProperty("mail.smtp.username");          password = properties.getProperty("mail.smtp.password");          System.out.println("mail.properties加载成功");      }catch(IOException e) {          e.printStackTrace();          System.out.println("mail.properties加载失败");      }finally{if(null!= resourceAsStream) {try{                  resourceAsStream.close();              }catch(IOException e) {                  e.printStackTrace();              }          }      }  }/**    * 使用单例获取JavaMailSender 双重检查既保证的线程安全 又保证了效率 又能起到延迟加载的作用    *@return*/publicstaticJavaMailSendergetJavaMailSender(){if(null== javaMailSenderImpl) {synchronized(InitJavaMailSender.class) {if(null== javaMailSenderImpl) {                  javaMailSenderImpl =newJavaMailSenderImpl();                  javaMailSenderImpl.setProtocol(protocol);                  javaMailSenderImpl.setHost(host);                  javaMailSenderImpl.setPort(Integer.parseInt(port));                  javaMailSenderImpl.setDefaultEncoding(defaultEncoding);                  javaMailSenderImpl.setUsername(username);                  javaMailSenderImpl.setPassword(password);                  Properties properties =newProperties();                  properties.setProperty("mail.smtp.auth", auth);                  properties.setProperty("mail.smtp.ssl.enable", enableSSL);                  properties.setProperty("mail.debug", debug);                  properties.setProperty("mail.smtp.timeout", timeout);                  javaMailSenderImpl.setJavaMailProperties(properties);              }          }      }returnjavaMailSenderImpl;  }}

邮件发送工具类

publicclassJavaMailSenderUtils{/**    * 测试发送邮件 实际中可以在service中使用(若使用的spring配置的方式创建JavaMailSender,则需注入使用)    * 此处为方便使用main方法    *@paramargs    */publicstaticvoidmain(String[] args){      JavaMailSenderInfo javaMailSenderInfo =newJavaMailSenderInfo();      javaMailSenderInfo.setToAddress("发件人");      javaMailSenderInfo.setSubject("邮件主题");      javaMailSenderInfo.setContent("邮件内容");      javaMailSenderInfo.setHtml(true);      List list =newArrayList<>();      list.add("图片1");// list.add("图片2");// list.add("图片3");// list.add("图片4");javaMailSenderInfo.setPhotoList(list);      javaMailSenderInfo.setAttachList(list);// JavaMailSenderUtils.sendSimpleMail(javaMailSenderInfo);JavaMailSenderUtils.sendPhotoMail(javaMailSenderInfo);// JavaMailSenderUtils.sendAttacheMail(javaMailSenderInfo);// JavaMailSenderUtils.sendPhotoAndAttacheMail(javaMailSenderInfo);}privatestaticfinalJavaMailSender javaMailSender = InitJavaMailSender.getJavaMailSender();privatestaticfinalString htmlStartStr ="";privatestaticfinalString htmlEndStr ="";/**    * 发送简单邮件 文本 html    *@paramjavaMailSenderInfo    *@return*/publicstaticbooleansendSimpleMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage();      MimeMessageHelper mimeMessageHelper =null;try{// 创建消息辅助器 参数二 为true时为多组件 html 等mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8");// 设置公共字段setMailCommonField(mimeMessageHelper, javaMailSenderInfo);// 文本内容 可指定是否是htmlmimeMessageHelper.setText(javaMailSenderInfo.getContent(), javaMailSenderInfo.isHtml());          javaMailSender.send(mimeMessage);          System.out.println("简单邮件发送成功");returntrue;      }catch(MessagingException e) {          e.printStackTrace();          System.out.println("简单邮件发送失败");returnfalse;      }  }/**    * 发送带图片的邮件    *@paramjavaMailSenderInfo    *@return*/publicstaticbooleansendPhotoMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage();      MimeMessageHelper mimeMessageHelper =null;try{          mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8");          setMailCommonField(mimeMessageHelper, javaMailSenderInfo);          List photoList = javaMailSenderInfo.getPhotoList();// html内容StringBuilder text =newStringBuilder(htmlStartStr);          text.append(javaMailSenderInfo.getContent());if(!CollectionUtils.isEmpty(photoList)) {for(String photo : photoList) {// 每个图片创建一个标题吧 每个图片关联一个cidString cid = UUID.randomUUID().toString();                  text.append("

"+ javaMailSenderInfo.getSubject() +"


");                  mimeMessageHelper.addInline(cid,newFile(photo));              }          }// 为什么会有最后一个图片图裂不显示的问题(求大佬指点)// String cid = UUID.randomUUID().toString();// mimeMessageHelper.addInline(cid, new File(""));text.append(htmlEndStr);          mimeMessageHelper.setText(text.toString(),true);          javaMailSender.send(mimeMessage);          System.out.println("带图片的邮件发送成功");returntrue;      }catch(MessagingException e) {          e.printStackTrace();          System.out.println("带图片的邮件发送失败");returnfalse;      }  }/**    * 发送带附件的邮件    *@paramjavaMailSenderInfo    *@return*/publicstaticbooleansendAttacheMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage();      MimeMessageHelper mimeMessageHelper =null;try{          mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8");          setMailCommonField(mimeMessageHelper, javaMailSenderInfo);          List attachList = javaMailSenderInfo.getAttachList();// 邮件文本mimeMessageHelper.setText(javaMailSenderInfo.getContent(), javaMailSenderInfo.isHtml());if(!CollectionUtils.isEmpty(attachList)) {for(String attach : attachList) {// 添加附件(最后一个附件是图片也存在图裂的问题,但可下载使用,求大佬指点)FileSystemResource fileSystemResource =newFileSystemResource(attach);// 参数一为附件名称mimeMessageHelper.addAttachment(fileSystemResource.getFilename(), fileSystemResource);              }          }          javaMailSender.send(mimeMessage);          System.out.println("带附件的邮件发送成功");returntrue;      }catch(MessagingException e) {          e.printStackTrace();          System.out.println("带附件的邮件发送失败");returnfalse;      }  }/**    * 发送带图片和附件的邮件    *@paramjavaMailSenderInfo    *@return*/publicstaticbooleansendPhotoAndAttacheMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage();      MimeMessageHelper mimeMessageHelper =null;try{          mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8");          setMailCommonField(mimeMessageHelper, javaMailSenderInfo);          List photoList = javaMailSenderInfo.getPhotoList();// 放入图片和内容StringBuilder text =newStringBuilder(htmlStartStr + javaMailSenderInfo.getContent());if(!CollectionUtils.isEmpty(photoList)) {for(String photo : photoList) {                  String cid = UUID.randomUUID().toString();                  text.append("
");                  mimeMessageHelper.addInline(cid,newFile(photo));              }          }          text.append(htmlEndStr);          mimeMessageHelper.setText(text.toString(),true);// 放入附件List attachList = javaMailSenderInfo.getAttachList();if(!CollectionUtils.isEmpty(attachList)) {for(String attach : attachList) {// 添加附件FileSystemResource fileSystemResource =newFileSystemResource(attach);// 参数一为附件名称mimeMessageHelper.addAttachment(fileSystemResource.getFilename(), fileSystemResource);              }          }          javaMailSender.send(mimeMessage);          System.out.println("带图片和附件的邮件发送成功");returntrue;      }catch(MessagingException e) {          e.printStackTrace();          System.out.println("带图片和附件邮件发送失败");returnfalse;      }  }/**    * 发送由freemarker模板技术生成的邮件    *@paramjavaMailSenderInfo    *@return*/publicstaticbooleansendFreemarkerMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage();      MimeMessageHelper mimeMessageHelper =null;try{          mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8");          setMailCommonField(mimeMessageHelper, javaMailSenderInfo);/**

            * 此处没有实现采用模板技术(可自行探索)

            * 封装模板所需要的数据

            * 读取freemarker的模板文件 xxx.ftl 进行静态化,生成html形式的字符串

            * 将生成好的html字符串设置到邮件的正文中

            */javaMailSender.send(mimeMessage);          System.out.println("freemarker模板技术生成的邮件发送成功");returntrue;      }catch(MessagingException e) {          e.printStackTrace();          System.out.println("freemarker模板技术生成的邮件发送失败");returnfalse;      }  }/**    * 设置邮件的公共字段    *@parammimeMessageHelper    *@paramjavaMailSenderInfo    *@throwsMessagingException    */privatestaticvoidsetMailCommonField(MimeMessageHelper mimeMessageHelper, JavaMailSenderInfo javaMailSenderInfo)throwsMessagingException{// 发件人mimeMessageHelper.setFrom(InitJavaMailSender.username);// 收件人 多人用数组mimeMessageHelper.setTo(javaMailSenderInfo.getToAddress());// 主题mimeMessageHelper.setSubject(javaMailSenderInfo.getSubject());// 日期mimeMessageHelper.setSentDate(newDate());  }}

四、使用springboot发送邮件

使用springboot发送邮件和使用spring提供的JavaMailSender发送邮件的方式一样

在yml配置文件中配置相关的会话信息后

在service层中直接注入使用即可

导入依赖

org.springframework.bootspring-boot-starter-mail

修改配置

# 邮件的设置 导入mail启动包 使用时注入直接JavaMailSender即可spring:mail:protocol:smtphost:smtp.qq.comport:465default-encoding:utf-8username:邮箱用户名password:邮箱授权码test-connection:trueproperties:mail:debug:truesmtp:auth:truetimeout:20000ssl:enable:true

直接在service层中使用即可

publicMailServiceImpl {@AutowiredprivateJavaMailSender javaMailSender;// 以下代码使用即可...}

亚马逊测评 www.yisuping.com

你可能感兴趣的:(.使用javax.mail, spring的JavaMailSender,springboot发送邮件)