场景: 通常我们可过任务把电子表格报表内容以邮件的正文形式发送。
实现思路:通过任务中的【定制】写JavaScript语法的Java代码JAVA代码实现。
效果如下:
注1:本示例中接收邮箱建议使用foxmail客户端查看。
若是使用网页版邮箱客户端会产生格式丢失的问题(原因:网页版上接收查看邮件,网页自身会屏蔽很多信息;同时outlook对html的解析存在问题,这些会导致邮件显示无边框)。
注2:电子表格必须是纯表格(文本),不能存在图形,如果存在图形或其他非文本内容会存在发送的正文存在问题。(原因:因为导出html是有部分脚本及其他的需要执行,邮件的客户端执行不了)
若是只能通过网页版邮箱查看或者是电子表格存在非文本内容,建议考虑使用导出png的方式:通过计划任务把电子表格导出图片以邮件正文发送
操作步骤:
1、先创建好电子表格报表。
2、在【定制管理】-》【计划任务】-》【任务】创建任务,【任务类型】选择:“定制”
JAVA代码如下:
自定义任务
importPackage(Packages.smartbi.sdk.service.spreadsheetreport); importPackage(Packages.smartbi.scheduletask.task); importPackage(Packages.smartbi.sdk.service.systemconfig); importPackage(Packages.java.lang); importPackage(Packages.java.util); importPackage(Packages.java.text); importPackage(Packages.java.io); importPackage(Packages.org.apache.commons.lang); importPackage(Packages.org.apache.commons.mail); importPackage(Packages.smartbi.scheduletask.component); importPackage(Packages.smartbi.util); var report = null; //定义email对象,初始化参数 var multiPartEmail = new SmartbiMultiPartEmail(); var systemConfigService = new SystemConfigService(connector); var configList = systemConfigService.getSystemConfigs(); var mailServer = null; var fromAddress = null; var userName = null; var password = null; var encryptPassword = null; var emailSSLEnabled = null; var emailTLSEnabled = null; var mailAlias = null; var port = ""; for (var i = 0; i < configList.size(); i++) { var config = configList.get(i); if (config!=null) { if (config.getKey().equals("EMAIL_SMTP_SERVER")) { mailServer = config.getValue(); } else if (config.getKey().equals("EMAIL_USER_NAME")) { userName = config.getValue(); } else if (config.getKey().equals("EMAIL_USER_ALIAS")){ mailAlias = config.getValue(); } else if (config.getKey().equals("EMAIL_USER_ADDRESS")) { fromAddress = config.getValue(); } else if (config.getKey().equals("EMAIL_USER_PASSWORD")) { password= config.getValue(); } else if (config.getKey().equals("EMAIL_USER_PASSWORD_ENCRYPT")) { encryptPassword = config.getValue(); } else if (config.getKey().equals("EMAIL_SSL_ENABLED")) { if (config.getValue().equals("true")) { emailSSLEnabled = true; } } else if (config.getKey().equals("EMAIL_TLS_ENABLED")) { if (config.getValue().equals("true")) { emailTLSEnabled = true; } } else if (config.getKey().equals("EMAIL_SMTP_PORT")) { //端口 port = config.getValue().trim(); } } } if (StringUtil.equals(encryptPassword, "true")) { password = AESCryption.decrypt(password); } System.out.println(mailServer); System.out.println(fromAddress); System.out.println(password); multiPartEmail.setHostName(mailServer); if (!StringUtil.isNullOrEmpty(password)) { multiPartEmail.setAuthentication(userName, password); } if(mailAlias){ multiPartEmail.setFrom(fromAddress, mailAlias); } else{ multiPartEmail.setFrom(fromAddress); } if(emailSSLEnabled){ multiPartEmail.setSSL(true); if(port != ""){ multiPartEmail.setSslSmtpPort(port); } } if(emailTLSEnabled){ multiPartEmail.setTLS(true); } if(port != "" && !emailSSLEnabled){ multiPartEmail.setSmtpPort(port); } multiPartEmail.addTo("zhouyan@smartbi.com.cn");//接收邮箱地址 multiPartEmail.setCharset("GBK");//邮件内容字符集 multiPartEmail.setSubject("测试邮件");//邮件标题 // var sb = new StringBuffer(); // sb.append("<html><body><p>这是一个系统自动发送的邮件,请勿回复。</p></body></html>"); // sb.append("\n"); report = new SSReport(connector); report.open("I4028812115561f6c01449562ca190067"); //报表资源ID //report.setParamValue(String id, String value, String displayValue);//设置报表的参数默认值 var os = new ByteArrayOutputStream(); report.doExport("HTML","","",os,"","",""); var html = os.toString("utf8"); //logger.info(html); report.close(); //发送邮件 multiPartEmail.setHtmlMsg(html); multiPartEmail.send();
注:设置参数默认值可参考以下方式: