沈曼 發表於 2014-12-10 09:44:45

Delphi7中群发Email邮件的方法

<p>本文实例讲述了Delphi7中群发Email邮件的方法。分享给大家供大家参考。具体分析如下:</p>
<p>这段时间需要对所有参加考试的考生将考生信息及考试信息通过电子邮件群发,经过多次调试,算是成功了,发来给大家参考一下:</p>
<p><strong>总的思路是:</strong></p>
<p><strong>1、安装局域网版的邮件服务器</strong>,并通过设置DNS使得给服务器能给网外用户发送电邮,这方面的软件比较多,例如WinWebMail就不错,可以从官网下载;<br />
&nbsp;<br />
<strong>2、需要使用到的控件:Indy10.0.15,可以通过百度搜索下载;<br />
</strong>&nbsp;<br />
<strong>3、设置需要发送的电子邮箱服务器及账号信息<br />
</strong><div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code21128">function setEmailInfo:integer; //返回值0:邮箱设置失败;1:邮箱设置成功<br />
var<br />
&nbsp; selectStr:string;<br />
&nbsp; thisresult:integer;<br />
begin<br />
&nbsp; thisresult := 0;<br />
&nbsp; //设置账户<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdSMTP1.AuthType := atNone; //或者是atSASL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdSMTP1.Host := hostString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdSMTP1.Username := userNameString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdSMTP1.Password := passWordString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdSMTP1.connect;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisresult := 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not IdSMTP1.Authenticate then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showmessage('发送邮箱账号验证失败!请检查SMTP账户设置!');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisresult := 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showmessage('SMTP服务器连接失败!请检查SMTP账户设置及网络是否正常!');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisresult := 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />
&nbsp;&nbsp;&nbsp; end;<br />
&nbsp; result := thisresult;<br />
end;</div><br />
&nbsp;<br />
<strong>4、将Email发送一个信息作为独立函数,发送时需要进行延时控制<br />
</strong><div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code12842">procedure sendEmailOnce(emailusername:string;<br />
&nbsp;&nbsp;&nbsp; formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);<br />
begin<br />
&nbsp; MsgKsbkxx.From.Name := emailusername;&nbsp;&nbsp;&nbsp;&nbsp; //邮件发送人姓名<br />
&nbsp; MsgKsbkxx.From.Address := formAddress; //邮件发送人地址<br />
&nbsp; MsgKsbkxx.ReceiptRecipient.Address := receiptRecipientAddress; <br />
&nbsp;&nbsp;&nbsp;&nbsp; //回复地址,可以与邮件发送人地址不同<br />
&nbsp; MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //发送地址?<br />
&nbsp; MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd;&nbsp; //邮件发送至......地址<br />
&nbsp; MsgKsbkxx.Subject := emailSubject;&nbsp; //主题<br />
&nbsp; MsgKsbkxx.Body.Assign(emailMemo.Lines);&nbsp; //邮件内容<br />
&nbsp; IdSMTP1.Send(MsgKsbkxx);&nbsp; //发送邮件指令<br />
end;</div><br />
&nbsp;<br />
<strong>5、简单判断电子邮件地址的合法性<br />
</strong><div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code90816">//根据字符串Separator的表示将字符串s分隔为若干个字符串,存入rs字符串列表中<br />
procedure SeparateTerms2(s:string;Separator:string;var rs:TStringList);<br />
var<br />
&nbsp; AStr: string;<br />
&nbsp; idx: Integer;<br />
&nbsp; ASubStr: string;<br />
begin<br />
&nbsp; AStr := Trim(s);<br />
&nbsp; while Pos(Separator, AStr) &gt; 0 do<br />
&nbsp; begin<br />
&nbsp;&nbsp;&nbsp; idx := Pos(Separator, AStr);<br />
&nbsp;&nbsp;&nbsp; ASubStr := Copy(AStr, 1, idx - 1);<br />
&nbsp;&nbsp;&nbsp; rs.Add(ASubStr);<br />
&nbsp;&nbsp;&nbsp; AStr := Copy(AStr, idx + 1, Length(AStr));<br />
&nbsp; end;<br />
&nbsp;if AStr+'a' &lt;&gt; 'a' then&nbsp; rs.Add(AStr); //如果存在剩余的字符串,则将其存入字符串列表中<br />
end;<br />
&nbsp;<br />
//判断某个字符串是否符合电邮邮件地址标准<br />
//正确:返回ok,错误返回error<br />
function emailAddressYesOrNo (emailAddress:String):string;<br />
var<br />
&nbsp; getStrings:TStringList;<br />
&nbsp; getYesOrNo:string;<br />
begin<br />
&nbsp; getYesOrNo := 'error';<br />
&nbsp; getStrings := TStringList.Create;<br />
&nbsp; SeparateTerms2(emailAddress,'@',getStrings);<br />
&nbsp; if getStrings.Count=2 then<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getStrings.Clear;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SeparateTerms2(emailAddress,'.',getStrings);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if getStrings.Count&gt;1 then&nbsp; getYesOrNo := 'ok';<br />
&nbsp;&nbsp;&nbsp; end;<br />
&nbsp; getStrings.Free;<br />
&nbsp; result := getYesOrNo;<br />
end;</div><br />
&nbsp;<br />
<strong>6、批量发送电子邮件<br />
</strong><div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code30337">procedure bEmailKsxxClick;<br />
var<br />
&nbsp; AccordAmount,i,j,tag:integer;<br />
&nbsp; emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;<br />
begin<br />
&nbsp; //判断数据表里面是否有需要发送电子邮件的数据,如果有则发送<br />
&nbsp; if Bmb.RecordCount &gt;0 then<br />
&nbsp;&nbsp;&nbsp; AccordAmount := Bmb.RecordCount<br />
&nbsp; else<br />
&nbsp;&nbsp;&nbsp; exit;<br />
&nbsp; //<br />
&nbsp; //获取账户信息,一般存放在数据表或INI文件中<br />
&nbsp; emailusername :=&nbsp; userNameString; //发送邮件人<br />
&nbsp; formAddress := fromAddressString;&nbsp;&nbsp; //发送邮件地址<br />
&nbsp; receiptRecipientAddress := receiptRecipientAddressString;&nbsp; //回复邮件地址<br />
&nbsp; emailSubject := emailSubjectString; //邮件主题<br />
&nbsp;//<br />
&nbsp; tag := 1;&nbsp; //标志位:发送出错则停止<br />
&nbsp; i:=1;&nbsp; //发送邮件的总数<br />
&nbsp; j:=0;&nbsp; //让进度条逐步递进的记录处理条数<br />
&nbsp; list1.Clear; //显示已经成功发送电子邮件的学员信息<br />
&nbsp; //判断是否能与设置的邮箱连接,如果返回值为1,则获取邮件内容及相关设置并发送<br />
&nbsp; if setEmailInfo = 1 then<br />
&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pb.BlockSize := 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pb.Max := AccordAmount ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Formsjtj.Refresh;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bmb.First;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (not tBmb.Eof) do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断邮件地址是否为空且是否符合电邮规范,如都满足条件则给该地址发送电邮<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Bmb.FieldByName('s_emailAddress').AsString+'a' &lt;&gt; 'a' then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取发送邮件的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emailMemo.Clear;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..........................<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置邮件信息,如发送邮件错误,则直接退出<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if tag=0 then exit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送邮件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sendtoAdd :=&nbsp; trim(Bmb.FieldByName('s_emailAddress').AsString); //需要发送至...邮箱<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if emailAddressYesOrNo(sendtoAdd)= 'ok' then&nbsp; //检查电子邮件格式是否正确<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject); //发送邮件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i := i+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //计数器加1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list1.Items.Add(......);&nbsp; //将已经成功发送电邮的考生信息放在列表中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //每发送50封邮件停滞2s钟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i mod 50) = 0 then sleep(2000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dm_sjtj.ListBmb.next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application.ProcessMessages ; //循环中处理进程信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //刷新进度指示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j := j+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PB.Progress:=j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PB.StepIt ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PB.Refresh;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag := 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IdSMTP1.Disconnect;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br />
&nbsp;&nbsp;&nbsp; end;<br />
&nbsp; showmessage('共发送 '+intToStr(i-1)+' 封邮件。');<br />
end;</div><br />
&nbsp;<br />
<strong>7、需要注意的问题</strong></p>
<p>① 滥发电邮是国家所不允许的<br />
② 由于群发电邮是绝大多数电邮提供商都控制,往往2封电邮之间必须要有一段时间的延迟,建议自行架设邮件服务器<br />
③ 由于Indy控件只有atNone和atSASL两种模式,架设好邮件服务器后,需要设置不需要验证的IP地址及账号;<br />
④ 由于内部邮件地址无法获得电邮回复,因此往往回复地址与发信地址设置为不同。现在出现的一个问题就是通过浏览器打开邮件无法回复,但是通过Foxmail接收邮件后可以获得回复。这点需要注意。</p>
<p>希望本文所述对大家的Delphi程序设计有所帮助。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Delphi基本图像处理方法汇总</li><li>Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法</li><li>delphi实现将BMP格式图形转化为JPG格式图形的方法</li><li>delphi字符串分隔函数用法实例</li><li>delphi实现保存和读取图片的方法</li><li>Delphi远程连接Mysql的实现方法</li><li>Delphi实现获取进程列表及相关信息的实例</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Delphi7中群发Email邮件的方法