前几天读了《计算机世界》报的一篇文章“如何批量发送电子邮件”,写得较为详细,但用到了数据库,感觉不太利于别人“即拷即用”。现提出本人的邮件批发简易解决方案。
首先准备一含多个邮件地址的文本文件,运行时将其内容装入一个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。