手机
当前位置:查字典教程网 >编程开发 >Delphi >Delphi7中群发Email邮件的方法
Delphi7中群发Email邮件的方法
摘要:本文实例讲述了Delphi7中群发Email邮件的方法。分享给大家供大家参考。具体分析如下:这段时间需要对所有参加考试的考生将考生信息及考试...

本文实例讲述了Delphi7中群发Email邮件的方法。分享给大家供大家参考。具体分析如下:

这段时间需要对所有参加考试的考生将考生信息及考试信息通过电子邮件群发,经过多次调试,算是成功了,发来给大家参考一下:

总的思路是:

1、安装局域网版的邮件服务器,并通过设置DNS使得给服务器能给网外用户发送电邮,这方面的软件比较多,例如WinWebMail就不错,可以从官网下载;

2、需要使用到的控件:Indy10.0.15,可以通过百度搜索下载;

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、将Email发送一个信息作为独立函数,发送时需要进行延时控制

复制代码 代码如下: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、需要注意的问题

① 滥发电邮是国家所不允许的

② 由于群发电邮是绝大多数电邮提供商都控制,往往2封电邮之间必须要有一段时间的延迟,建议自行架设邮件服务器

③ 由于Indy控件只有atNone和atSASL两种模式,架设好邮件服务器后,需要设置不需要验证的IP地址及账号;

④ 由于内部邮件地址无法获得电邮回复,因此往往回复地址与发信地址设置为不同。现在出现的一个问题就是通过浏览器打开邮件无法回复,但是通过Foxmail接收邮件后可以获得回复。这点需要注意。

希望本文所述对大家的Delphi程序设计有所帮助。

【Delphi7中群发Email邮件的方法】相关文章:

Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法

Delphi7中Listview的常用功能汇总

delphi建立、读取、存贮INI文件的方法《三》

Delphi2007编译的程序在Win7下图标模糊的解决办法

Delphi实现获取磁盘空间大小的方法

Delphi基本图像处理方法汇总

Delphi使用OpenGL2d绘图之画图片Bmp的方法

Delphi下OpenGL2d绘图之画点的方法

delphi建立、读取、存贮INI文件的方法《二》

delphi实现将BMP格式图形转化为JPG格式图形的方法

精品推荐
分类导航