Spring框架JavaMailSender发送邮件工具类详解

本文实例为大家分享了Spring框架JavaMailSender发送邮件工具类,供大家参考,具体内容如下

需要用到的jar包:

下面是发送工具类代码:

package com.test.email;

import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * @author tlimited
 * @create 2017-08-17 11:38
 **/
public class SendMailUtils {

  // Spring的邮件工具类,实现了MailSender和JavaMailSender接口
  private JavaMailSenderImpl mailSender;

  /**
   * 初始化邮件发送数据
   * @param host 服务器
   * @param username 发送人
   * @param passwd 发送人密码
   */
  public void setInitData(String host,String username,String passwd){
     //创建邮件发送服务器
    mailSender = new JavaMailSenderImpl();
    mailSender.setHost(host);
   // mailSender.setPort(465);
    mailSender.setUsername(username);
    mailSender.setPassword(passwd);
    //加认证机制
    Properties javaMailProperties = new Properties();
    javaMailProperties.put("mail.smtp.auth", true);
    javaMailProperties.put("mail.smtp.starttls.enable", true);
    javaMailProperties.put("mail.smtp.timeout", 5000);
    mailSender.setJavaMailProperties(javaMailProperties);
    System.out.println("初始化邮件发送信息完成");
  }
  /**
   * 发送普通文本
   * @param email 对方邮箱地址
   * @param subject 主题
   * @param text 邮件内容
   */
  public void simpleMailSend(String email,String subject,String text) {
    //创建邮件内容
    SimpleMailMessage message=new SimpleMailMessage();
    message.setFrom(mailSender.getUsername());
    message.setTo(email);
    message.setSubject(subject);
    message.setText(text);
    //发送邮件
    mailSender.send(message);
    System.out.println("发送成功");
  }

  /**
   * 发送附件,支持多附件
   * //使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
    //MimeMessages为复杂邮件模板,支持文本、附件、html、图片等。
   * @param email 对方邮箱
   * @param subject 主题
   * @param text 内容
   * @param paths 附件路径,和文件名
   * @throws MessagingException
   */
  public void attachedSend(String email,String subject,String text,Map<String,String> paths) throws MessagingException {

    MimeMessage message = mailSender.createMimeMessage();
    //创建MimeMessageHelper对象,处理MimeMessage的辅助类
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    //使用辅助类MimeMessage设定参数
    helper.setFrom(mailSender.getUsername());
    helper.setTo(email);
    helper.setSubject(subject);
    helper.setText(text);

    if (paths!=null){
      paths.forEach((k,v)->{
         //加载文件资源,作为附件
         FileSystemResource file = new FileSystemResource(v);
         try {
          //添加附件
           helper.addAttachment(k, file);
        } catch (Exception e) {
          e.printStackTrace();
        }
      });
    }
    //发送邮件
    mailSender.send(message);
    System.out.println("发送成功");
  }

  /**
  * 发送html文件,支持多图片
  * @param email 对方邮箱
  * @param subject 主题
  * @param text 内容
  * @param paths 富文本中添加用到的路径,一般是图片,或者css,js文件
  * @throws MessagingException
  */
  public void richContentSend(String email,String subject,String text,Map<String,String> paths) throws MessagingException {

    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    helper.setFrom(mailSender.getUsername());
    helper.setTo(email);
    helper.setSubject(subject);
    //第二个参数true,表示text的内容为html,然后注意<img/>标签,src='cid:file','cid'是contentId的缩写,'file'是一个标记,
    //需要在后面的代码中调用MimeMessageHelper的addInline方法替代成文件
    helper.setText(text,true);
    //文件地址相对应src目录
    // ClassPathResource file = new ClassPathResource("logo.png");

    if (paths!=null){
      paths.forEach((k,v)->{
         //文件地址对应系统目录
         FileSystemResource file = new FileSystemResource(v);
         try {
          helper.addInline(k, file);
        } catch (Exception e) {
          e.printStackTrace();
        }
      });
    }
    mailSender.send(message);
    System.out.println("发送成功");
  }

  /**
   * 群发多人,且多附件
   * @param mailto 多人邮件地址
   * @param subject 主题
   * @param text 内容
   * @param filePath 文件路径
   * @throws Exception
   */
  public void sendBatchMailWithFile(String[] emails, String subject, String text, String[] filePath) throws Exception { 

    MimeMessage mimeMessage = mailSender.createMimeMessage();
    MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
    messageHelper.setFrom(new InternetAddress(MimeUtility.encodeText(mailSender.getUsername())));
    messageHelper.setSubject(subject);
    if (filePath != null) {
      BodyPart mdp = new MimeBodyPart();// 新建一个存放信件内容的BodyPart对象
      mdp.setContent(text, "text/html;charset=UTF-8");// 给BodyPart对象设置内容和格式/编码方式
      Multipart mm = new MimeMultipart();// 新建一个MimeMultipart对象用来存放BodyPart对象
      mm.addBodyPart(mdp);// 将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
      // 把mm作为消息对象的内容
      MimeBodyPart filePart;
      FileDataSource filedatasource;
      // 逐个加入附件
      for (int j = 0; j < filePath.length; j++) {
        filePart = new MimeBodyPart();
        filedatasource = new FileDataSource(filePath[j]);
        filePart.setDataHandler(new DataHandler(filedatasource));
        try {
          filePart.setFileName(MimeUtility.encodeText(filedatasource.getName()));
        } catch (Exception e) {
          e.printStackTrace();
        }
        mm.addBodyPart(filePart);
      }
      mimeMessage.setContent(mm);
    } else {
      messageHelper.setText(text, true);
    } 

    List<InternetAddress> list = new ArrayList<InternetAddress>();// 不能使用string类型的类型,这样只能发送一个收件人
    for (int i = 0; i < emails.length; i++) {
      list.add(new InternetAddress(emails[i]));
    }
    InternetAddress[] address = list.toArray(new InternetAddress[list.size()]); 

    mimeMessage.setRecipients(Message.RecipientType.TO, address);
    mimeMessage = messageHelper.getMimeMessage(); 

    mailSender.send(mimeMessage);
    System.out.println("发送成功");
  } 

  public static void main(String[] args) throws Exception
  {
    SendMailUtils test = new SendMailUtils();
    //测试发送普通文本
   // test.setInitData("smtp.qq.com","706548532@qq.com","123456");
    test.setInitData("smtp.163.com","1234@163.com","1234");
    test.simpleMailSend("1326624701@qq.com","测试","测试能不能发邮件!!!");

    //测试发送附件
    /* test.setInitData("smtp.163.com","1234@163.com","1234");
    Map<String,String> map = new HashMap<String, String>();
    map.put("test12.xls", "D:\\tomcat8\\apache-tomcat-8.0.29\\test12.xls");
    map.put("wsdl.rar", "D:\\wsdl.rar");
    test.attachedSend("706548532@qq.com","Hello Attachment","This is a mail with attachment",map);
    */

    //测试发送富文本(html文件)
   /* test.setInitData("smtp.163.com","1234@163.com","1234");
    String text = "<body><p style='color:red;'>Hello Html Email</p><img src='cid:file'/></body>";
    Map<String,String> map = new HashMap<String, String>();
    map.put("file", "E:\\1f7827.jpg");
    test.richContentSend("706548532@qq.com","邮件标题",text,map);*/

    //测试群发多人多附件
    test.setInitData("smtp.163.com","1234@163.com","1234");
    String [] address = {"706548532@qq.com","1326624701@qq.com"};
    String [] filePath = {"D:\\tomcat8\\apache-tomcat-8.0.29\\test12.xls", "D:\\wsdl.rar"};
    test.sendBatchMailWithFile(address, "群发多文件", "实时", filePath);
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC

  • 浅谈spring中用到的设计模式及应用场景

    1.工厂模式,在各种BeanFactory以及ApplicationContext创建中都用到了 2.模版模式,在各种BeanFactory以及ApplicationContext实现中也都用到了 3.代理模式,Spring AOP 利用了 AspectJ AOP实现的! AspectJ AOP 的底层用了动态代理 动态代理有两种 目标方法有接口时候自动选用 JDK 动态代理 目标方法没有接口时候选择 CGLib 动态代理 4.策略模式,加载资源文件的方式,使用了不同的方法,比如:ClassPa

  • 浅谈Spring中如何使用设计模式

    关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性.本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式. 1. 策略模式 关于策略模式的使用方式,在Spring中其实比较简单,从本质上讲,策略模式就是一个接口下有多个实现类,而每种实现类会处理某一种情况.我们以发奖励为例进行讲解,比如我们在抽奖系统中,有多种奖励方式可供选择,比如积分,虚拟币和现金等.在存储时,我们必然会使用一个类似于type的字段用于表征这几种发放奖励的,那么这里我们就可以使用多态的

  • 详解设计模式在Spring中的应用(9种)

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念,才能在工作学习中运用到"无形". Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory

  • SpringBoot框架集成token实现登录校验功能

    简介 公司新项目,需要做移动端(Android和IOS),登录模块,两个移动端人员提出用token来校验登录状态,一脸懵懵的,没做过,对于token的基本定义都模棱两可,然后查资料查查查,最终OK完成,写篇博客记录一下 思路: 1.基于session登录 基于session的登录(有回话状态),用户携带账号密码发送请求向服务器,服务器进行判断,成功后将用户信息放入session,用户发送请求判断session中是否有用户信息,有的话放行,没有的话进行拦截,但是考虑到时App产品,牵扯到要判断用户

  • 设计模式在Spring框架中的应用汇总

    这篇文章主要介绍了设计模式在Spring框架中的应用汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟. 好的,我们开始进入正题.设计模式实践里面提供了许多经久不衰的解决方案和最佳方案.这里,GOF 设计模式主要分为三

  • SpringBoot2.0整合Shiro框架实现用户权限管理的示例

    GitHub源码地址:知了一笑 https://github.com/cicadasmile/middle-ware-parent 一.Shiro简介 1.基础概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.作为一款安全框架Shiro的设计相当巧妙.Shiro的应用不依赖任何容器,它不仅可以在JavaEE下使用,还可以应用在JavaSE环境中. 2.核心角色 1)Subject:认证主体 代表当前系统的使用者,就是用户,在Shiro的认证中,

  • 图解Spring框架的设计理念与设计模式

    本文主要剖析Spring框架的作者设计Spring框架的骨骼架构的设计理念,有那几个核心组件?为什么需要这些组件?它们又是如何结合在一起构成Spring的骨骼架构?Spring的AOP特性又是如何利用这些基础的骨骼架构来工作的?Spring中又使用了那些设计模式来完成它的这种设计的?它的这种设计理念对我们以后的软件设计有何启示?本文将详细解答这些问题. Spring的骨骼架构 Spring总共有十几个组件,但是真正核心的组件只有几个,下面是Spring框架的总体架构图: 图1.Spring框架的

  • Spring框架JavaMailSender发送邮件工具类详解

    本文实例为大家分享了Spring框架JavaMailSender发送邮件工具类,供大家参考,具体内容如下 需要用到的jar包: 下面是发送工具类代码: package com.test.email; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.Jav

  • Spring框架IOC容器底层原理详解

    目录 1.什么是IOC 2.IOC容器的底层原理 3.那么上边提到的三种技术如何实现IOC的呢 4.IOC(接口) 1.什么是IOC IOC – Inverse of Control,控制反转,将对象的创建权力反转给Spring框架! 在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类出了问题,那么可能会导致这个框架出现问题. Spring 将创建对象的权利给了IO

  • Spring框架对于Bean的管理详解

    目录 什么是Bean管理 Bean管理操作的两种方式 基于注解的方式实现Bean管理和注入属性(常用) 1.什么是注解 2.Spring针对Bean管理中创建对象提供的注解 3.用注解的方式创建对象 4.用注解的方实现属性注入 什么是Bean管理 bean管理指的是如下的两个操作. 1.创建对象 2.注入属性 Bean管理操作的两种方式 1.基于xml配置文件的方式实现 2.基于注解方式实现 基于注解的方式实现Bean管理和注入属性(常用) 1.什么是注解 ①:注解是代码特殊标记,格式:@注解名

  • 微信小程序 常用工具类详解及实例

    微信小程序 常用工具类详解 前言: 做微信小程序当中,会遇到好多的工具类util.js,这里记载下来以便平常使用 (Ps:建议通过目录查看) -获取日期(格式化) function formatTime(date) { var year = date.getFullYear() var month = date.getMonth() + 1 var day = date.getDate() var hour = date.getHours() var minute = date.getMinut

  • js时间戳转yyyy-MM-dd HH-mm-ss工具类详解

    在web开发中,我们经常需要用js将时间戳转yyyy-MM-dd HH-mm-ss类似的格式,这样才适合我们的观感,那么我们该如何在js中将时间戳转换成这种格式呢?其实很简单,我们开发一个时间戳工具类,如下: 第一种:最简单的是一个js时间格式的转换函数方法 function formatDateTime(inputTime) { var date = new Date(inputTime); var y = date.getFullYear(); var m = date.getMonth()

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

  • Spring框架学习之Cache抽象详解

    目录 1.简介 cache和buffer 2.缓存抽象 3.spring缓存抽象与多进程 官方文档  8.0 Spring为不同缓存做了一层抽象,这里通过阅读文档以及源码会对使用以及原理做一些学习笔记. 1.简介 从3.1版开始,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持. 与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小. 从Spring 4.1开始,通过JSR-107注释和更多自定义选项的支持,缓存抽象得到了显着改进. ca

  • Java TimedCache 带时间缓存工具类详解使用

    简述 我们在工作中会碰到需要使用带过期时间的缓存场景.但是使用redis有太重了,毕竟缓存的数据很小,放在内存够够的.hutools提供了TimedCache时间缓存工具,可以实现该场景.下面使用到该组件,并为了适配工作场景,对该工具类做优化升级. Maven依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>

  • python 提取视频中的音频工具类详解

    前言 利用Python的ffmpy库提取视频中的音频.本文提供工具类代码. 环境依赖 需要安装ffmpy,安装指令: pip install ffmpy -i https://pypi.douban.com/simple 工具代码 不废话,上代码. #!/user/bin/env python # coding=utf-8 """ @project : csdn @author : huyi @file : extract_audio_from_audio.py @ide :

  • Springboot Mybatis Plus自动生成工具类详解代码

    前言 代码生成器,也叫逆向工程,是根据数据库里的表结构,自动生成对应的实体类.映射文件和接口. 看到很多小伙伴在为数据库生成实体类发愁,现分享给大家,提高开发效率. 一.pom依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> &

随机推荐