Board logo

标题: [其他] 给财务的同事写的批量发送工资详情邮件的批处理 [打印本页]

作者: amwfjhh    时间: 2015-1-23 15:01     标题: 给财务的同事写的批量发送工资详情邮件的批处理

本帖最后由 amwfjhh 于 2015-1-23 15:06 编辑

财务每个月要统计每个人工资详情,会有一张工资明细表,反正有这个数据,就在此基础上帮她们写个批量发送邮件的批处理。需要用到两个文件:
工资明细.csv,形如以下格式
  1. 姓名,卡号,基本工资,住房补贴,浮动,预付奖金,双薪,加班、其他等,小计,住房金,其他,考勤,税前合计,计算所得税金额,税,应发数,已发,实发数
  2. 赵一,6222611111111111111,2600,400,1000,3000,3000,200,10200,180,,,10020,6520,749,9271,,9271
  3. 钱二,6222611111111112222,2600,400,500,3000,3000,100,9600,180,,,9420,5920,629,8791,,8791
  4. 孙三,6222611111111113333,2500,,500,3000,2500,100,8600,150,,,8450,4950,435,8015,,8015
  5. 李四,6222611111111114444,4000,,1000,3000,,,8000,240,,,7760,4260,321,7439,,7439
  6. 周五,6222611111111115555,4000,,1000,3000,,,8000,240,,,7760,4260,321,7439,,7439
复制代码
名单.csv,形如以下格式
  1. 姓名,邮箱,电话
  2. 赵一,aaa@QQ.COM,13811111111
  3. 钱二,bbb@qq.com,18622222222
  4. 孙三,ccc@qq.com,13833333333
  5. 李四,ddd@qq.com,13044444444
  6. 周五,eee@qq.com,13855555555
复制代码
发送邮件需要用到第三方邮件工具,blat,可于其官网上下载,本论坛有介绍http://bbs.bathome.net/viewthread.php?tid=7465&highlight=blat
实际应用中由于财务的工作分区是NTFS格式的,为了避免其拷贝时忘了附带上blat.exe,于是将其附于批处理本身的流文件中。type blat.exe>"batfile.bat:blat.exe",
具体代码如下:
  1. @if (0)==(0) echo off
  2. setlocal enabledelayedexpansion
  3. chcp 437&graftabl 936
  4. REM 变量初始化
  5. prompt $
  6. title **工资详情批量发送工具.::By KOUKON::.
  7. COLOR 9e
  8. :_start
  9. cls
  10. set /p "from=请输入你的邮箱地址:"
  11. echo,%from% | findstr ".*@[0-9a-zA-Z]*\.[0-9a-zA-Z]*.*" >nul 2>nul || (
  12.   echo,不合法邮箱地址,请重新输入...
  13.   pause
  14.   goto :_start
  15. )
  16. for /f "tokens=1,* delims=@" %%i in ('echo %from%') do (
  17.   set "user=%%i"
  18.   set "server=smtp.%%j"
  19. )
  20. echo,用户名 : %user%
  21. echo,服务器 : %server%
  22. set/p"=请输入邮箱登录密码:"<nul
  23. REM 生成取得字符程序
  24. pushd %tmp%
  25. echo,hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com
  26. for /f "tokens=*" %%a in ('in.com') do (
  27.   set "pass=%%a"
  28. )
  29. del /f in.com
  30. popd
  31. echo,
  32. REM echo,密码 : !pass!
  33. :_next
  34. REM set /p "to=请输入你要发送的邮箱:"
  35. set "x=X-Header-Test "Can Blat do it Yes it Can!""
  36. set "debug=-log MailLog.log -timestamp "
  37. cd.>MailLog.log
  38. REM 获取详情
  39. set /p "strFile=拖入整理好的工资条列表(csv格式文件):"
  40. :_readContent
  41. echo,下面开始读取工资详情……
  42. echo,&echo,
  43. for /f "skip=1 tokens=*" %%u in ('type %strFile%') do (
  44.   set "Line=%%u"
  45.   REM cscript -nologo -e:jscript %~s0 DealNullChar "!Line!"
  46.   for /f "tokens=*" %%v in ('cscript -nologo -e:jscript %~s0 DealNullChar "!Line!"') do set "Line=%%v"
  47.   REM echo,处理后内容 : !Line!
  48.   for /f "tokens=1-18 delims=," %%a in ('echo,!Line!') do (
  49.     (
  50.     echo,%%a:
  51.     echo,    您好。这是本月工资详单,请查阅。
  52.     set/p"=姓    名 : "<nul
  53.     if "%%a" NEQ "null" (echo,%%a) else echo,
  54.     set/p"=卡    号 : "<nul
  55.     if "%%b" NEQ "null" (echo,%%b) else echo,
  56.     set/p"=基本工资 : "<nul
  57.     if "%%c" NEQ "null" (echo,%%c) else echo,
  58.     set/p"=住房补贴 : "<nul
  59.     if "%%d" NEQ "null" (echo,%%d) else echo,
  60.     set/p"=浮    动 : "<nul
  61.     if "%%e" NEQ "null" (echo,%%e) else echo,
  62.     set/p"=预付奖金 : "<nul
  63.     if "%%f" NEQ "null" (echo,%%f) else echo,
  64.     set/p"=奖    金 : "<nul
  65.     if "%%g" NEQ "null" (echo,%%g) else echo,
  66.     set/p"=加班其它 : "<nul
  67.     if "%%h" NEQ "null" (echo,%%h) else echo,
  68.     set/p"=小    计 : "<nul
  69.     if "%%i" NEQ "null" (echo,%%i) else echo,
  70.     set/p"=住 房 金 : "<nul
  71.     if "%%j" NEQ "null" (echo,%%j) else echo,
  72.     set/p"=其    他 : "<nul
  73.     if "%%k" NEQ "null" (echo,%%k) else echo,
  74.     set/p"=考    勤 : "<nul
  75.     if "%%l" NEQ "null" (echo,%%l) else echo,
  76.     set/p"=税前合计 : "<nul
  77.     if "%%m" NEQ "null" (echo,%%m) else echo,
  78.     set/p"=计税金额 : "<nul
  79.     if "%%n" NEQ "null" (echo,%%n) else echo,
  80.     set/p"=扣    税 : "<nul
  81.     if "%%o" NEQ "null" (echo,%%o) else echo,
  82.     set/p"=应 发 数 : "<nul
  83.     if "%%p" NEQ "null" (echo,%%p) else echo,
  84.     set/p"=已    发 : "<nul
  85.     if "%%q" NEQ "null" (echo,%%q) else echo,
  86.     set/p"=实 发 数 : "<nul
  87.     if "%%r" NEQ "null" (echo,%%r) else echo,
  88.     echo,        ****公司 财务部
  89.     echo,        %date%
  90.     ) >"mailBody.dat"
  91.     REM find /v ""<"mailBody.dat"
  92.     REM ECHO,%%a, %%b, %%c, %%d, %%e, %%f, %%g, %%h, %%i, %%j, %%k, %%l, %%m, %%n, %%o, %%p, %%q, %%r
  93.     set "strName="
  94.     set "strMail="
  95.     set "strTel="
  96.     for /f "tokens=*" %%w in ('findstr /c:"%%a" 名单.csv') do (
  97.       for /f "tokens=1-3 delims=," %%1 in ('cscript -nologo -e:jscript %~s0 DealNullChar "%%~w"') do (
  98.         echo,姓名 : %%1
  99.         echo,邮箱 : %%2
  100.         echo,手机 : %%3
  101.         set "subj=%%1 工资详单"
  102.         if "%%1" NEQ "" if "%%1" NEQ "null" set "strName=%%1"
  103.         if "%%2" NEQ "" if "%%2" NEQ "null" set "strMail=%%2"
  104.         if "%%3" NEQ "" if "%%3" NEQ "null" set "strTel=%%3"
  105.       )
  106.     )
  107.     REM echo,strName : !strName!
  108.     REM echo,strMail : !strMail!
  109.     REM echo,strTel  : !strTel!
  110.    
  111.     if "!strName!" NEQ "" (
  112.       echo,发送邮件至 !strMail!
  113.       if "!strMail!" NEQ "" (
  114.         start "" /WAIT /b %~s0:blat.exe -server %server% -u %user% -pw %pass% -f %from% -to "!strMail!" -s "!subj!" -bodyF "mailBody.dat" -charset "GBK" -debug %debug%
  115.       ) else (
  116.         echo,未检测到登记邮箱,跳过此步骤
  117.       )
  118.       
  119.       echo,检测手机号
  120.       if "!strTel!" NEQ "" (
  121.         for /f "tokens=*" %%z in ('cscript -nologo -e:jscript %~s0 IsCM "!strTel!"') do (
  122.           if %%z NEQ 0 (
  123.             echo,当前用户手机号为移动号码,可以推送至手机邮箱
  124.             start "" /WAIT /b %~s0:blat.exe -server %server% -u %user% -pw %pass% -f %from% -to "!strTel!@139.com" -s "!subj! 手机推送" -bodyF "mailBody.dat" -charset "GBK" -debug %debug%
  125.           ) else (
  126.             echo,非移动手机号,跳过手机推送步骤
  127.           )
  128.         )
  129.       ) else (
  130.         echo,未登记手机号,跳过此步骤
  131.       )
  132.     ) else (
  133.       echo,★★★当前统计人员【%%a】:该条工资明细无登记联系方式,跳过邮件发送步骤★★★
  134.     )
  135.    
  136.     echo,&echo,
  137.   )
  138. )
  139. pause>nul
  140. del /f "mailBody.dat"
  141. goto :EOF
  142. @end
  143. var fun = WScript.arguments(0);
  144. switch (fun){
  145. case "IsCM":
  146.   CheckArgs(2);
  147.   var strTel = WScript.arguments(1);
  148.   IsCM(strTel);
  149.   break;
  150.   
  151. case "DealNullChar":
  152.   CheckArgs(2);
  153.   var strContent = WScript.arguments(1);
  154.   DealNullChar(strContent);
  155.   break;
  156.   
  157. case "RegTest":
  158.   CheckArgs(2);
  159.   var strContent = WScript.arguments(1);
  160.   RegTest(strContent);
  161.   break;
  162.   
  163. default:;
  164. }
  165. function CheckArgs(num){
  166.   if (WScript.arguments.length < num){
  167.     WScript.echo("参数不齐");
  168.     WScript.quit();
  169.   }
  170. }
  171. function IsCM(strTel){
  172.   var reg = /^(\+86)?1((3[4-9])||(5[0-28-9])||(8[278]))\d{8}$/g;
  173.   WScript.echo(reg.test(strTel));
  174. }
  175. function DealNullChar(strContent){
  176.   var reg = /,,/g;
  177.   while (true) {
  178.     strContent = strContent.replace(reg, ",null,");
  179.     //WScript.echo("处理后结果 : " + strContent);
  180.     var ret = RegTest(strContent);
  181.     //WScript.echo("正则 " + reg + " 符合度判断结果 : " + ret);
  182.     if (!ret) break;
  183.   }
  184.   WScript.echo(strContent);
  185. }
  186. function RegTest(strContent){
  187.   var reg = /,,/g;
  188.   var ret = reg.test(strContent);
  189.   //WScript.echo(ret);
  190.   
  191.   return ret;
  192. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2