在VFP中利用API实现批量邮件发送

Author: 谢古今 Date: 2001年 31期

?牐犛玫缱佑始肱笥选⒖突Щ蚯子蚜狄丫晌浅A餍械姆绞健T诠芾硐低持惺迪值缱佑始δ芟匀皇呛苁屎嫌没Ш褪谐》⒄剐枨蟮拿髦侵佟5比皇迪址⑺偷缱佑始δ懿⒉焕?难,实现批量邮件发送功能才是有更大的实用意义的举措。我们在开发《实验室管理系统labman2001》(下载主页:http://labman.yeah.net)的时候,充分考虑了这样的需求,完整地实现了批量邮件发送功能。当然,实现这样的功能需要用到Windows的API函数,可能许多的用户觉得API非常的神秘,不敢轻易去尝试。事实上,API功能非常强大,许多功能的实现非此不可。其实掌握一定的规律,API就不那么困难了。下面简要说明如何实现。
  ?牐犈坑始⑺捅淼ィㄈ鏭31020503a^)包含四个命令按钮(“选择包含邮件表”、“确认邮件列表”、“转到邮件处理器”、“退出”),两个标签,一个下拉组合框,一个编辑框,一个文本框(与下拉组合框重合)。处理的流程是这样的:程序先检测是否有打开的表,如果有,就不提示,没有就提示目前没有打开的表,可以单击“选择包含邮件表”,选择一个数据表打开。以后就可以从下拉组合框中选择包含邮件地址的字段,然后单击“确认邮件列表”,筛选符合条件的邮件地址,这些邮件地址会出现在编辑框里面。如果想删除或添加邮件地址,就可以在编辑框中进行。接下来单击“转到邮件处理器”,则这些电子邮件地址会被系统默认的邮件接受和发送程序如Foxmail、Outlook等程序接受作为“收件人”,并且出现邮件编辑窗口,在编辑窗口就可以方便地写信啦!下面依次说明核心代码。
  ?牐牎把≡癜始怼钡氖蟊甑セ魇录耄?
  ?牐爉.cfilename2 = getfile(“dbf”)  &&显示文件打开选择窗口,选择一个dbf文件
  ?牐爄f file(m.cfilename2)= .t.
  ?牐爑se &cfilename2 exclusive  &&以独占方式打开表
  ?牐爀lse
  ?牐爎eturn
  ?牐爀ndif
  ?牐爐hisform.cbomailziduan.RowSourceType = 8  &&确定数据源类型为表结构
  ?牐爐hisform.cbomailziduan. RowSource = cfilename2  &&确定数据源名称
  ?牐犗吕楹峡騝bomailziduan的鼠标单击事件代码:
  ?牐爐hisform.txtmailziduan.value = thisform.cbomailziduan.value
  ?牐牎叭啡嫌始斜怼? 的鼠标单击事件代码:
  ?牐爄f dbf(1)==''
  ?牐爄f messagebox(“没有打开的表,请选择包含邮件表重试!”,64,“邮件处理”)=1
  ?牐爎eturn
  ?牐爀ndif
  ?牐爀ndif
  ?牐燿o form frm查找 &&利用vfp本身提供的一个查找类构造一个查找表单。符合条件的记录将被下面的程序利用。
  ?牐燽rowse nomenu noedit nodelete  &&显示符合条件的记录
  ?牐爉.lcemail=upper(alltrim(thisform.txtmailziduan.value))&&获取电子邮件字段名称
  ?牐爉.lmailok = .f.
  ?牐?&&检查字段是否存在。
  ?牐爁or i =1 to fcount?煟?
  ?牐爄f m.lcemail <> field(i)??
  ?牐爀lse
  ?牐爉.lmailok = .t.
  ?牐爀xit
  ?牐爀ndif
  ?牐爀ndfor
  ?牐爄f m.lmailok == .f.
  ?牐爄f messagebox(“表中不存在该字段,请修改字段名重试!”,64,“邮件处理”)=1
  ?牐爎eturn
  ?牐爀ndif
  ?牐爀ndif
  ?牐?&&在下面的程序段中,将把符合条件的数据输出到一个文本文件。再把文本内容读入edtmaillist编辑框供编辑修改。
  ?牐爄f file(“maillist.txt”)= .t.
  ?牐燿elete file  maillist.txt  &&如果临时文件已经存在,则先删除。
  ?牐爀ndif
  ?牐燙OPY TO maillist FIELDS &lcemail TYPE DELIMITED WITH blank
  ?牐燞andlemail = fopen(“maillist.txt”)
  ?牐爉.cmail=''
  ?牐?&&读取邮件地址的程序段。
  ?牐燿o while .not. feof(handlemail)
  ?牐爉.cmail = alltrim(fgets(handlemail))+','+m.cmail
  ?牐爀nddo
  ?牐爐hisform.edtmaillist.value = m.cmail
  ?牐爁close(handlemail)
  ?牐爄f file(“maillist.txt”)= .t.
  ?牐燿elete file  maillist.txt
  ?牐爀ndif
  ?牐爎eturn
  ?牐牎白接始?理器” 的鼠标单击事件代码:
  ?牐爔gjfileopen(“mailto:” + thisform.edtmaillist.value)
  ?牐爎eturn
  ?牐牨淼サ腶ctivate事件代码:
  ?牐燬ET PROCEDURE TO  XGJUDF
  ?牐爄f dbf(1)==''
  ?牐爄f messagebox(“没有打开的表,请选择包含邮件表重试!”,64,“邮件处理”)=1
  ?牐爎eturn
  ?牐爀ndif
  ?牐爀ndif
  ?牐爐hisform.cbomailziduan.RowSourceType = 8  &&指定下拉组合框的数据源类型。
  ?牐爐hisform.cbomailziduan.RowSource = alias(1)  &&指定下拉组合框的数据源。
  ?牐爔gjudf中的xgjfileopen()函数
  ?牐?********
  ?牐牶得鳎豪肁PI中的ShellExecute函数,调用相应程序处理文件的打开,如.doc文件用Word打开,发邮件使用默认的邮件处理器。
  ?牐牪问齧.cxgjfilename代表文件的名字,如发邮件写m.cxgjfilename=“mailto:labman2001@sina.com”,打开rtf文件可写 m.cxgjfilename=“C:\Documents and Settings\xgj\My Documents\客户.rtf”
  ?牐?********
  ?牐爁unction xgjfileopen()
  ?牐爌arameter m.cxgjfilename
  ?牐?&& 声明ShellExecute函数
  ?牐燚ECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,;
  ?牐燬TRING lpszOP,;??
  ?牐燬TRING lpszFile,; ??
  ?牐燬TRING lpszParams,; ??
  ?牐燬TRING lpszDir,;??
  ?牐營NTEGER fsshowcmd
  ?牐?&& 声明GetDesktopWindow函数,该函数激活Windows桌面
  ?牐燚ECLARE INTEGER GetDesktopWindow IN win32api
  ?牐?&& 指定从Windows桌面上运行ShellExecute函数
  ?牐燞WND = GetDesktopWindow?煟?
  ?牐爈pszOP = “”
  ?牐?&& 指定ShellExecute操作的文件为mailto:labman2001@sina.com
  ?牐爈pszFile = alltrim(m.cxgjfilename)??
  ?牐爈pszParams = “”
  ?牐?&&指定ShellExecute的缺省目录为C:\
  ?牐爈pszDir = “C:\”
  ?牐爁sshowcmd = 1
  ?牐?&& 执行ShellExecute命令
  ?牐燣NRETURN=ShellExecute(HWND,lpszOP,lpszFile,lpszParams,lpszDir,fsshowcmd)?牐爎eturn