Delphi7中群發(fā)Email郵件的方法
本文實(shí)例講述了Delphi7中群發(fā)Email郵件的方法。分享給大家供大家參考。具體分析如下:
這段時(shí)間需要對(duì)所有參加考試的考生將考生信息及考試信息通過(guò)電子郵件群發(fā),經(jīng)過(guò)多次調(diào)試,算是成功了,發(fā)來(lái)給大家參考一下:
總的思路是:
1、安裝局域網(wǎng)版的郵件服務(wù)器,并通過(guò)設(shè)置DNS使得給服務(wù)器能給網(wǎng)外用戶發(fā)送電郵,這方面的軟件比較多,例如WinWebMail就不錯(cuò),可以從官網(wǎng)下載;
2、需要使用到的控件:Indy10.0.15,可以通過(guò)百度搜索下載;
3、設(shè)置需要發(fā)送的電子郵箱服務(wù)器及賬號(hào)信息
var
selectStr:string;
thisresult:integer;
begin
thisresult := 0;
//設(shè)置賬戶
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('發(fā)送郵箱賬號(hào)驗(yàn)證失?。≌?qǐng)檢查SMTP賬戶設(shè)置!');
thisresult := 0;
end
except
showmessage('SMTP服務(wù)器連接失?。≌?qǐng)檢查SMTP賬戶設(shè)置及網(wǎng)絡(luò)是否正常!');
thisresult := 0;
end
end;
result := thisresult;
end;
4、將Email發(fā)送一個(gè)信息作為獨(dú)立函數(shù),發(fā)送時(shí)需要進(jìn)行延時(shí)控制
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
begin
MsgKsbkxx.From.Name := emailusername; //郵件發(fā)送人姓名
MsgKsbkxx.From.Address := formAddress; //郵件發(fā)送人地址
MsgKsbkxx.ReceiptRecipient.Address := receiptRecipientAddress;
//回復(fù)地址,可以與郵件發(fā)送人地址不同
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //發(fā)送地址?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd; //郵件發(fā)送至......地址
MsgKsbkxx.Subject := emailSubject; //主題
MsgKsbkxx.Body.Assign(emailMemo.Lines); //郵件內(nèi)容
IdSMTP1.Send(MsgKsbkxx); //發(fā)送郵件指令
end;
5、簡(jiǎn)單判斷電子郵件地址的合法性
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;
//判斷某個(gè)字符串是否符合電郵郵件地址標(biāo)準(zhǔn)
//正確:返回ok,錯(cuò)誤返回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、批量發(fā)送電子郵件
var
AccordAmount,i,j,tag:integer;
emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
begin
//判斷數(shù)據(jù)表里面是否有需要發(fā)送電子郵件的數(shù)據(jù),如果有則發(fā)送
if Bmb.RecordCount >0 then
AccordAmount := Bmb.RecordCount
else
exit;
//
//獲取賬戶信息,一般存放在數(shù)據(jù)表或INI文件中
emailusername := userNameString; //發(fā)送郵件人
formAddress := fromAddressString; //發(fā)送郵件地址
receiptRecipientAddress := receiptRecipientAddressString; //回復(fù)郵件地址
emailSubject := emailSubjectString; //郵件主題
//
tag := 1; //標(biāo)志位:發(fā)送出錯(cuò)則停止
i:=1; //發(fā)送郵件的總數(shù)
j:=0; //讓進(jìn)度條逐步遞進(jìn)的記錄處理?xiàng)l數(shù)
list1.Clear; //顯示已經(jīng)成功發(fā)送電子郵件的學(xué)員信息
//判斷是否能與設(shè)置的郵箱連接,如果返回值為1,則獲取郵件內(nèi)容及相關(guān)設(shè)置并發(fā)送
if setEmailInfo = 1 then
begin
Pb.BlockSize := 1;
Pb.Max := AccordAmount ;
Formsjtj.Refresh;
Bmb.First;
try
while (not tBmb.Eof) do
begin
//判斷郵件地址是否為空且是否符合電郵規(guī)范,如都滿足條件則給該地址發(fā)送電郵
if Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' then
begin
//獲取發(fā)送郵件的內(nèi)容
emailMemo.Clear;
..........................
//設(shè)置郵件信息,如發(fā)送郵件錯(cuò)誤,則直接退出
if tag=0 then exit;
//發(fā)送郵件
sendtoAdd := trim(Bmb.FieldByName('s_emailAddress').AsString); //需要發(fā)送至...郵箱
if emailAddressYesOrNo(sendtoAdd)= 'ok' then //檢查電子郵件格式是否正確
begin
sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject); //發(fā)送郵件
i := i+1; //計(jì)數(shù)器加1
list1.Items.Add(......); //將已經(jīng)成功發(fā)送電郵的考生信息放在列表中
end;
//
end;
//每發(fā)送50封郵件停滯2s鐘
if (i mod 50) = 0 then sleep(2000);
dm_sjtj.ListBmb.next;
Application.ProcessMessages ; //循環(huán)中處理進(jìn)程信息
//刷新進(jìn)度指示
j := j+1;
PB.Progress:=j;
PB.StepIt ;
PB.Refresh;
end;
finally
tag := 0;
IdSMTP1.Disconnect;
end;
end;
showmessage('共發(fā)送 '+intToStr(i-1)+' 封郵件。');
end;
7、需要注意的問(wèn)題
① 濫發(fā)電郵是國(guó)家所不允許的
② 由于群發(fā)電郵是絕大多數(shù)電郵提供商都控制,往往2封電郵之間必須要有一段時(shí)間的延遲,建議自行架設(shè)郵件服務(wù)器
③ 由于Indy控件只有atNone和atSASL兩種模式,架設(shè)好郵件服務(wù)器后,需要設(shè)置不需要驗(yàn)證的IP地址及賬號(hào);
④ 由于內(nèi)部郵件地址無(wú)法獲得電郵回復(fù),因此往往回復(fù)地址與發(fā)信地址設(shè)置為不同。現(xiàn)在出現(xiàn)的一個(gè)問(wèn)題就是通過(guò)瀏覽器打開(kāi)郵件無(wú)法回復(fù),但是通過(guò)Foxmail接收郵件后可以獲得回復(fù)。這點(diǎn)需要注意。
希望本文所述對(duì)大家的Delphi程序設(shè)計(jì)有所幫助。
相關(guān)文章
Delphi實(shí)現(xiàn)讀取系統(tǒng)時(shí)間與日期完整實(shí)例
這篇文章主要介紹了Delphi實(shí)現(xiàn)讀取系統(tǒng)時(shí)間與日期完整實(shí)例,需要的朋友可以參考下2014-07-07DELPHI7.0 獲取硬盤(pán)、CPU、網(wǎng)卡序列號(hào)的代碼
DELPHI7.0 獲取硬盤(pán)、CPU、網(wǎng)卡序列號(hào)的代碼,使用DELPHI編程的朋友可以參考下。2011-09-09Delphi實(shí)現(xiàn)獲取進(jìn)程列表及相關(guān)信息的實(shí)例
這篇文章主要介紹了Delphi實(shí)現(xiàn)獲取進(jìn)程列表及相關(guān)信息的實(shí)例,希望通過(guò)本文大家能實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法
這篇文章主要介紹了Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法,需要的朋友可以參考下2014-08-08delphi中exit,abort,break,continue的區(qū)別介紹
本文詳細(xì)介紹下delphi中表示跳出的有break,continue, exit,abort, halt, runerror的區(qū)別,感興趣的朋友可以參考下哈,希望對(duì)你學(xué)習(xí)跳出有所幫助2013-04-04delphi程序全屏顯示無(wú)標(biāo)題欄覆蓋整個(gè)屏幕(適合屏保)
delphi 簡(jiǎn)單實(shí)現(xiàn)程序全屏顯示無(wú)標(biāo)題欄,覆蓋整個(gè)屏幕,這個(gè)在做工控機(jī)或屏保時(shí)有用的,具體代碼如下,感興趣的朋友可以參考下哈2013-06-06Delphi 常見(jiàn)文件處理及注冊(cè)表文件的使用實(shí)例
這篇文章主要介紹了Delphi 常見(jiàn)文件處理及注冊(cè)表文件的使用實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09