zoukankan      html  css  js  c++  java
  • 基于JavaMail开发邮件发送器工具类

    基于JavaMail开发邮件发送器工具类

    在开发当中肯定会碰到利用Java调用邮件服务器的服务发送邮件的情况,比如账号激活、找回密码等功能。本人之前也碰到多次这样需求,为此特意将功能封装成一个简单易用工具类,需要用邮件发送功能时,只需要调用相关的接口即可。本人也将该工具提交到了GitHub上(https://github.com/lzj09/mail-helper),供大家参考。接下来,简单介绍一下该工具类及使用方法。

    1、工程依赖

    本工程主要依赖如下Jar:

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.6.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
    
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    

    由于邮件发送是基于JavaMail的所以需要依赖JavaMail相关的Jar;

    发送邮件的模板不仅支持简单的文本内容,也支持html,同时邮件模板中的语法支持freemarker语法,所以需要freemarker相关Jar;

    记录日志信息,目前使用log4j。

    2、核心类MailHelper

    核心类MailHelper中最重要的send方法,即邮件发送方法,该方法的签名为:

    public static void send(SenderConfig sender, String receiver, String subject, String template, Map<String, Object> data) throws Exception
    

    该方法有5个参数,分别是:

    • SenderConfig sender:邮件发送账号的配置信息,配置信息有:

      // 用户名
      private String username;
      // 密码
      private String password;
      // 昵称
      private String nickname;
      // smtp服务主机名
      private String smtpHost;
      // smtp服务端口
      private String smtpPort;
      // 是否开启ssl
      private boolean isSsl;
      

      其实最主要就是smtp的配置信息

    • String receiver:邮件接收者邮箱地址

    • String subject:邮件的主题,也即在邮件列表上显示的名称

    • String template:邮件模板内容,支持freemarker语法

    • Map<String, Object> data:邮件模板中需要替换的数据内容

    该方法的实现为:

    // 将SenderConfig配置信息转换成Properties
    Properties prop = wrapProperties(sender);
    
    // 获取权限配置
    AuthConfig auth = getAuthConfig(sender);
    
    // 构建邮件会话
    Session mailSession = Session.getDefaultInstance(prop, auth);  
    mailSession.setDebug(false); 
    
    // 构建邮件消息
    Message mailMessage = new MimeMessage(mailSession);
    
    // 设置昵称
    String nick = MimeUtility.encodeText(getNickname(sender));
    Address from = new InternetAddress(nick + " <" + sender.getUsername() + ">"); 
    mailMessage.setFrom(from);
    
    // 设置邮件接收者
    Address to = new InternetAddress(receiver);
    mailMessage.setRecipient(Message.RecipientType.TO, to);  
    
    // 设置邮件主题
    mailMessage.setSubject(subject);
    
    // 设置发送时间
    mailMessage.setSentDate(new Date());
    
    // 设置邮件内容
    Multipart mainPart = new MimeMultipart();
    // 内容是可以包含html
    BodyPart html = new MimeBodyPart();
    html.setContent(getContent(template, data), "text/html; charset=utf-8");
    mainPart.addBodyPart(html);
    mailMessage.setContent(mainPart);
    
    // 发送邮件  
    Transport.send(mailMessage);
    

    3、测试

    利用邮件发送的工具类测试将邮件发送出去:

    首先准备需要发送的邮件模板:test.html

    <!doctype html>
    <html>
        <head>
            <title>测试邮件</title>
            <meta charset="utf-8">
        </head>
        
        <body>
            <h2>${name}</h2>
            <div>${description}</div>
        </body>
    </html>
    

    其中模板中放置了2个占位符,分别是${name}和${description}

    构建测试例子:

    // 配置邮件发送信息
    SenderConfig sender = new SenderConfig();
    sender.setNickname("架构与我");
    // 改成自己的邮件帐号
    sender.setUsername("xxx@163.com");
    // 改成自己的邮件密码
    sender.setPassword("xxx");
    sender.setSmtpHost("smtp.163.com");
    sender.setSmtpPort("25");
    sender.setSsl(false);
    
    // 获取邮件模板
    File tpl = new File("src/test/resources/test.html");
    StringBuilder builder = new StringBuilder();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(tpl), "utf-8"));) {
        String line = null;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
    }
    
    // 测试数据
    Map<String, Object> data = new HashMap<String, Object>();
    data.put("name", "架构与我");
    data.put("description", "专注大数据、微服务架构、高并发高吞吐量大型网站、移动开发。");
    
    // 测试发送邮件
    // 改成自己的接收邮件地址
    MailHelper.send(sender, "xxx@qq.com", "来自架构与我的邮件", builder.toString(), data);
    

    发送成功后,可以看到接收邮箱的内容如下:

    该邮件昵称和主题都是按我们的设置显示出来了,打开邮件内容如下:

    可以看到模板当中占位符内容也替换成了我们设置的数据。

    关注我

    以你最方便的方式关注我:
    微信公众号:

  • 相关阅读:
    七周七语言——Prolog(二)
    centos中使用python遇到的几个问题
    use SWF / Flash in cocos2d-x; cocos2d(cocos2d-x) 直接播放flash / SWF文件
    【C++自我精讲】基础系列二 const
    Find发帖水王哥
    JAVA从零单排之前因
    CSharp
    python实战--Http代理服务器
    有道单词-批量导入[只有单词]
    编译原理(一道小证明题)
  • 原文地址:https://www.cnblogs.com/atcloud/p/10648202.html
Copyright © 2011-2022 走看看