很多公司都有这样的需求,希望系统可以定时邮件发送一些统计报表给到相关人员,以便做数据分析,或者是希望做单时,发送单据内容给到相关人员提醒审核和备案,下面分享一种十分简单方便的实现方式,javamail+4gl+perl脚本实现;
1:在aooi999配置好系统标准的javamail 功能,测试可以正常发送报表邮件,配置方式可以百度
2:添加邮件发送功能函数,可以参考cl_prt里面的发邮件功能,我简化了一些东西代码如下:

FUNCTION p_sendmail1(l_xml)
DEFINE p_chk    LIKE type_file.chr100
DEFINE l_cmd    STRING
DEFINE l_top    STRING
DEFINE l_tempdir    STRING
DEFINE res      LIKE type_file.num5
DEFINE l_xml        RECORDfile         STRING,  #XML檔名(不含路徑,檔案放置在os.Path.join(FGL_GETENV("TEMPDIR")底下)mailserver   STRING,  #MAIL SERVER IPserverport   STRING,  #MAIL SERVER Portuser         STRING,  #MAIL SERVER Userpasswd       STRING,  #MAIL SERVER User Passwordcheckauth    LIKE type_file.chr1,    #No.FUN-690005 VARCHAR(1), #CheckAuthsubject      STRING,  #信件主旨body         STRING,  #信件本文內容檔路徑attach       STRING,  #信件附件檔路徑recipient    STRING,  #收件者cc           STRING,  #副本bcc          STRING,  #密件副本sender       STRING   #寄件者END RECORDDEFINE l_mlj        RECORD LIKE mlj_file.*
DEFINE l_str        STRING
DEFINE lc_channel    base.Channel
DEFINEch                            base.Channel,l_status                      SMALLINT,l_index                       SMALLINT,l_temp                        STRING,l_text                        STRINGLET res = 1
{INITIALIZE l_mlj.* TO NULL
SELECT * INTO l_mlj.*  FROM mlj_file WHERE mlj01 = "DEFAULT"INITIALIZE l_xml.* TO NULLLET l_top = fgl_getenv("TOP")
LET l_tempdir =fgl_getenv("TEMPDIR")#  生成XML文件写入系统
LET l_xml.file = p_chk CLIPPED,'.xml'  #按传入的名称
LET l_xml.mailserver = l_mlj.mlj03   #邮件主机
LET l_xml.serverport = l_mlj.mlj04   #邮件主机端口
LET l_xml.user = l_mlj.mlj05         #邮件主机用户
LET l_xml.passwd = l_mlj.mlj06       #邮件主机密码
LET l_xml.checkauth = l_mlj.mlj08    #认证
LET l_xml.sender = 'caozq@test.com' #寄件人
LET l_xml.subject ='TEST'            #邮件主旨LET l_xml.body = l_tempdir CLIPPED,'/',p_body CLIPPED          #文本内容
LET l_xml.attach = l_tempdir CLIPPED,'/',p_attach CLIPPED            #附件地址
LET l_xml.recipient = '839438304@qq.com'  #收件人
#LET l_xml.cc = g_xml.cc
#LET l_xml.bcc = g_xml.bcc}#########產生for javamail的xml檔############
LET l_tempdir =fgl_getenv("TEMPDIR")
LET l_top = fgl_getenv("TOP")LET lc_channel = base.Channel.create()LET l_str = os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED) CALL lc_channel.openFile(l_str, "w")CALL lc_channel.setDelimiter("")CALL lc_channel.write("<?xml version=""1.0"" encoding=""UTF-8""?>") #No.FUN-740189CALL lc_channel.write("<Mail>")CALL lc_channel.write("<Protocol>smtp</Protocol>")LET l_str = '<CheckAuth>',l_xml.checkauth CLIPPED,'</CheckAuth>'CALL lc_channel.write(l_str CLIPPED)LET l_str = '<MailServer>',l_xml.mailserver CLIPPED,'</MailServer>'CALL lc_channel.write(l_str CLIPPED)LET l_str = '<MailServerPort>',l_xml.serverport CLIPPED,'</MailServerPort>'CALL lc_channel.write(l_str CLIPPED)LET l_str = '<MailServerUser>',l_xml.user CLIPPED,'</MailServerUser>'CALL lc_channel.write(l_str CLIPPED)LET l_str = '<MailServerUserPassword>',l_xml.passwd CLIPPED,'</MailServerUserPassword>'CALL lc_channel.write(l_str CLIPPED)Let l_str = '<Subject>',l_xml.subject CLIPPED,'</Subject>'CALL lc_channel.write(l_str CLIPPED)IF NOT cl_null(l_xml.body) THENLET l_str = '<MessageBody>',l_xml.body CLIPPED,'</MessageBody>'CALL lc_channel.write(l_str CLIPPED)END IFIF NOT cl_null(l_xml.attach) THENLET l_str = '<Attach>',l_xml.attach CLIPPED,'</Attach>'CALL lc_channel.write(l_str CLIPPED)END IFLET l_str = '<Recipient>',l_xml.recipient CLIPPED,'</Recipient>'CALL lc_channel.write(l_str CLIPPED)IF NOT cl_null(l_xml.cc) THENLET l_str = '<CCRecipient>',l_xml.cc CLIPPED,'</CCRecipient>'CALL lc_channel.write(l_str CLIPPED)END IFIF NOT cl_null(l_xml.bcc) THENLET l_str = '<BCCRecipient>',l_xml.bcc CLIPPED,'</BCCRecipient>'CALL lc_channel.write(l_str CLIPPED)END IFLET l_str = '<From>',l_xml.sender CLIPPED,'</From>'CALL lc_channel.write(l_str CLIPPED)CALL lc_channel.write("</Mail>")CALL lc_channel.close()#將產生給javamail的xml檔轉成客戶端的編碼
#  生成XML文件写入系统
LET l_cmd="chmod 777 ",os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)," 2>/dev/null"     #FUN-8B0011
RUN l_cmdLET l_cmd="sh ",l_top CLIPPED,"/ds4gl2/bin/javamail/UnixMailSender.bat ",os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)," >/u1/out/caozq.txt" #FUN-510006 FUN-8B0011
RUN l_cmd  IN FORM MODE RETURNING resif res = 0 then let l_str = "Send ok" else let l_str = "Send fail"end if
#读取caozq.txt,判断是否成功
SLEEP 1 LET ch = base.Channel.create()
CALL ch.openFile('/u1/out/caozq.txt','r')
LET l_status = ch.read(l_temp)
WHILE l_status
LET l_text = l_text.trim(),l_temp.trim()
LET l_status = ch.read(l_temp)
END WHILELET l_index = 0
LET l_index = l_text.getIndexOf('successfully',1)
IF l_index > 0 THENlet l_str = "Send ok" else let l_str = "Send fail"
END IF END FUNCTION 

代码可以独立做一个公用函数,其他函数调用的时候只需要传入g_xml数组就能实现自动发邮件了

下面是例子

#######################################
#apmt540采购单发出时自动发邮件给供应商#
#######################################
FUNCTION p_sendmail_apmt540(p_prog,p_docno)
DEFINE p_prog         LIKE type_file.chr100
DEFINE p_docno         LIKE type_file.chr100
DEFINE lc_channel    base.Channel
DEFINE l_pmn      RECORDpmn01    LIKE pmn_file.pmn01,pmn02    LIKE pmn_file.pmn02,pmn04    LIKE pmn_file.pmn04,ima02    LIKE ima_file.ima02,ima021   LIKE ima_file.ima021,pmn20    LIKE pmn_file.pmn20,pmn07    LIKE pmn_file.pmn07END RECORD
DEFINE l_xml        RECORDfile         STRING,  #XML檔名(不含路徑,檔案放置在os.Path.join(FGL_GETENV("TEMPDIR")底下)mailserver   STRING,  #MAIL SERVER IPserverport   STRING,  #MAIL SERVER Portuser         STRING,  #MAIL SERVER Userpasswd       STRING,  #MAIL SERVER User Passwordcheckauth    LIKE type_file.chr1,    #No.FUN-690005 VARCHAR(1), #CheckAuthsubject      STRING,  #信件主旨body         STRING,  #信件本文內容檔路徑attach       STRING,  #信件附件檔路徑recipient    STRING,  #收件者cc           STRING,  #副本bcc          STRING,  #密件副本sender       STRING   #寄件者END RECORD
DEFINE l_mlj        RECORD LIKE mlj_file.*
DEFINE l_tempdir    STRING
DEFINE l_str        STRING
DEFINE l_filename   LIKE type_file.chr1000
DEFINE l_xls           LIKE type_file.chr1000
DEFINE l_chr        VARCHAR(8000)
DEFINE l_cmd        VARCHAR(8000)INITIALIZE l_xml.* TO NULL
INITIALIZE l_mlj.* TO NULL
SELECT * INTO l_mlj.*  FROM mlj_file WHERE mlj01 = "DEFAULT"
LET l_tempdir =fgl_getenv("TEMPDIR")#生成附件程序
LET l_filename = p_docno  CLIPPED,'.txt'
LET l_xls      = p_docno  CLIPPED,'.xls'
LET lc_channel = base.Channel.create()
LET l_str = os.Path.join(l_tempdir CLIPPED,l_filename CLIPPED)
CALL lc_channel.openFile(l_str, "w")
CALL lc_channel.setDelimiter("")
CALL lc_channel.write("采购单号|*|项次|*|料件编号|*|品名|*|规格|*|数量|*|单位")
DECLARE caozq_01 CURSOR FOR
SELECT pmn01||'|*|'||pmn02||'|*|'||pmn04||'|*|'||ima02||'|*|'||ima021||'|*|'||pmn20||'|*|'||pmn07 FROM pmn_file,ima_file where pmn04=ima01 AND  pmn01=p_docno
FOREACH caozq_01 INTO  l_chr
CALL lc_channel.write(l_chr CLIPPED)
END FOREACH
CALL lc_channel.close()
#将文件转换成xls
LET l_cmd =  "/u1/topprod/topcust/czz/4gl/txt2xlszqcao.pl  "||l_tempdir CLIPPED,'/',l_filename CLIPPED ||"  "||l_tempdir CLIPPED,'/',l_xls CLIPPED||" "     #转换xls
RUN l_cmd
#生成之后,调用mail 发送
LET l_xml.file =p_prog CLIPPED,p_docno CLIPPED   #XML文件名称
LET l_xml.mailserver = l_mlj.mlj03   #邮件主机
LET l_xml.serverport = l_mlj.mlj04   #邮件主机端口
LET l_xml.user = l_mlj.mlj05         #邮件主机用户
LET l_xml.passwd = l_mlj.mlj06       #邮件主机密码
LET l_xml.checkauth = l_mlj.mlj08    #认证
LET l_xml.sender = 'caozq@xxx.com' #寄件人
LET l_xml.subject =p_docno,'采购单'            #邮件主旨LET l_xml.body = 'test' CLIPPED          #文本内容
LET l_xml.attach = l_tempdir CLIPPED,'/',l_xls CLIPPED            #附件地址
LET l_xml.recipient = '839438304@qq.com'  #收件人
#LET l_xml.cc = g_xml.cc
#LET l_xml.bcc = g_xml.bccCALL p_sendmail1(l_xml.*)
END FUNCTION 

里面写的是将数据抓取出来后,先以字串形式写入到一个txt文档,最后通过perl转换成EXCEL档,再将以附件的形式发送到指定收件人,嗯,就是这样!

附上perl脚本代码:

#!/usr/bin/perl -w
use strict;
use Spreadsheet::WriteExcel;
#use Text::CSV::Encoded;
use Encode;
if (($#ARGV < 1) || ($#ARGV > 2)) {die("Usage: csv2xls txtfile.txt newfile.xls\n");
};my $workbook  = Spreadsheet::WriteExcel->new($ARGV[2]);# Open the Comma Separated Variable fileopen  CSVFILE, '<:utf8', $ARGV[0] or die "$ARGV[0]: $!";my $worksheet = $workbook->add_worksheet('Scrap_list');my $row = 0;$worksheet->set_column(0,5,14);while (<CSVFILE>) {s/[\001-\037]//g;my @list = split /\|\*\|/,$_;my $col = 0;foreach my $token (@list) {if  ($token=~/^0[^.]/) {$worksheet->write_string($row, $col, $token );}else{ $worksheet->write($row, $col, $token);}$col++;}$row++;}close(CSVFILE);$workbook->close();

转载于:https://blog.51cto.com/8434270/2050752

tiptop自定义发送邮件相关推荐

  1. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱try{MailMessage mail = new MailMessage ...

  2. python自建邮件服务器,9行自定义函数教你用Python发送电子邮件!

    作者 l 刘顺祥 来源 l 数据分析1480 前言 大概是在两三个月前,陆续有几位在职朋友问我如何使用Python发送邮件,说心里话这方面的操作在我之前的工作履历中真的没有碰到,所以我没有很好地帮助他 ...

  3. pyton笔记-part1

    1.安装python一定要配置环境变量,python分为2.x,3.x,一般用2.x 2.对python而言可以使用pycharm2.7作为图形化界面工具 3.使用input()函数,注意在键盘输入的 ...

  4. Jenkins详细邮件配置

    Jenkins邮件配置 新建一个自由风格的软件项目 添加构建,配置如图所示: 注:这里以一个执行postman接口测试命令为例 命令如下 @echo off echo 接口测试开始执行 newman ...

  5. Maven项目之错误日志发邮件通知

    1.主要通过logback.xml配置,该文件位于src/main/resource目录下 <?xml version="1.0" encoding="UTF-8& ...

  6. dedecms自定义表单 发送邮件

    需求: 接收用户提交的手机号 存储之后 给默认邮箱发送邮件 一 自定义表单 第一步:核心-频道模型-自定义表单-增加新的自定义表单. 第二步:"自定义表单名称"和"数据表 ...

  7. Django 六——自定义标签、图片验证码、发送邮件、评论树、组合搜索

    1.自定义标签 2.图片验证码 3.生成邮箱验证码.发送邮件 4.评论树实现 5.组合搜索(Q) 1.自定义标签 配置: a.在app中新建文件夹  templatetags,里面新建  xx.py文 ...

  8. java使用自定义HTML模板发送邮件——记录开发篇1

    java使用自定义HTML模板发送email VO接收参数 @Data public class EmailVo {@ApiModelProperty("收件人列表")@NotNu ...

  9. TIPTOP 4GL——自定义按钮前加图标

    对于TIPTOP系统,标准的按钮都有相对应的小图标,如下图: 但是对于自己添加的按钮,很少有小图标的: 那下面我就分析一下怎么让自己加的按钮也有小图标:看效果(右边按钮): [当然我这个是直接用的系统 ...

最新文章

  1. Linux下监控文件系统
  2. 操作系统第一篇【引论】
  3. python vs java的rsa加密
  4. PyQt4编程之简短地做出多个选择框
  5. Jackson 注解 -- 忽略字段
  6. printf不明确_资源贴|不是吧,还有人不知道指针?你想知道还不点进来看看?...
  7. newduba首页怎么去掉_京喜小程序首页瘦身实践
  8. 【Maccmsv10 站群深度定制版 开发日志】核心功能:紧急优化模块
  9. 【华为云技术分享】云图说|人工智能新科技—文字识别服务
  10. java 浅堆 深堆_【深入浅出-JVM】(57):深堆、浅堆
  11. Linux命令第一篇
  12. 【实习】大三暑假实习总结:工作记录、个人日记、感悟总结
  13. IT群侠传第二回一专多能
  14. eclipse里面运行tomcat显示无法显示页面
  15. 运放的 零点和极点快速找到
  16. python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...
  17. poi给Word添加“下一页”
  18. 服务器托管是什么?需要注意哪些问题?
  19. 【Java8】 lambda 特性讲解
  20. 将dataset中的数据导出至Excel中而不需要安装MS Excel的方法(含UNICODE支持)

热门文章

  1. 设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。
  2. 宽带连接怎么修改服务器名称地址,宽带连接怎么修改服务器名称地址
  3. Python绘制图像(Matplotlib)(Ⅵ)
  4. luogu P2124 奶牛美容
  5. 拆机详解2:比Macintosh还早?苹果Lisa拆解
  6. 我滴python第一周笔记
  7. 【LeetCode刷题笔记-87 42:接雨水(三解法)】
  8. awvs安装及问题解决
  9. android 输入法 sd卡,关于安卓手机内置或外置SD卡中各文件夹的名称和作用
  10. 谷歌2017面经题集