【BUG编号:29717】 定时任务的邮件发送实现给不同发件人发送不同内容
本帖最后由 stefan 于 2012-12-21 09:58 编辑
定时任务的邮件发送实现给不同发件人发送不同内容应用场景:用户是电器设计生产销售行业,现在他们下面有很多经销,这些经销商会经常从他们那采购以及回款等。鸿雁电器需要定期的给这些客户发送邮件,告知其回款情况,货物剩余情况等。还有他们公司给员工发工资时也需要给各员工发送邮件,告知其工资金额。这里给员工以及客户发送邮件时,邮件内容只能是和该员工或客户相关的内容,其他客户或员工的数据不要发给这个客户。
解决方案:根据帮助文档中二次开发 >> 引擎API >> 导出API >> 后台批量导出Excel章节的内容实现根据不同的参数组合统计出对应数据结果,并生成excel等文件,再结合报表内部EmailManager接口send函数实现邮件发送功能,将收件人和数据作为参数传入即可实现给不同发件人发送不同内容。
示例分析:利用FRDemo中的销量表,将华东数据发给一个邮箱,华北数据发给另一个邮箱。(1) 编写Test类:把地区和邮箱作为参数写入para.txt,分别生成0.xls和1.xls发送到对应邮箱。编译完成后把类复制到报表对应文件夹下。【注:send函数格式为:EmailManager mgr=ConfigManager.getInstance().getEmailManager(); mgr.send( "收件人", "抄送", "密送", "发送人", "主题", "内容", "附件" ); para.txt放在代码中指定的路径中即可,邮箱可根据实际需要进行修改。】实现代码如下:package com.fr.output;import java.io.*;import java.util.Arrays;import javax.mail.MessagingException;import com.fr.base.FRContext;import com.fr.base.dav.LocalEnv;import com.fr.base.file.ConfigManager;import com.fr.base.file.EmailManager;import com.fr.base.file.*;import com.fr.fs.schedule.output.AbstractOutputFileAction;import com.fr.io.ExcelExporter;import com.fr.io.TemplateWorkBookIO;import com.fr.main.ResultWorkBook;import com.fr.main.TemplateWorkBook;import com.fr.util.Utils;public class Test extends AbstractOutputFileAction{ @Override public File getFilesToDealWith(File files) { return files; } @Override public void doFileAction(File files) { try { // 定义报表运行环境,用于执行报表 String envpath = "E:\\FineReport_7.0\\WebReport\\WEB-INF"; FRContext.setCurrentEnv(new LocalEnv(envpath)); // ModuleContext.startModule(EngineModule.class.getName()); // 读取环境下的模板文件 TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "doc\\Primary\\Parameter\\Parameter.cpt"); // 读取用于保存的参数值的txt文件 File parafile = new File(envpath + "\\para.txt"); FileInputStream fileinputstream; fileinputstream = new FileInputStream(parafile); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileinputstream)); // 定义保存参数的map,用于执行报表 java.util.Map paramap = new java.util.HashMap(); /* * 遍历参数值所在txt文件,txt文件中参数保存形式为 para1,para2 江苏,陈羽 江苏,安娜 首先取出第一行保存参数名称 * 遍历每个参数组合,如para1=江苏、para2=陈羽,根据参数执行模板,并将结果导出excel excel文件名为名称+导出编号 */ // 读第一行,保存参数名称 String lineText = bufferedReader.readLine(); lineText = lineText.trim(); String paraname = Utils.splitString(lineText, ","); System.out.println(Arrays.toString(paraname)); // 遍历每个参数组合,执行模板,导出结果 int number = 0; while ((lineText = bufferedReader.readLine()) != null) { lineText = lineText.trim(); String paravalue = Utils.splitString(lineText, ","); for (int j = 0; j < paravalue.length; j++) { paramap.put(paraname, paravalue); } ResultWorkBook result = workbook.execute(paramap); File sendfile = new File(number + ".xls"); OutputStream outputdtream = new FileOutputStream(sendfile); ExcelExporter excelexporter = new ExcelExporter(); excelexporter.export(outputdtream, result); //定义sendfile为参数导出生成的数据文件,传入send函数 EmailManager mgr=ConfigManager.getInstance().getEmailManager(); try { String email= (String)paramap.get("邮箱");//定义email为获取参数中的邮箱列的内容,传入send函数 mgr.send(email,"","","stefan465srb@gmail.com","You succeed!","",sendfile); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 最后要清空一下参数map,用于下次计算 paramap.clear(); number++; } } catch (Exception e) { e.printStackTrace(); } finally{ } } }(2) 在报表平台管理的服务器设置中对于邮件发送地址进行相应设置,示例如下图:http://bbs.fanruan.com/data/attachment/album/201212/20/154506yz4yvvg0p7kns9yy.png点击发送测试邮件进行测试,若成功则可以点击提交,则邮件设置成功!(3) 在决策管理平台中定时任务中利用自定义附件功能调用Test类即可实现给不同的收件人发送不同数据的功能。