pop3中MailMessage特性中Attachments包含了接受到的附件名称,这是一个TStringList对象。 例如: if pop3.mailmessage.attachments.text<>'' then showmessage('附件:'+#10#13+pop3.mailmessage.attachments.text); ====================== pop3.MailMessage.Attachments.Count pop3.MailMessage.Attachments.Strings[i]
to cg1120(代码最优化-§新年祝福你,好运伴着你§) :非常感谢回复! 这个代码不太明白,能产生我要的效果吗?让我试试!稍等我先触发一下!
线程Pooling 线程的创建与破坏极耗资源。对于短时连接的服务更是如此。此类服务创建线 程、在很短时间内使用、然后摧毁它。这样,线程会频繁地创建和毁坏。拿 time server或web server来做例子,客户端发送简单的请求,服务器返回简单 回复。使用浏览器浏览一个网页时,有可能需要与服务器进行上百次的连接和 断开操作。线程pooling可以减轻痛苦。它并不在需要时创建和毁坏线程,而是 从已经创建但未使用的列表(pool)中“借出”线程。当线程不再需要,将被抛 回缓冲池,而不会摧毁。缓冲池中的线程被标记为未活动,所以并不消耗CPU循环。 缓冲池的大小可以调整,以适合系统需求。 Indy支持线程pooling。可以用TIdThreadMgrPool组件利用线程pooling。数以百计的线程 对于一个忙碌的服务器,可能需要数以百计、千计的线程。人们普遍误解如此 多的线程将立刻使系统当掉。其实不然。 对于多数服务器而言,线程存在期的多数时间用于等待数据。在等待blocking 调用时,线程是不活动的。所以,在一个拥有500个线程的服务器中,可能只有 50个同时活动的线程。在我的系统上,330个线程只耗费1%的CPU时间。线程与全局Section 当线程需要存取数据时,都必须获取对数据的控制权以保护数据完整性。对于 初学线程编程的人士,这恐怕有些头疼。不过多数服务器并不需要全局数据。 每个线程执行隔离的任务。Indy之道 Indy与你所熟悉的其它Winsock组件不同。如果你曾经使用过其它组件,最好 是彻底忘记它们是如何工作的。几乎所有其它组件都是non-blocking,以异 步方式调用。你需要对事件进行回应,设置状态机,且常常要进行等待循环。 例如,使用其它组件,当进行连接时,必须等待connect事件发生,或者循环 至被告知已连接。而在Indy中,你简单调用connect,然后等待它返回。如果 连接失败,则引发一个异常。使用Indy非常相似于操作文件。代码可以放置于 一个地方,而无需切割到各种事件代码中。Indy有何不同 简述 1、使用blocking调用 2、不依赖事件--Indy拥有事件(处于提供信息的考虑),但并非必须。 3、被设计为支持线程--无需进行额外的线程化工作。细节 Indy不光是使用blocking调用,而且也表现为blocking方式。典型的Indy调用: with IndyClient do begin Connect; Try // 你的代码 finally Disconnect; end; end; 其它组件大概会这样调用: procedure TFormMain.TestOnClick(Sender: TComponent); begin with SocketComponent do begin Connect; try while not Connected do begin if IsError then begin Abort; end; Application.ProcessMessages;
OutData := 'Data To send'; while length(OutData) > 0 do begin Application.ProcessMessages; end; finally Disconnect; end; end; end;
procedure TFormMain.OnConnectError; begin IsError := True; end;
procedure TFormMain.OnRead; var i: Integer; begin i := SocketComponent.Send(OutData); OutData := Copy(OutData, i + 1, MaxInt); end;Indy天生支持线程。在Windows中用Indy编写服务器或客户端与在Unix平台 上编写服务器或客户端相似,甚至更加简单。 典型的Unix服务器有一个或多个“监听”进程,查找客户端请求。对于每个 客户端,都要创建一个新进程。 Indy以简单的方式工作。Windows能较好地处理线程。Indy服务器为每个客户 端锁定一个线程。 Indy服务器建立一个与主线程分离的监听线程。监听线程等待客户端请求。 对于每个连接的客户端,产生一个新线程为其服务。然后,在线程上下文中 引发适当的事件。 ---------------------------------- 使用INDY发信给多个人: mailto:[email protected][email protected]&[email protected] ----------------------------- 我用INDY中的idSMTP只要在 idMessage1.Recipients.EMailAddresses:=Edit1.Text; 再在Edit1.Text:='[email protected],[email protected]', 将收件人用','隔开即可
大侠们帮忙啊!
例如:
if pop3.mailmessage.attachments.text<>'' then
showmessage('附件:'+#10#13+pop3.mailmessage.attachments.text);
======================
pop3.MailMessage.Attachments.Count
pop3.MailMessage.Attachments.Strings[i]
这个代码不太明白,能产生我要的效果吗?让我试试!稍等我先触发一下!
attachments.clear;
不要重复发送。
而且opendialog可以选择多个文件的。
不知仁兄有没有看过photoshop6,选打开文件时,显示的若干图形文件,可单选,也可多选,像按了ctrl或shift.我想最好有那样的效果。或着把某个指定文件夹中的所有文件都选上,有没有办法解决呢?
:好象提示没有定义pop3,如何定义啊?
to to cg1120(代码最优化-§新年祝福你,好运伴着你§) 、
ahpei(菩萨) :帮忙啊!再给点提示吧!
这是我以前的项目查询来的,还有很多。你搜索一下。Internet构件Indy与blocking套接字调用模式
作者: 评价: 上站日期: 2002-05-07
内容说明:
来源: ---------------------------------------------------------------Indy采用blocking模式
Indy采用blocking套接字调用模式。blocking调用类似于读写文件。在进行读写
时,调用的方法在操作完成后才会返回。不同之处在于,网络通讯中的blocking
套接字方法调用可能会花更长的时间,因为远端数据并非时时准备好等待存取(
最快不会超过网络或modem处理数据的速度)。
例如,如果要连接远端,简单地调用connect方法,然后等待返回。如果不连接失
败,则引发一个异常。Blocking无罪
人们一直不分青红皂白地攻击blocking套接字。与流行的说法相反,blocking套
接字并非一种罪恶。当Winsock被(从Unix)“移植”到Windows平台,很快有问题发生。在Unix上,
问题很容易解决(类似多线程,不过在Unix上使用独立process代替线程)。Unix
客户端与服务器能够处理process,这些process使用blocking套接字。
Windows3.x不能处理、更不支持多线程。使用blocking接口将会“锁死”用户界
面,使程序不响应。于是,异步扩展特性被增加到WinSock,让Windows3.x可以使
用WinSock,而不会锁死。不过这需要不同的编程方法。因为Windows3.x存在的缺
点而导致blocking套接字不能很好地运作,所以Microsoft和其它一些厂商不遗余
力地攻击blocking套接字。Win32支持多线程。但在此时,大家的想法已经改变了(比如,开发者坚信
blocking是不好的),而且这种情况无法逆转。所以,对blocking套接字的责难
一直继续。实际上,blocking套接字是Unix实现套接字的唯一方法。blocking套接字也拥有
其它的优点,而且更有利于实现线程化、安全性更高。目前在Unix上也增加了一
些non-blocking套接字特性。但是,它们以与在Windows中截然不同的方式工作。
没有使用标准,且应用范围不广泛。在Unix上,blocking套接字仍旧在几乎每个
socket应用中存在,且将继续如此。blocking的好处
1、易于编程--blocking非常易于编程。所有代码能以有序的形式存在于同一位
置。
2、易于移植--由于Unix采用blocking套接字,用blocking套接字的程序更易于
移植到Unix平台。Indy利用该特点,实现了多平台单代码的解决方案。
3、在线程中工作顺利--blocking套接字是串行的,很容易在线程中使用。blocking的缺点
1、客户端用户界面“死锁”--blocking套接字调用在完成工作之后才返
回。如果在程序主线程中进行此类调用,应用程序将不能正常处理用户界面
消息。这就使用户界面“死锁”,因为在blocking套接字调用把控制权返回
给应用程序消息循环之前,update、repaint和其它消息不能被正常处理。
TIdAntiFreeze
Indy使用一个特殊的组件来解决用户界面死锁问题。把TIdAntiFreeze加入程
序,就可以随意在程序中进行标准的blocking Indy调用,而用户界面也不会死锁。
TIdAntiFreeze工作原理:在内部定时停止堆栈调用、然后调用Application.ProcessMessages。
在外部,对Indy的调用继续阻塞,和没使用TIdAntiFreeze一样正常。线程化
在blocking套接字中几乎总是使用线程。Non-blocking套接字也可以被线程
化,不过需要额外的处理。而且,相对于blocking套接字而言毫无优势。在
编写blocking套接字服务器时,线程化非常重要。在编写高级的blocking客
户端时也是如此。线程化的优点
1、优先级--可以调整独立线程优先权。可以为每个服务器任务或是连接配
给适当的CPU时间。
2、封闭性--可保持所有连接,连接之间不会互相干扰。
3、安全性--每个线程可拥有不同的安全属性。
4、多处理器--线程化能自动利用多处理器优势。
5、非串行化--线程化提供真正的并行可能性。假若不线程化,则所有请求
都需要一个单独线程来处理。于是需要把任务切割为多个小块以提高运行速
度。如果某个任务锁住或者执行较慢,其它线程必须等待它结束。任务块结束
后,后一个任务块才能被处理,如此类推。而在线程化的条件下,每个任务均
可作为整个任务来执行,操作系统自动分配CPU时间。
线程Pooling
线程的创建与破坏极耗资源。对于短时连接的服务更是如此。此类服务创建线
程、在很短时间内使用、然后摧毁它。这样,线程会频繁地创建和毁坏。拿
time server或web server来做例子,客户端发送简单的请求,服务器返回简单
回复。使用浏览器浏览一个网页时,有可能需要与服务器进行上百次的连接和
断开操作。线程pooling可以减轻痛苦。它并不在需要时创建和毁坏线程,而是
从已经创建但未使用的列表(pool)中“借出”线程。当线程不再需要,将被抛
回缓冲池,而不会摧毁。缓冲池中的线程被标记为未活动,所以并不消耗CPU循环。
缓冲池的大小可以调整,以适合系统需求。
Indy支持线程pooling。可以用TIdThreadMgrPool组件利用线程pooling。数以百计的线程
对于一个忙碌的服务器,可能需要数以百计、千计的线程。人们普遍误解如此
多的线程将立刻使系统当掉。其实不然。
对于多数服务器而言,线程存在期的多数时间用于等待数据。在等待blocking
调用时,线程是不活动的。所以,在一个拥有500个线程的服务器中,可能只有
50个同时活动的线程。在我的系统上,330个线程只耗费1%的CPU时间。线程与全局Section
当线程需要存取数据时,都必须获取对数据的控制权以保护数据完整性。对于
初学线程编程的人士,这恐怕有些头疼。不过多数服务器并不需要全局数据。
每个线程执行隔离的任务。Indy之道
Indy与你所熟悉的其它Winsock组件不同。如果你曾经使用过其它组件,最好
是彻底忘记它们是如何工作的。几乎所有其它组件都是non-blocking,以异
步方式调用。你需要对事件进行回应,设置状态机,且常常要进行等待循环。
例如,使用其它组件,当进行连接时,必须等待connect事件发生,或者循环
至被告知已连接。而在Indy中,你简单调用connect,然后等待它返回。如果
连接失败,则引发一个异常。使用Indy非常相似于操作文件。代码可以放置于
一个地方,而无需切割到各种事件代码中。Indy有何不同
简述
1、使用blocking调用
2、不依赖事件--Indy拥有事件(处于提供信息的考虑),但并非必须。
3、被设计为支持线程--无需进行额外的线程化工作。细节
Indy不光是使用blocking调用,而且也表现为blocking方式。典型的Indy调用:
with IndyClient do begin
Connect; Try
// 你的代码
finally Disconnect; end;
end;
其它组件大概会这样调用:
procedure TFormMain.TestOnClick(Sender: TComponent);
begin
with SocketComponent do begin
Connect; try
while not Connected do begin
if IsError then begin
Abort;
end;
Application.ProcessMessages;
OutData := 'Data To send';
while length(OutData) > 0 do begin
Application.ProcessMessages;
end;
finally Disconnect; end;
end;
end;
procedure TFormMain.OnConnectError;
begin
IsError := True;
end;
procedure TFormMain.OnRead;
var
i: Integer;
begin
i := SocketComponent.Send(OutData);
OutData := Copy(OutData, i + 1, MaxInt);
end;Indy天生支持线程。在Windows中用Indy编写服务器或客户端与在Unix平台
上编写服务器或客户端相似,甚至更加简单。
典型的Unix服务器有一个或多个“监听”进程,查找客户端请求。对于每个
客户端,都要创建一个新进程。
Indy以简单的方式工作。Windows能较好地处理线程。Indy服务器为每个客户
端锁定一个线程。
Indy服务器建立一个与主线程分离的监听线程。监听线程等待客户端请求。
对于每个连接的客户端,产生一个新线程为其服务。然后,在线程上下文中
引发适当的事件。
----------------------------------
使用INDY发信给多个人:
mailto:[email protected][email protected]&[email protected]
-----------------------------
我用INDY中的idSMTP只要在
idMessage1.Recipients.EMailAddresses:=Edit1.Text;
再在Edit1.Text:='[email protected],[email protected]', 将收件人用','隔开即可
unit smtpprg;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdMessageClient, IdSMTP, IdMessage,IdStackConsts;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit4: TEdit;
Panel1: TPanel;
Edit5: TEdit;
Edit6: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Memo1: TMemo;
Button1: TButton;
IdSMTP1: TIdSMTP;
CheckBox1: TCheckBox;
Memo2: TMemo;
Button2: TButton;
IdMessage1: TIdMessage;
procedure Button1Click(Sender: TObject);
procedure IdSMTP1Connected(Sender: TObject);
procedure IdSMTP1Status(axSender: TObject; const axStatus: TIdStatus;
const asStatusText: String);
procedure IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdSMTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
if checkbox1.Checked then IdSMTP1.AuthenticationType := atLogin
else IdSMTP1.AuthenticationType := atNone;
IdSMTP1.Host:=edit1.Text;
IdSMTP1.Port:=25;
IdSMTP1.UserId:=edit2.Text;
IdSMTP1.Password:=edit3.Text; IdSMTP1.Connect;
with IdMessage1 do
begin
body.Clear;
Body.Add(memo1.Lines.Text);//内容
From.Text := edit6.Text;
Recipients.EMailAddresses :=edit4.Text;//收件人
Subject:=edit5.Text;//主题 end;
IdSMTP1.Send(IdMessage1);
IdSmtp1.Disconnect;end;procedure TForm1.IdSMTP1Connected(Sender: TObject);
begin
memo2.Lines.Add('已经连接到服务器');
//IdMessage1.Body:=memo2.Lines;
end;procedure TForm1.IdSMTP1Status(axSender: TObject;
const axStatus: TIdStatus; const asStatusText: String);
begin
memo2.Lines.Add(asStatusText);
end;procedure TForm1.IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
memo2.Lines.Add(inttostr(AWorkCount));
end;procedure TForm1.IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
memo2.Lines.Add(inttostr(AWorkCountMax));
end;procedure TForm1.IdSMTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
Memo2.Lines.Add('end');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
IdSMTP1.Disconnect;
end;procedure TForm1.FormCreate(Sender: TObject);
beginend;end.
来自:yanghaijun 时间:2002-1-30 23:35:00 ID:896752 这是我用的代码,邮件可以发送出去,但是接收时却无法收到具体的内容,其它
的,但我用FoxMail却能收到,我该如何收呢?但FoxMail收的时候却只把它当成
纯文本而不是HTML文档,怎么办?
With IDSMTP1 do
begin
Host:='127.0.0.1';
Port:=25;
Connect;
IDMessage1.From.Address:='[email protected]';
IDMessage1.From.Name:='yanghaijun';
IDMessage1.Recipients.EMailAddresses:='[email protected]';
IDMessage1.Subject:='test'; tls:=TStringList.Create;
tls.Add('<HTML><Head><Title>test</Title>');
tls.Add('</Head><Body BGColor="#00CCFF">');
tls.Add('Hello!</BODY></HTML>');
IDMessage1.Body.Clear;
IDMessage1.Body.Add(tls.text);
Send(IDMessage1);
tls.Free;
Disconnect;
end;
------------------------------------------------
Windows, Messages, SysUtils, Classes, Controls, Forms,
Dialogs, IdMessage, IdTCPConnection, IdTCPClient, IdMessageClient,
IdSMTP, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent,
IdUDPBase, IdUDPClient, IdDNSResolver, StdCtrls;type
TEmailForm = class(TForm)
MSGLabel: TLabel;
MessageLabel: TLabel;
Button1: TButton;
IdDNSResolver: TIdDNSResolver;
IdAntiFreeze1: TIdAntiFreeze;
IdSMTP: TIdSMTP;
IdMsgSend: TIdMessage;
procedure Button1Click(Sender: TObject);
function SendMail() : Boolean;
private
procedure GetMxList(AMxList: TStringList; AQName: string);
{ Private declarations }
public
{ Public declarations }
end;var
EmailForm: TEmailForm;implementation{$R *.dfm}procedure TEmailForm.Button1Click(Sender: TObject);
begin
Close;
end;{发送专递邮件 }
function TEmailForm.SendMail() : Boolean;
var
MxList: TStringList;
i: Integer;
QName, ThoughAddress: string;
begin
{ 根据用户所填写的内容创建邮件 }
with IdMsgSend do
begin
// Body.Assign(mmContent.Lines); //邮件正文
// From.Address := Trim(edtFrom.Text); //发件人地址
// Recipients.EMailAddresses := Trim(edtTo.Text); //收件人地址
// Subject := edtSubject.Text; //邮件主题
end; { 从输入的收件人地址中取出邮箱域名,利用前面的GetMxList过程得到目的地地址 }
// QName := TrimRight(copy(edtTo.Text, Pos('@', edtTo.Text) + 1, Length(edtTo.Text)));
MxList := TStringList.Create;
try
GetMxList(MxList, QName);
ThoughAddress := MxList.Names[0]; {取反馈回来的第一个服务器为目的地,读者可
根据实际需要改进,比如说考虑到信件的优先级或当你选择的服务器因繁忙而暂时
不能处理你的信件时,换用其它服务器试试 }
finally
MxList.Free;
end; { 发送邮件 }
with IdSMTP do
begin
Host := ThoughAddress; // 将Host赋值为目的地,这就是特快专递与普通邮件的区别
Port := 25; // smtp服务默认的端口为25
Connect; //连接到服务器
try
Send(IdMsgSend); //发送刚才创建的邮件
ShowMessage('发送完毕'); //发送完毕后提示
finally
Disconnect; //断开服务器连接
end;
end;
end;procedure TEmailForm.GetMxList(AMxList: TStringList; AQName: string);
{ *****************************************************************************
这个过程是用来得到邮件特快专递目的地服务器名称及优先级别数,参数AMXList是用
来接收结果值,AQName代表传递过来的域名
*****************************************************************************}
var
i: Integer;
begin
with IdDNSResolver do
begin
Host := '202.101.107.55';{ Host属性用来指定域名服务器的地址,此处为笔者所在地
的主域名服务器地址,你也可以指定任一可以快速访问到的Internet上域名服务器
地址,要知道自己所在地的域名服务器地址,win98下通过winipcfg命令,win2000下
通过ipconfig /all即可查出。}
ReceiveTimeout := 10000;// 在指定的时间内得不到域名服务器的反馈,则视为失败。
ClearVars;// 清除前一次查询所反馈回来的资源记录{ 构建此次查询的头部结构 }
with DNSHeader do
begin
Qr := False; // False 代表查询
Opcode := 0; // 0代表标准域名查询
RD := True; //域名服务器可以进行递归查询
QDCount := 1; //查询的数量
end; { 构建要查询的问题 }
DNSQDList.Clear;
with DNSQDList.Add do
begin
QName := AQName; //要查询的域名
QType := cMX; //QTYPE指定要查询的资源记录的种类,值为cMX代表邮件交换记录
QClass := cIN;
end; ResolveDNS; //向域名服务器发出请求 { 从域名服务器接收反馈的结果,将反馈回来的邮件服务器名称放在AMXList列表的Name部分,
邮件服务器的优先级别数放在Value部分。 }
for i := 0 to DNSAnList.Count - 1 do
AMxList.Add(DNSAnList[i].RData.MX.Exchange + '=' +
IntToStr(DNSAnList[i].RData.MX.Preference));
end;
end;end.
------------------------------------------------
打开DELPHI运行菜单Component->Import ActiveX Control菜单,然后导入DHTML Edit
Control For IE5(我用的是98第二版,所以是IE5。其路径是c:\program files\Common
Files\Microsoft Shared\Triedit\Dhtmled.ocx)。然后再用这个组件显示一个程序,这个组
件设计时是灰色的,但是程序运行起来效果就对了。其实这个东东就是OutLook Express写邮件窗
口编辑器的内核。
wjiachun所说的CAKK主页上的那个东东就是这个ActiveX编程的VB&VC的例子(我下载过),大小
有8兆多,如果你的网速很快的话,那么下载一份还是比较值的。
这里有件事情不得不说,DELPHI运行包括这个ACTIVEX控件程序的速度我是实在不敢恭维,慢死
了。另外也比较爱也错。
------------------------------------------------