邮件微服务项目开发

一、异步回调插入充值记录

  • 不需要平台订单号(不需要返,无所谓)

  • userId没有返回来(不需要)

  • 如何获取vin,simcardId获取vin信息接口

二、内部

  • 根据vin获取车辆昵称接口,还没提供

  • 个推接口(提供接口传入文言和vin),还没提供

  • gerrit代码提交,权限配置,分支名字的问题Test,不能用test

  • 邮件发送调试

  • 写根据vin获取车辆昵称接口接口文档

  • 写个推接口接口文档

    扫描二维码关注公众号,回复: 11063978 查看本文章

三、Gerrit新建项目

  1. gerrit新建项目需要找某某在某个网址新建

四、svn文档路径

  • http://10.10.144.174/svn/hondavsp/4.DevelopLibrary/03.SystemDesign(SD)/2-系统设计式样书/4-UIUE设计

  • 今天补文档

五、邮件模板启用

邮件模板
姓名,您好:

您的车联网支撑平台登录密码已重置,重置后的初始密码为“user_手机号末6位”。

为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。

此致

车联网业务支撑平台
问题
  1. 传入ArrayList参数,模板id,查库,替换参数
  2. 调用方如何知道传入什么模板id? 商定好
  3. 对于邮件模板的增删改查
  4. 后台维护一次只启用一个同类型模板 否
  5. 数据库模板增加type,只有一个启用 否
方案一
  • 传入ArrayList参数,模板id,目的地邮箱,查库,替换参数

  • 缺点:每次更换模板需要更改代码

方案二
  • 传入ArrayList参数,类型,系统,目的地邮箱,查库,替换参数,

  • 根据类型、系统查找对应的模板,后台设置启用那个模板

  • 优点:后台维护,发送邮件样式修改不需要修改代码

  • 不涉及用户登陆

数据库 设计
  • 表名:vsp_email_template

  • 字段:主键,模板名称,描述、模板url、模板html、type、system_name、replace_word、create_time、update_time、is_delete

  • 模板名称唯一索引

sql
CREATE TABLE `vsp_email_template` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `template_name` varchar(255) DEFAULT NULL COMMENT '模板名称',
  `email_subject` varchar(255) DEFAULT NULL COMMENT '邮件主题',
  `template_desc` varchar(255) DEFAULT NULL COMMENT '描述',
  `template_html` mediumtext COMMENT '模板html',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `is_delete` tinyint(4) DEFAULT '1' COMMENT '1有效 0无效',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQUE` (`template_name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

insert into `vsp_email_template` (`id`, `template_name`, `email_subject`, `template_desc`, `template_html`, `create_time`, `update_time`, `is_delete`) values('1','模板名称','测试邮件主题','重置密码','<div class=\"ax_default _文本段落\" id=\"u8592\">\r\n  <div id=\"u8592_div\"></div>\r\n  <div class=\"text \" id=\"u8592_text\">\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">${userName!},您好:</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">您的车联网支撑平台登录密码已重置,重置后的初始密码为“${password!}”。</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">此致</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">车联网业务支撑平台</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">\r\n        <br></span>\r\n    </p>\r\n  </div>\r\n</div>','2020-04-22 17:04:42','2020-04-22 17:04:44','1');

思路:

  1. 从数据库中取对应的变量名称及对应的变量值,后台先取到html文件的内容,然后用raplace方法将对应的变量进行替换,替换后的文本作为文件的正文内容。
  2. 或者用free marker替换

六、java发送附件是.bin格式

  • 附件由于名字过长且含有中文的造成形成.bin文件
static {
        System.setProperty("mail.mime.splitlongparameters","false");
        System.setProperty("mail.mime.charset","UTF-8");
    }

七、邮件模板

<div class="ax_default _文本段落" id="u8592">
  <div id="u8592_div"></div>
  <div class="text " id="u8592_text">
    <p>
      <span style="color: rgb(0, 102, 255);">${userName!},您好:</span></p>
    <p>
      <span style="color: rgb(0, 102, 255);">您的车联网支撑平台登录密码已重置,重置后的初始密码为“${password!}”。</span></p>
    <p>
      <span style="color: rgb(0, 102, 255);">为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。</span></p>
    <p>
      <span style="color: rgb(0, 102, 255);">此致</span></p>
    <p>
      <span style="color: rgb(0, 102, 255);">车联网业务支撑平台</span></p>
    <p>
      <span style="color: rgb(0, 102, 255);">
        <br></span>
    </p>
  </div>
</div>
  • 在线查看界面:https://c.runoob.com/front-end/61

  • html格式化:http://tool.chinaz.com/Tools/jsformat.aspx

  • #{姓名} 格式替换

  • 如果没有替换词,用户输入其他东西,模板存在也会替换,加替换词做校验

八、freemarker字符串替换

pom.xml
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.23</version>
		</dependency>
FreemarkerUtils.java
package com.mtons.mblog.base.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import lombok.extern.slf4j.Slf4j;

import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * @author Administrator
 */
@Slf4j
public class FreemarkerUtils {
    private static String defaultCharacter = "UTF-8";
    private static Configuration cfg;
    private  FreemarkerUtils() {
    }
    static {
        cfg = new Configuration(Configuration.getVersion());
        cfg.setDefaultEncoding(defaultCharacter);
        cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
    }
    /**
     * 对模板进行渲染
     * @param data 数据Map
     * @param tplStr 模板
     * @return
     */
    public static  String generateString(
            Map<String, Object> data,  String tplStr) {
        String result = null;
        String name="myStrTpl";
        try {
            StringTemplateLoader stringTemplateLoader= new StringTemplateLoader();
            stringTemplateLoader.putTemplate(name, tplStr);
            cfg.setTemplateLoader(stringTemplateLoader);
            Template template = cfg.getTemplate(name,defaultCharacter);
            StringWriter out = new StringWriter();
            template.process(data, out);
            out.flush();
            result= out.toString();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 将模板渲染以后保存到文件
     * @param templateFileDir 模板目录
     * @param fileName 模板文件名称
     * @param targetFilePath 渲染后文件名称
     * @param dataMap 数据
     * @return
     */
    public static boolean renderingTemplateAndGenerateFile(String templateFileDir,
                                                           String fileName,String targetFilePath,Map<String, Object> dataMap){
        boolean flag=true;
        try {
            // 设置文件所在目录的路径
            cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路径
            // 获取模版
            Template template = cfg.getTemplate(fileName);
            // 设置输出文件名,和保存路径
            File outFile = new File(targetFilePath);
            // 将模板和数据模型合并生成文件 重点设置编码集
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
            // 生成文件
            template.process(dataMap, out);
            // 关闭流
            out.flush();
            out.close();
        } catch (Exception e) {
            log.error("生产模板文件失败!",e);
            flag=false;
        }
        return flag;
    }


    public static void main(String[] args) {
        Map<String,Object> map= new HashMap<>();
        map.put("date", "2017-05-11 11:55:55");
        map.put("caseNo", "AJ00000001");
        map.put("descrip", "这是描述信息==========");
        String template="案件编号为:${caseNo!}   "
                + " 日期为:${date!} "
                + " 自动获取日期为:${ .now?string('yyyy年MM月dd日')}"
                + "描述:${descrip!}";
        String generateString = FreemarkerUtils.generateString(map, template);
        System.out.println("------");
        System.out.println(generateString);
    }

}

九、多个收件人处理

  • https://blog.csdn.net/zmh458/article/details/84205480

  • 设置收件人地址,以逗号隔开

十、HTML代码存储到数据库中

  • 直接复制粘贴进不去,会涉及到转义之类的,果然转义之后就能存储了。

  • HTML在线转义:https://www.sojson.com/rehtml

html转义实现

HtmlUtil.java

package com.reachauto.vspcloud.message.utils;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.util.HtmlUtils;

/**
 * Html工具类
 *
 * @author Administrator*/
public class HtmlUtil {

    /**
     * Spring的HtmlUtils进行转义
     */
    public static String htmlEscape(String str) {
        if (StringUtils.isBlank(str)) {
            return null;
        } else {
            return HtmlUtils.htmlEscape(str);
        }
    }

    /**
     * Spring的HtmlUtils进行还原
     */
    public static String htmlUnescape(String str) {
        if (StringUtils.isBlank(str)) {
            return null;
        } else {
            return HtmlUtils.htmlUnescape(str);
        }
    }

    /**
     * StringEscapeUtils的HtmlUtils进行转义
     */
    public static String stringHtmlEscape(String str) {
        if (StringUtils.isBlank(str)) {
            return null;
        } else {
            return StringEscapeUtils.escapeHtml(str);
        }
    }

    /**
     * StringEscapeUtils的HtmlUtils进行还原
     */
    public static String stringHtmlUnescape(String str) {
        if (StringUtils.isBlank(str)) {
            return null;
        } else {
            return StringEscapeUtils.unescapeHtml(str);
        }
    }

    public static void main(String[] args) {
        System.out.println(stringHtmlEscape("<div class=\"ax_default _文本段落\" id=\"u8592\">\n" +
                "  <div id=\"u8592_div\"></div>\n" +
                "  <div class=\"text \" id=\"u8592_text\">\n" +
                "    <p>\n" +
                "      <span style=\"color: rgb(0, 102, 255);\">姓名,您好:</span></p>\n" +
                "    <p>\n" +
                "      <span style=\"color: rgb(0, 102, 255);\">您的车联网支撑平台登录密码已重置,重置后的初始密码为“user_手机号末6位”。</span></p>\n" +
                "    <p>\n" +
                "      <span style=\"color: rgb(0, 102, 255);\">为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。</span></p>\n" +
                "    <p>\n" +
                "      <span style=\"color: rgb(0, 102, 255);\">此致</span></p>\n" +
                "    <p>\n" +
                "      <span style=\"color: rgb(0, 102, 255);\">车联网业务支撑平台</span></p>\n" +
                "    <p>\n" +
                "      <span style=\"color: rgb(0, 102, 255);\">\n" +
                "        <br></span>\n" +
                "    </p>\n" +
                "  </div>\n" +
                "</div>"));
        System.out.println(stringHtmlUnescape("&lt;div class=&quot;ax_default _&#25991;&#26412;&#27573;&#33853;&quot; id=&quot;u8592&quot;&gt;\n" +
                "  &lt;div id=&quot;u8592_div&quot;&gt;&lt;/div&gt;\n" +
                "  &lt;div class=&quot;text &quot; id=&quot;u8592_text&quot;&gt;\n" +
                "    &lt;p&gt;\n" +
                "      &lt;span style=&quot;color: rgb(0, 102, 255);&quot;&gt;&#22995;&#21517;&#65292;&#24744;&#22909;&#65306;&lt;/span&gt;&lt;/p&gt;\n" +
                "    &lt;p&gt;\n" +
                "      &lt;span style=&quot;color: rgb(0, 102, 255);&quot;&gt;&#24744;&#30340;&#36710;&#32852;&#32593;&#25903;&#25745;&#24179;&#21488;&#30331;&#24405;&#23494;&#30721;&#24050;&#37325;&#32622;&#65292;&#37325;&#32622;&#21518;&#30340;&#21021;&#22987;&#23494;&#30721;&#20026;&ldquo;user_&#25163;&#26426;&#21495;&#26411;6&#20301;&rdquo;&#12290;&lt;/span&gt;&lt;/p&gt;\n" +
                "    &lt;p&gt;\n" +
                "      &lt;span style=&quot;color: rgb(0, 102, 255);&quot;&gt;&#20026;&#20445;&#38556;&#24744;&#30340;&#36134;&#25143;&#23433;&#20840;&#65292;&#35831;&#23613;&#24555;&#30331;&#24405;&#31995;&#32479;&#24182;&#20462;&#25913;&#24744;&#30340;&#23494;&#30721;&#12290;&#22914;&#26524;&#24744;&#23545;&#26412;&#27425;&#37325;&#32622;&#23494;&#30721;&#25805;&#20316;&#26377;&#30097;&#38382;&#65292;&#35831;&#32852;&#31995;&#31995;&#32479;&#31649;&#29702;&#21592;&#12290;&lt;/span&gt;&lt;/p&gt;\n" +
                "    &lt;p&gt;\n" +
                "      &lt;span style=&quot;color: rgb(0, 102, 255);&quot;&gt;&#27492;&#33268;&lt;/span&gt;&lt;/p&gt;\n" +
                "    &lt;p&gt;\n" +
                "      &lt;span style=&quot;color: rgb(0, 102, 255);&quot;&gt;&#36710;&#32852;&#32593;&#19994;&#21153;&#25903;&#25745;&#24179;&#21488;&lt;/span&gt;&lt;/p&gt;\n" +
                "    &lt;p&gt;\n" +
                "      &lt;span style=&quot;color: rgb(0, 102, 255);&quot;&gt;\n" +
                "        &lt;br&gt;&lt;/span&gt;\n" +
                "    &lt;/p&gt;\n" +
                "  &lt;/div&gt;\n" +
                "&lt;/div&gt;"));
    }
}

十一、发送邮件接口入参

{
	"toEmilAddress": "[email protected],[email protected],[email protected],[email protected]",
	"templateName": "模板名称",
	"replaceWord": {
		"password": "888888",
		"userName": "刘看山"
	},
	"carbonCopyEmail": "[email protected],[email protected],[email protected],[email protected]"
}

十二、数据库实体JSON

{
	"createTime": 1587546282000,
	"id": 1,
	"isDelete": 1,
	"templateDesc": "重置密码",
	"templateHtml": "<div class=\"ax_default _文本段落\" id=\"u8592\">\r\n  <div id=\"u8592_div\"></div>\r\n  <div class=\"text \" id=\"u8592_text\">\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">${userName!},您好:</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">您的车联网支撑平台登录密码已重置,重置后的初始密码为“${password!}”。</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">此致</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">车联网业务支撑平台</span></p>\r\n    <p>\r\n      <span style=\"color: rgb(0, 102, 255);\">\r\n        <br></span>\r\n    </p>\r\n  </div>\r\n</div>",
	"templateName": "模板名称",
	"updateTime": 1587546284000
}

十三、json文本转Java对象

public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();


        // json  > java对象
        String json = "{\n" +
                "\t\"createTime\": 1587546282000,\n" +
                "\t\"id\": 1,\n" +
                "\t\"isDelete\": 1,\n" +
                "\t\"templateDesc\": \"重置密码\",\n" +
                "\t\"templateHtml\": \"<div class=\\\"ax_default _文本段落\\\" id=\\\"u8592\\\">\\r\\n  <div id=\\\"u8592_div\\\"></div>\\r\\n  <div class=\\\"text \\\" id=\\\"u8592_text\\\">\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">${userName!},您好:</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">您的车联网支撑平台登录密码已重置,重置后的初始密码为“${password!}”。</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">此致</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">车联网业务支撑平台</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">\\r\\n        <br></span>\\r\\n    </p>\\r\\n  </div>\\r\\n</div>\",\n" +
                "\t\"templateName\": \"模板名称\",\n" +
                "\t\"updateTime\": 1587546284000\n" +
                "}";
        EmailTemplate emailTemplate = null;
        try {
            emailTemplate = mapper.readValue(json, EmailTemplate.class);
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(emailTemplate);

    }

十四、本地模拟连接数据库

package com.reachauto.vspcloud.message.controller;



import com.alibaba.fastjson.JSONObject;
import com.reachauto.vspcloud.common.response.Response;
import com.reachauto.vspcloud.common.response.ResponseHelper;
import com.reachauto.vspcloud.message.bean.entity.EmailTemplate;
import com.reachauto.vspcloud.message.bean.enu.MessageStatusEnum;
import com.reachauto.vspcloud.message.utils.FreemarkerUtils;
import com.reachauto.vspcloud.message.utils.MailUtil;
import com.reachauto.vspcloud.service.MailService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/**
 *
 * @author Administrator
 */
@Slf4j
@RestController
@RequestMapping("mail")
public class MailController {


    @Autowired
    private MailService mailService;

    @ApiOperation(value = "发送邮件", notes = "发送邮件")
    @ApiResponses(value = {
            @ApiResponse(code = 000000, message = "Successful — 发送邮件"),
            @ApiResponse(code = 200002, message = "发送邮件失败")
    })
    @RequestMapping(value = "/sendEmail", method = RequestMethod.POST)
    public Response<Object> sendEmail(@RequestBody JSONObject jsonParam) {
        log.info("发送邮件入参:[{}]", jsonParam.toJSONString());
        try{
            if(jsonParam.isEmpty()){
                return ResponseHelper.createResponse(MessageStatusEnum.MESSAGE_RELEASE_ISNULL.getCode(), MessageStatusEnum.MESSAGE_RELEASE_ISNULL.getName());
            }
            Map<String, Object> jsonMap = JSONObject.toJavaObject(jsonParam, Map.class);
            EmailTemplate emailTemplate = mailService.selectByTemplateName((String)jsonMap.get("templateName"));
            if(emailTemplate == null){
                return ResponseHelper.createResponse(MessageStatusEnum.TEMPLATE_EMPTY_ERROR.getCode(), MessageStatusEnum.TEMPLATE_EMPTY_ERROR.getName());
            }
            //替换文言
            Map<String,Object> mapWenYan= new HashMap<>(16);
            Map<String,Object> handleWord = (Map<String, Object>) jsonMap.get("replaceWord");
            Iterator it = handleWord.entrySet().iterator();
            while(it.hasNext()){
                Map.Entry entry = (Map.Entry) it.next();
                mapWenYan.put((String)entry.getKey(), entry.getValue());
            }
            String generateString = FreemarkerUtils.generateString(mapWenYan, emailTemplate.getTemplateHtml());
            //发送邮件
            MailUtil.sendMail((String)jsonMap.get("toEmilAddress"), generateString, emailTemplate.getEmailSubject(), (String)jsonMap.get("carbonCopyEmail"));
            log.info("邮件模板内容:[{}]", generateString);
            return ResponseHelper.createResponse(MessageStatusEnum.REQUIRE_SUCCESS.getCode(), MessageStatusEnum.REQUIRE_SUCCESS.getName());
        }catch (Exception e){
            e.printStackTrace();
            return ResponseHelper.createResponse(MessageStatusEnum.REQUIRE_ERROR.getCode(), MessageStatusEnum.REQUIRE_ERROR.getName());
        }
    }
}

十五、发送邮件工具类优化

package com.reachauto.vspcloud.message.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.reachauto.vspcloud.common.response.ResponseHelper;
import com.reachauto.vspcloud.message.bean.entity.EmailTemplate;
import com.reachauto.vspcloud.message.bean.enu.MessageStatusEnum;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.io.IOException;
import java.util.*;


/**
 * 发送邮件
 *
 * @author Administrator
 */
public class MailUtil {


    private static String mailAccount = "[email protected]";
    private static String password = "Meiyou@123!";
    private static String myEmailSMTPHost = "smtp.reachauto-vsp.com";

    static {
        System.setProperty("mail.mime.splitlongparameters","false");
        System.setProperty("mail.mime.charset","UTF-8");
    }
    /**
     * 发送邮件的方法
     *
     * @param toEmilAddress  邮件的接收方 多个接收方用,分割
     * @param mes mes 内容
     * @param emailSubject 邮件主题
     * @param carbonCopyEmail 抄送 多个接收方用,分割
     */
    public static void sendMail(String toEmilAddress, String mes,String emailSubject,String carbonCopyEmail) {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.host", myEmailSMTPHost);
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.ssl.enable", "true");

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(mailAccount, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(mailAccount));
            //message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to));
            //设置收件人地址,以逗号隔开
            InternetAddress[] sendTo = InternetAddress.parse(toEmilAddress);
            message.setRecipients(MimeMessage.RecipientType.TO, sendTo);
            //设置抄送人地址,以逗号隔开
            InternetAddress[] carbonCopy = InternetAddress.parse(carbonCopyEmail);
            message.setRecipients(MimeMessage.RecipientType.CC, carbonCopy);

            message.setSubject(emailSubject);
            message.setContent(mes, "text/html;charset=UTF-8");
            System.out.println("开始发送邮件");
            Transport.send(message);
            System.out.println("邮件发送成功");
        } catch (MessagingException e) {
            e.printStackTrace();
            throw new RuntimeException("发送邮件失败" + e);
        }
    }

    /**
     * 发送附件
     * @param to
     * @param mes
     * @param file
     * @throws Exception
     */
    public static void sendEmailWithFile(String to, String mes,File file) throws Exception {
        // 1. 创建邮件会话
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.host", myEmailSMTPHost);
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.ssl.enable", "true");

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(mailAccount, password);
            }
        });
        // 2. 创建邮件对象
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(mailAccount));
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to));
        message.setSubject("邮件主题");
        // 3. 设置参数:标题、发件人、收件人、发送时间、内容
        //message.setSubject("带图片邮件");
        //message.setSender(sendMan);
        //message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxx.com"));
        message.setSentDate(new Date());

        /*************** 设置邮件内容: 多功能用户邮件 (related) *******************/
        // 4.1 构建一个多功能邮件块
        MimeMultipart related = new MimeMultipart("related");
        // 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源
        MimeBodyPart content = new MimeBodyPart();
        MimeBodyPart resource = new MimeBodyPart();

        // 设置具体内容: a.资源(图片)
        DataSource ds = new FileDataSource(file);
        //使用到了JAF框架把磁盘上的文件加到resource
        DataHandler handler = new DataHandler(ds);
        resource.setDataHandler(handler);
        // 设置资源名称,给外键引用
        resource.setContentID(file.getName());

        // 设置具体内容: b.文本
        content.setContent(mes, "text/html;charset=UTF-8");

        related.addBodyPart(content);
        related.addBodyPart(resource);

        /******* 4.3 把构建的复杂邮件快,添加到邮件中 ********/
        message.setContent(related);

        // 5. 发送
        Transport trans = session.getTransport();
        trans.connect("[email protected]", "xxx");
        trans.sendMessage(message, message.getAllRecipients());
        trans.close();
    }


    public static void main(String[] args) throws Exception {
        //MailUtil.sendMail("[email protected]", "test code");
        //MailUtil.sendEmailWithFile("[email protected]", "test code",new File("C:\\Users\\Administrator\\Desktop\\个推以及查询车辆昵称接口文档.docx"));
        Map<String,Object> map= new HashMap<>(16);
        map.put("templateName","模板名称");
        map.put("toEmilAddress","[email protected],[email protected]");
        map.put("carbonCopyEmail","[email protected],[email protected]");

        //模板中需要替换的数据,具体字段请联系配置模板老师,示例
        Map<String,Object> subMap= new HashMap<>(16);
        subMap.put("userName","张三");
        subMap.put("password","123456");
        map.put("replaceWord",subMap);
        ObjectMapper mapper = new ObjectMapper();


        // json  > java对象
        String json = "{\n" +
                "\t\"createTime\": 1587546282000,\n" +
                "\t\"id\": 1,\n" +
                "\t\"isDelete\": 1,\n" +
                "\t\"templateDesc\": \"重置密码\",\n" +
                "\t\"templateHtml\": \"<div class=\\\"ax_default _文本段落\\\" id=\\\"u8592\\\">\\r\\n  <div id=\\\"u8592_div\\\"></div>\\r\\n  <div class=\\\"text \\\" id=\\\"u8592_text\\\">\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">${userName!},您好:</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">您的车联网支撑平台登录密码已重置,重置后的初始密码为“${password!}”。</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">为保障您的账户安全,请尽快登录系统并修改您的密码。如果您对本次重置密码操作有疑问,请联系系统管理员。</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">此致</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">车联网业务支撑平台</span></p>\\r\\n    <p>\\r\\n      <span style=\\\"color: rgb(0, 102, 255);\\\">\\r\\n        <br></span>\\r\\n    </p>\\r\\n  </div>\\r\\n</div>\",\n" +
                "\t\"templateName\": \"模板名称\",\n" +
                "\t\"updateTime\": 1587546284000\n" +
                "}";
        EmailTemplate emailTemplate = null;
        try {
            emailTemplate = mapper.readValue(json, EmailTemplate.class);
            Map<String, Object> jsonMap = JSONObject.toJavaObject((JSON)JSON.toJSON(emailTemplate), Map.class);
            if(emailTemplate == null){
                return ;
            }
            //替换文言
            Map<String,Object> mapWenYan= new HashMap<>(16);
            Map<String,Object> handleWord = (Map<String, Object>) map.get("replaceWord");
            Iterator it = handleWord.entrySet().iterator();
            while(it.hasNext()){
                Map.Entry entry = (Map.Entry) it.next();
                mapWenYan.put((String)entry.getKey(), entry.getValue());
            }
            String generateString = FreemarkerUtils.generateString(mapWenYan, emailTemplate.getTemplateHtml());
            //发送邮件
            MailUtil.sendMail((String)map.get("toEmilAddress"), generateString, emailTemplate.getEmailSubject(), (String)map.get("carbonCopyEmail"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(emailTemplate);
    }
}

十六、相关截图

文言提取

在这里插入图片描述

在这里插入图片描述

发布了169 篇原创文章 · 获赞 18 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/yunfengfengfeng/article/details/105699063