这块还是属于自动发邮件项目的范畴,昨天为了解决邮件群发的问题一时间没有想到合适的解决方案。
邮件内容可以写死在项目里面,毕竟是固定的。但是收件邮箱并不一定是固定的,这次是利用到公司线上项目里面,每天都有大量的人在使用。总不能每次修改东西都打包重启项目吧?所以如果不单独建表的话存在外部文件里面无疑是一个很好的选择。于是考虑过自定义配置文件,用注解的方式去识别list,然后遍历。结果好像有点不尽人意,最终考虑是用txt文本。
原理是:接口被定时任务远程访问的时候(没错,我把项目里面原有的定时任务也干掉了。改成用云函数Http触发器按照设置的时间节点去Get请求对应接口。问就是方便随时控制执行时间……),去设置好的指定目录下读取txt文本识别你要发送的邮件列表。
这个工具类经过我稍微改造了一下,现在应该可以通用。
Txt2ListUtil
package com.demo.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
/**
* @Author zf
* @ClassName Txt2ListUtil.java
* @ProjectName demo
*/
public class Txt2ListUtil {
/**
* @param filePath 文件路径
* @param encoding 文件编码
* @Description 读取文本内容
*/
public static ArrayList<String> readTxt(String filePath, String encoding) {
List<String[]> list = new LinkedList<>();
//组合字符串列表
ArrayList<String> StrList = new ArrayList<>();
String[] outArray = null;
try {
File file = new File(filePath);
String lineInfo = "";
if (file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
BufferedReader bufferReader = new BufferedReader(read);
while ((lineInfo = bufferReader.readLine()) != null) {
//被读取的文件的字段以"#"分隔
StringTokenizer stk = new StringTokenizer(lineInfo, "#");
String[] strArray = new String[stk.countTokens()];
int i = 0;
while (stk.hasMoreTokens()) {
strArray[i++] = stk.nextToken();
}
list.add(strArray);
}
read.close();
}
} catch (Exception e) {
System.out.println("读取文件内容出错!");
e.printStackTrace();
}
for (int i = 0; i < list.size(); i++) {
outArray = (String[]) list.get(i);
}
for (int j = 0; j < outArray.length; j++) {
StrList.add(outArray[j]);
}
return StrList;
}
//测试方法
public static void main(String[] args) {
ArrayList<String> strings = readTxt("F:\\forMailList.txt", "utf-8");
System.out.println(strings);
}
}
测试文本(多个收件人用
#
隔开。):a@1.com#b@1.com#c@1.com