当前位置:

首页 > 编程开发 > Delphi7中群发Email邮件的方法

Delphi7中群发Email邮件的方法

在Delphi7环境下,通过安装WinWebMail邮件服务器、配置Indy控件及SMTP账户,实现了考生信息的批量邮件群发。函数封装了发送及地址合法性判断流程,每50封邮件延迟2秒,并注意了反垃圾邮件限制及验证模式问题。

本文目录

    这段时间接到一个任务:需要把所有考生的信息及考试信息通过电子邮件群发出去。在Delphi 7环境下折腾了好一阵子,总算调试成功。这里把实现过程梳理一下,给有类似需求的朋友作个参考。

    Delphi7中群发Email邮件的方法

    整体思路其实并不复杂,分几步走:

    1、安装局域网版的邮件服务器
    要让服务器能往外网发邮件,还得把DNS设置好。这类软件不少,比如WinWebMail就挺靠谱,直接从官网下载安装就行。

    2、需要用到的控件:Indy 10.0.15
    这个版本通过搜索引擎可以找到,把它装进IDE里。

    3、设置发件邮箱服务器及账号信息

    function setEmailInfo:integer; //返回值0:邮箱设置失败;1:邮箱设置成功
    var
      selectStr:string;
      thisresult:integer;
    begin
      thisresult := 0;
      //设置账户
          IdSMTP1.AuthType := atNone; //或者是atSASL;
          IdSMTP1.Host := hostString;
          IdSMTP1.Username := userNameString;
          IdSMTP1.Password := passWordString;
          try
            IdSMTP1.connect;
            thisresult := 1;
           
            if not IdSMTP1.Authenticate then
              begin
                showmessage('发送邮箱账号验证失败!请检查SMTP账户设置!');
                thisresult := 0;
              end
          except
            showmessage('SMTP服务器连接失败!请检查SMTP账户设置及网络是否正常!');
            thisresult := 0;
          end
        end;
      result := thisresult;
    end;
    

    4、将发送邮件封装成独立函数,发送时注意加延时控制

    procedure sendEmailOnce(emailusername:string;
        formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
    begin
      MsgKsbkxx.From.Name := emailusername;    //邮件发送人姓名
      MsgKsbkxx.From.Address := formAddress; //邮件发送人地址
      MsgKsbkxx.ReceiptRecipient.Address := receiptRecipientAddress; 
        //回复地址,可以与邮件发送人地址不同
      MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //发送地址?
      MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd;  //邮件发送至......地址
      MsgKsbkxx.Subject := emailSubject;  //主题
      MsgKsbkxx.Body.Assign(emailMemo.Lines);  //邮件内容
      IdSMTP1.Send(MsgKsbkxx);  //发送邮件指令
    end;
    

    5、简单判断电子邮件地址的合法性

    //根据字符串Separator的表示将字符串s分隔为若干个字符串,存入rs字符串列表中
    procedure SeparateTerms2(s:string;Separator:string;var rs:TStringList);
    var
      AStr: string;
      idx: Integer;
      ASubStr: string;
    begin
      AStr := Trim(s);
      while Pos(Separator, AStr) > 0 do
      begin
        idx := Pos(Separator, AStr);
        ASubStr := Copy(AStr, 1, idx - 1);
        rs.Add(ASubStr);
        AStr := Copy(AStr, idx + 1, Length(AStr));
      end;
     if AStr+'a' <> 'a' then  rs.Add(AStr); //如果存在剩余的字符串,则将其存入字符串列表中
    end;
    
    //判断某个字符串是否符合电邮邮件地址标准
    //正确:返回ok,错误返回error
    function emailAddressYesOrNo (emailAddress:String):string;
    var
      getStrings:TStringList;
      getYesOrNo:string;
    begin
      getYesOrNo := 'error';
      getStrings := TStringList.Create;
      SeparateTerms2(emailAddress,'@',getStrings);
      if getStrings.Count=2 then
        begin
          getStrings.Clear;
          SeparateTerms2(emailAddress,'.',getStrings);
          if getStrings.Count>1 then  getYesOrNo := 'ok';
        end;
      getStrings.Free;
      result := getYesOrNo;
    end;
    

    6、批量发送电子邮件

    procedure bEmailKsxxClick;
    var
      AccordAmount,i,j,tag:integer;
      emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
    begin
      //判断数据表里面是否有需要发送电子邮件的数据,如果有则发送
      if Bmb.RecordCount >0 then
        AccordAmount := Bmb.RecordCount
      else
        exit;
      //
      //获取账户信息,一般存放在数据表或INI文件中
      emailusername :=  userNameString; //发送邮件人
      formAddress := fromAddressString;  //发送邮件地址
      receiptRecipientAddress := receiptRecipientAddressString;  //回复邮件地址
      emailSubject := emailSubjectString; //邮件主题
     //
      tag := 1;  //标志位:发送出错则停止
      i:=1;  //发送邮件的总数
      j:=0;  //让进度条逐步递进的记录处理条数
      list1.Clear; //显示已经成功发送电子邮件的学员信息
      //判断是否能与设置的邮箱连接,如果返回值为1,则获取邮件内容及相关设置并发送
      if setEmailInfo = 1 then
        begin
          Pb.BlockSize := 1;
          Pb.Max := AccordAmount ;
          Formsjtj.Refresh;
          Bmb.First;
          try
            while (not tBmb.Eof) do
              begin
                //判断邮件地址是否为空且符合电邮规范,如都满足条件则给该地址发送电邮
                if Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' then
                  begin
                    //获取发送邮件的内容
                    emailMemo.Clear;
                    ..........................
                    //设置邮件信息,如发送邮件错误,则直接退出
                    if tag=0 then exit;
                    //发送邮件
                    sendtoAdd :=  trim(Bmb.FieldByName('s_emailAddress').AsString); //需要发送至...邮箱
                    if emailAddressYesOrNo(sendtoAdd)= 'ok' then  //检查电子邮件格式是否正确
                      begin
                        sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject); //发送邮件
                        i := i+1;      //计数器加1
                        list1.Items.Add(......);  //将已经成功发送电邮的考生信息放在列表中
                      end;
                    //
                  end;
                //每发送50封邮件停滞2s钟
                if (i mod 50) = 0 then sleep(2000);
                dm_sjtj.ListBmb.next;
                Application.ProcessMessages ; //循环中处理进程信息
                //刷新进度指示
                j := j+1;
                PB.Progress:=j;
                PB.StepIt ;
                PB.Refresh;
              end;
          finally
            tag := 0;
            IdSMTP1.Disconnect;
          end;
        end;
      showmessage('共发送 '+intToStr(i-1)+' 封邮件。');
    end;
    

    7、需要注意的问题

    ① 滥发电子邮件是国家所不允许的,这个红线千万别碰。
    ② 绝大多数邮件提供商都会对群发行为进行限制,两封邮件之间必须留有一定的延迟时间。建议自己架设邮件服务器来规避这个问题。
    ③ Indy控件只有atNone和atSASL两种验证模式,所以在架设好邮件服务器后,需要将那些不需要验证的IP地址及账号配置进去。
    ④ 内部邮件地址往往无法直接收到回复,因此发件地址和回复地址通常会设成不同的。实际使用中发现,通过浏览器打开邮件没法直接回复,但用Foxmail接收后就可以正常回复,这点需要留意。

    以上就是完整的实现过程,希望能帮到正在折腾Delphi邮件群发的朋友们。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    delphi 2010 场景实战:从需求到落地步骤
    delphi 2010 场景实战:从需求到落地步骤

    Delphi2010在维护旧代码和开发高性能桌面、数据库及工业控制软件方面仍具价值。项目需明确需求、评估可行性,随后搭建环境并规划结构,采用模块化开发。核心阶段应高效利用数据库与语言特性,借助VCL快速构建界面,最终通过调试、测试与规范部署确保质量并交付。

    以前我没学过编程 请问编程从那里学起
    以前我没学过编程 请问编程从那里学起

    编程语言仅为工具,真正决定高度的是数据结构和算法及计算机底层逻辑理解。建议从C语言入门,打好基本功。根据目标选择深入方向,避免同时学习多门语言。最终目标是学会用程序解决问题,语言只是实践载体。

    Java中CountDownLatch和CyclicBarrier的区别与详解
    Java中CountDownLatch和CyclicBarrier的区别与详解

    CountDownLatch与CyclicBarrier均为Java同步工具,核心区别:前者计数器可大于等于线程数,由其他线程控制放行且不可重用;后者计数器必须等于线程数,所有线程到达屏障后统一继续并可循环使用。常用于多线程协作,前者等待完成,后者同步任务。

    delphi 判断字符串是否为纯数字组合
    delphi 判断字符串是否为纯数字组合

    Delphi中判断字符串是否为纯数字组合,常见需求有两种实现方案:一是先去除首尾空格再逐字符检查是否在'0'..'9'范围内,遇非数字即返回假;二是直接遍历字符串,使用Break提前结束循环。核心思路均为字符级判断,区别在于空格处理与退出方式。

    Delphi 常见文件处理及注册表文件的使用实例
    Delphi 常见文件处理及注册表文件的使用实例

    Delphi中借助TRegIniFile类可将注册表操作简化为类似INI文件读写,提供CreateKey、OpenKey、EraseSection及读写多种类型值、枚举子键键值等方法。通过创建节点、删除值、删除键等实例展示实际应用,有效完成常见注册表读写场景。

    Delphi 中内存映射对于大文件的使用
    Delphi 中内存映射对于大文件的使用

    针对超大文件,利用Delphi的内存映射机制分块处理,以10倍页面粒度为单位映射,通过GetSystemInfo获取页面分配粒度。在循环中判断当前映射范围是否足够,不足时保留剩余数据并重新映射,合并后顺序读取指定长度数据。

    Delphi提取PDF文本实例
    Delphi提取PDF文本实例

    针对当前PDF解析工具稀缺且易出错的现状,本文提出一种利用Delphi语言封装ApachePDFBox开源库的解决方案,通过命令行调用其ExtractText功能,有效实现PDF文档的文本提取。该方法需要Java运行环境以及pdfbox-app-2.0.6.jar包支持,运行稳定可靠,并且能够正确处理中文内容,具有实用性。

    Delphi实现截屏存盘的方法
    Delphi实现截屏存盘的方法

    在Delphi中,通过GetDC获取屏幕设备上下文,创建兼容DC及位图,利用BitBlt复制指定区域,然后赋给TJPEGImage并设置压缩质量70,保存为JPEG文件,需注意释放GDI对象以避免内存泄漏。

    Delphi实现检测并枚举系统安装的打印机的方法
    Delphi实现检测并枚举系统安装的打印机的方法

    通过调用Printer.Printers属性,可自动检测并枚举系统中所有已安装打印机,返回名称列表。若列表为空则提示未安装。该方法代码简洁、逻辑清晰,非常便于集成到Delphi项目中。

    Delphi创建开机启动项的方法示例
    Delphi创建开机启动项的方法示例

    通过修改注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run,利用Delphi自定义过程zdyx实现程序开机自启。参数含启动项名称、程序路径及是否单次运行。需管理员权限,可改用HKEY_CURRENT_USER避免权限问题。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。