Delphi7中群發(fā)Email郵件的方法
本文實例講述了Delphi7中群發(fā)Email郵件的方法。分享給大家供大家參考。具體分析如下:
這段時間需要對所有參加考試的考生將考生信息及考試信息通過電子郵件群發(fā),經過多次調試,算是成功了,發(fā)來給大家參考一下:
總的思路是:
1、安裝局域網版的郵件服務器,并通過設置DNS使得給服務器能給網外用戶發(fā)送電郵,這方面的軟件比較多,例如WinWebMail就不錯,可以從官網下載;
2、需要使用到的控件:Indy10.0.15,可以通過百度搜索下載;
3、設置需要發(fā)送的電子郵箱服務器及賬號信息
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('發(fā)送郵箱賬號驗證失??!請檢查SMTP賬戶設置!');
thisresult := 0;
end
except
showmessage('SMTP服務器連接失敗!請檢查SMTP賬戶設置及網絡是否正常!');
thisresult := 0;
end
end;
result := thisresult;
end;
4、將Email發(fā)送一個信息作為獨立函數,發(fā)送時需要進行延時控制
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
begin
MsgKsbkxx.From.Name := emailusername; //郵件發(fā)送人姓名
MsgKsbkxx.From.Address := formAddress; //郵件發(fā)送人地址
MsgKsbkxx.ReceiptRecipient.Address := receiptRecipientAddress;
//回復地址,可以與郵件發(fā)送人地址不同
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //發(fā)送地址?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd; //郵件發(fā)送至......地址
MsgKsbkxx.Subject := emailSubject; //主題
MsgKsbkxx.Body.Assign(emailMemo.Lines); //郵件內容
IdSMTP1.Send(MsgKsbkxx); //發(fā)送郵件指令
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、批量發(fā)送電子郵件
var
AccordAmount,i,j,tag:integer;
emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
begin
//判斷數據表里面是否有需要發(fā)送電子郵件的數據,如果有則發(fā)送
if Bmb.RecordCount >0 then
AccordAmount := Bmb.RecordCount
else
exit;
//
//獲取賬戶信息,一般存放在數據表或INI文件中
emailusername := userNameString; //發(fā)送郵件人
formAddress := fromAddressString; //發(fā)送郵件地址
receiptRecipientAddress := receiptRecipientAddressString; //回復郵件地址
emailSubject := emailSubjectString; //郵件主題
//
tag := 1; //標志位:發(fā)送出錯則停止
i:=1; //發(fā)送郵件的總數
j:=0; //讓進度條逐步遞進的記錄處理條數
list1.Clear; //顯示已經成功發(fā)送電子郵件的學員信息
//判斷是否能與設置的郵箱連接,如果返回值為1,則獲取郵件內容及相關設置并發(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ā)送郵件的內容
emailMemo.Clear;
..........................
//設置郵件信息,如發(fā)送郵件錯誤,則直接退出
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; //計數器加1
list1.Items.Add(......); //將已經成功發(fā)送電郵的考生信息放在列表中
end;
//
end;
//每發(fā)送50封郵件停滯2s鐘
if (i mod 50) = 0 then sleep(2000);
dm_sjtj.ListBmb.next;
Application.ProcessMessages ; //循環(huá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、需要注意的問題
① 濫發(fā)電郵是國家所不允許的
② 由于群發(fā)電郵是絕大多數電郵提供商都控制,往往2封電郵之間必須要有一段時間的延遲,建議自行架設郵件服務器
③ 由于Indy控件只有atNone和atSASL兩種模式,架設好郵件服務器后,需要設置不需要驗證的IP地址及賬號;
④ 由于內部郵件地址無法獲得電郵回復,因此往往回復地址與發(fā)信地址設置為不同?,F在出現的一個問題就是通過瀏覽器打開郵件無法回復,但是通過Foxmail接收郵件后可以獲得回復。這點需要注意。
希望本文所述對大家的Delphi程序設計有所幫助。
相關文章
Delphi2007編譯的程序在Win7下圖標模糊的解決辦法
這篇文章主要介紹了Delphi2007編譯的程序在Win7下圖標模糊的解決辦法,需要的朋友可以參考下2014-08-08delphi中exit,abort,break,continue的區(qū)別介紹
本文詳細介紹下delphi中表示跳出的有break,continue, exit,abort, halt, runerror的區(qū)別,感興趣的朋友可以參考下哈,希望對你學習跳出有所幫助2013-04-04