Delphi7中群发Email邮件的方法
本文实例讲述了Delphi7中群发Email邮件的方法。分享给大家供大家参考。具体分析如下:
这段时间需要对所有参加考试的考生将考生信息及考试信息通过电子邮件群发,经过多次调试,算是成功了,发来给大家参考一下:
总的思路是:
1、安装局域网版的邮件服务器,并通过设置DNS使得给服务器能给网外用户发送电邮,这方面的软件比较多,例如WinWebMail就不错,可以从官网下载;
2、需要使用到的控件:Indy10.0.15,可以通过百度搜索下载;
3、设置需要发送的电子邮箱服务器及账号信息
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发送一个信息作为独立函数,发送时需要进行延时控制
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、简单判断电子邮件地址的合法性
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、批量发送电子邮件
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程序设计有所帮助。
上一篇:Delphi XE5 为Android应用制作签名的方法(图文)
栏 目:Delphi
本文标题:Delphi7中群发Email邮件的方法
本文地址:https://www.xiuzhanwang.com/a1/Delphi/8612.html
您可能感兴趣的文章
- 01-10在Delphi实现在数据库中存取图像的图文演示无错
- 01-10Delphi中判断文件是否为文本文件的函数
- 01-10delphi中一个值得大家来考虑的DLL问题
- 01-10初探Delphi中的插件编程
- 01-10DELPHI7.0 获取硬盘、CPU、网卡序列号的代码
- 01-10Delphi 生成excel中饼图的实例代码
- 01-10delphi中exit,abort,break,continue的区别介绍
- 01-10Delphi中设置条件断点的方法讲解
- 01-10Delphi之Pascal语言中的关键字及保留字汇总
- 01-10Delphi中对时间操作方法汇总
阅读排行
本栏相关
- 01-10在Delphi实现在数据库中存取图像的图
- 01-10delphi建立、读取、存贮INI文件的方法
- 01-10delphi 正弦曲线图
- 01-10Delphi Command模式
- 01-10delphi建立、读取、存贮INI文件的方法
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判断文件是否为文本文件的函
- 01-10delphi中一个值得大家来考虑的DLL问题
- 01-10初探Delphi中的插件编程
随机阅读
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 01-10C#中split用法实例总结
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子