前几天读了《计算机世界》报的一篇文章“如何批量发送电子邮件”,写得较为详细,但用到了数据库,感觉不太利于别人“即拷即用”。现提出本人的邮件批发简易解决方案。
首先准备一含多个邮件地址的文本文件,运行时将其内容装入一个listbox控件中,再利用Nmsmtp控件,给其UserID、Host、PostMessage的诸个属性赋值,用Listbox中的地址逐次给PostMessage的Toaddress赋值,从而达到一信多发的目的。
具体控件使用情况及主要代码如下:
//--------------------- #include <vcl.h> #pragma hdrstop #include “main.h" #include “options.h" //--------------------- #pragma package(smart_init) #pragma resource “*.dfm" TForm1 *Form1; //--------------------- _fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--从地址列表中获取下一个Email address-- bool __fastcall TForm1::GetNext(char *AddTo) { AnsiString AURL; if(id < ListBox1->Items->Count) { do{ AURL = ListBox1->Items->Strings[id]; ListBox1->ItemIndex = id; strcpy(AddTo, AURL.c_str()); id ++; }while(!AddTo[0] && (id < ListBox1->Items->Count)); if(id <= ListBox1->Items->Count) return true; } return false; } //--打开准备好的文本文件,将其中的内容载入 Listbox1中,并在memo中显示地址条目数----- void __fastcall TForm1::Button1Click(TObject *Sender) { char dp[100]; if(OpenDialog1->Execute()) { ListBox1->Items->LoadFromFile(OpenDialog1->FileName); Memo2->Lines->Clear(); wsprintf(dp, “Total %i items", ListBox1->Items->Count); Memo2->Lines->Append(dp); } } //打开对话框编辑个人信息, 还可在此添加附件 void __fastcall TForm1::Button4Click(TObject *Sender) { OptDlg->ShowModal(); } //-------启动邮件发送,这里只发第一封。 void __fastcall TForm1::Button2Click(TObject *Sender) { NMSMTP1->UserID = OptDlg->Edit1->Text; 给NMSMTP1的UserID属性赋值,表明将发信人User ID NMSMTP1->Host = OptDlg->Edit2->Text; 给NMSMTP1的Host属性赋值,标明邮件服务器 NMSMTP1->PostMessage->FromName = OptDlg->Edit3->Text; 提供给对方的发信人名 NMSMTP1->PostMessage->FromAddress = OptDlg->Edit6->Text; 发信的Email地址 NMSMTP1->PostMessage->LocalProgram = “BatSender";发信的程序名,存于信头的X Mailer 部分 NMSMTP1->PostMessage->ReplyTo = OptDlg-> Edit4->Text; 希望回复的地址 NMSMTP1->PostMessage->Subject = OptDlg->Edit5->Text; 信件主题 NMSMTP1->PostMessage->Body->Assign (Memo1->Lines); 信件体 NMSMTP1->PostMessage->Attachments-> AddStrings(OptDlg->ListBox1->Items); 载入文件名,这些文件作为附件发送。 NMSMTP1->Connect(); //启动与服务器的连接 stop = false; id = 0; SendMail(); } //------用户按下stop按钮后, 调用此过程终止与远程服务器的连接-─ void __fastcall TForm1::Stop() { if(NMSMTP1->Connected) NMSMTP1->Disconnect(); stop = true; } //------执行邮件发送的有效代码---- void __fastcall TForm1::SendMail() { char disp[100]; char toadd[100]; if(stop) return; if(GetNext(toadd)) 获得待发送邮件的目标地址字符串 { wsprintf(disp, “Preparing item %i", id); Memo2->Lines->Append(disp); NMSMTP1->PostMessage->ToAddress-> Text = toadd; 给目标地址属性赋值, NMSMTP1->SendMail(); 开始发送邮件 } else Stop(); } void __fastcall TForm1::NMSMTP1AuthenticationFailed (bool &Handled) { Stop(); // 若用户ID 无效,显示出错信息, 终止与远程服务器的连接 Memo2->Lines->Append(“Invalid UerID"); } //--以下皆为状态提示----------- void __fastcall TForm1::NMSMTP1Connect(TObject *Sender) { Memo2->Lines->Append(“Connected"); } //--------------------- void __fastcall TForm1::NMSMTP1SendStart(TObject *Sender) { Memo2->Lines->Append(“Sending"); } //--------------------- void __fastcall TForm1::NMSMTP1Failure(TObject *Sender) { Memo2->Lines->Append(“Message delivery failure"); SendMail(); //发往上一地址失败,准备发往下一地址 } //--------------------- void __fastcall TForm1::NMSMTP1Suclearcase/" target="_blank" >ccess(TObject *Sender) { Memo2->Lines->Append(“Message sent successfully"); SendMail(); //发往上一地址成功,准备发往下一地址 } //--------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { Stop(); } //--------------------- void __fastcall TForm1::NMSMTP1ConnectionFailed (TObject *Sender) { Memo2->Lines->Append(“Connection Failed"); } //--------------------- void __fastcall TForm1::NMSMTP1Disconnect (TObject *Sender) { Memo2->Lines->Append(“Disconnected"); } //--------------------- void __fastcall TForm1::NMSMTP1EncodeEnd (AnsiString Filename) { Memo2->Lines->Append(“Encoded "+Filename); } //--------------------- void __fastcall TForm1::NMSMTP1EncodeStart (AnsiString Filename) { Memo2->Lines->Append(“Encoding "+Filename); } //---------------------
编程工具: C++ Builder 4 ;运行环境: Win98/Win95/Win NT。