首先,你必须知道你使用的邮件服务器是否支持这种功能,就是必须Login再能够发送邮件,当你设置了SMTP.AuthenticationType := atLogin后,那些需要Login才可以发送的邮件服务器当然可以成功发送(如Sina, 163.net and 163.com and so on),但是这时就意味着不支持的Login功能的邮件服务器就不能发送(如你单位的邮件服务器一样),所以你可以象Outlook一样,设置选项是否使用SMTP.AuthenticationType := atLogin,当你用单位的邮件服务器发送邮件时,那么你可以Disable这句代码呀! 例如: 加一个名叫PLMM的CheckBox在你的发送邮件的Form上。 if PLMM.Checked then SMTP.AuthenticationType := atLogin
揭发:Wally_wu(不想再写代码) 调戏少女,我第一个发现
揭发: blueshrimp(天空还下着沙)问非所答!呵呵!
Sorry,各位观众,写错字,应该是揭发: blueshrimp(天空还下着沙)答非所问!呵呵!
//窗体上有一个BUTTON控件,一个LABEL控件,一个NMSMTP控件 //带密码险证的邮件发送程序需要BASE64编码,DecodeBase64和 EncodeBase64 //为解码和编码函数 //在263、163和SOHU上都能发送成功 unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Psock, NMsmtp, ComCtrls;type TForm1 = class(TForm) NMSMTP1: TNMSMTP; Button1: TButton; StatusBar1: TStatusBar; Edit1: TEdit; Label2: TLabel; Label3: TLabel; Edit2: TEdit; Label4: TLabel; Edit3: TEdit; Label5: TLabel; Edit4: TEdit; Label6: TLabel; Memo1: TMemo; Label7: TLabel; Edit5: TEdit; Label1: TLabel; Edit6: TEdit; Label8: TLabel; procedure Button1Click(Sender: TObject); procedure NMSMTP1Connect(Sender: TObject); procedure NMSMTP1InvalidHost(var Handled: Boolean); procedure NMSMTP1ConnectionFailed(Sender: TObject); procedure NMSMTP1Status(Sender: TComponent; Status: String); procedure NMSMTP1SendStart(Sender: TObject); procedure NMSMTP1Success(Sender: TObject); private { Private declarations } public { Public declarations } end;//BaseTable为BASE64码表 const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var Form1: TForm1; AuthSucc:boolean;// 是否需要密码验证 function DecodeBase64(Source:string):string; //解码函数 function FindInTable(CSource:char):integer; // function EncodeBase64(Source:string):string; //编码函数 implementation {$R *.DFM}// function FindInTable(CSource:char):integer; begin result:=Pos(string(CSource),BaseTable)-1; end; ////function DecodeBase64(Source:string):string; var SrcLen,Times,i:integer; x1,x2,x3,x4,xt:byte; begin result:=''; SrcLen:=Length(Source); Times:=SrcLen div 4; for i:=0 to Times-1 do begin x1:=FindInTable(Source[1+i*4]); x2:=FindInTable(Source[2+i*4]); x3:=FindInTable(Source[3+i*4]); x4:=FindInTable(Source[4+i*4]); x1:=x1 shl 2; xt:=x2 shr 4; x1:=x1 or xt; x2:=x2 shl 4; result:=result+chr(x1); if x3= 64 then break; xt:=x3 shr 2; x2:=x2 or xt; x3:=x3 shl 6; result:=result+chr(x2); if x4=64 then break; x3:=x3 or x4; result:=result+chr(x3); end; end; /////function EncodeBase64(Source:string):string; var Times,LenSrc,i:integer; x1,x2,x3,x4:char; xt:byte; begin result:=''; LenSrc:=length(Source); if LenSrc mod 3 =0 then Times:=LenSrc div 3 else Times:=LenSrc div 3 + 1; for i:=0 to times-1 do begin if LenSrc >= (3+i*3) then begin x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1]; xt:=(ord(Source[1+i*3]) shl 4) and 48; xt:=xt or (ord(Source[2+i*3]) shr 4); x2:=BaseTable[xt+1]; xt:=(Ord(Source[2+i*3]) shl 2) and 60; xt:=xt or (ord(Source[3+i*3]) shr 6); x3:=BaseTable[xt+1]; xt:=(ord(Source[3+i*3]) and 63); x4:=BaseTable[xt+1]; end else if LenSrc>=(2+i*3) then begin x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1]; xt:=(ord(Source[1+i*3]) shl 4) and 48; xt:=xt or (ord(Source[2+i*3]) shr 4); x2:=BaseTable[xt+1]; xt:=(ord(Source[2+i*3]) shl 2) and 60; x3:=BaseTable[xt+1]; x4:='='; end else begin x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1]; xt:=(ord(Source[1+i*3]) shl 4) and 48; x2:=BaseTable[xt+1]; x3:='='; x4:='='; end; result:=result+x1+x2+x3+x4; end; end;////////// procedure TForm1.Button1Click(Sender: TObject); //var MailTo,MailBody:TStringList; begin Nmsmtp1.Host :=Edit1.Text; nmsmtp1.Port :=25; nmsmtp1.UserID :=Edit2.Text;//发信人的用户名,必须是真实的 nmsmtp1.ReportLevel :=1; Nmsmtp1.TimeOut :=10000; nmsmtp1.Connect ; ///连接 if AuthSucc=true then ////验证成功 begin nmsmtp1.PostMessage.FromAddress:=Edit4.Text; //发信人的电子邮件地址 nmsmtp1.PostMessage.ToAddress.Text :=Edit5.Text; nmsmtp1.PostMessage.Body.Text:=Memo1.Text; nmsmtp1.PostMessage.Subject :=Edit6.Text; nmsmtp1.SendMail; end; end;procedure TForm1.NMSMTP1Connect(Sender: TObject); begin //////连接成功,下面用户认证过程 StatusBar1.SimpleText:=nmsmtp1.Status; if nmsmtp1.ReplyNumber = 250 then StatusBar1.SimpleText:=nmsmtp1.Transaction('auth login'); //开始认证 if nmsmtp1.ReplyNumber =334 then //返回值为334,让你输入用BASE64编码后的用户名 StatusBar1.SimpleText:=nmsmtp1.Transaction(EncodeBase64(Edit2.Text)); if nmsmtp1.ReplyNumber =334 then // 返回值为334,让你输入用BASE64编码后的用户密码 StatusBar1.SimpleText:=nmsmtp1.Transaction(EncodeBase64(Edit3.Text)); if nmsmtp1.ReplyNumber =235 then begin StatusBar1.SimpleText:='successful'; AuthSucc:=true; end; end;procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean); begin StatusBar1.SimpleText :='Invalid Host'; end; procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject); begin StatusBar1.SimpleText :='connect failed'; end; procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String); begin StatusBar1.SimpleText :=nmsmtp1.Status ; end; procedure TForm1.NMSMTP1SendStart(Sender: TObject); begin StatusBar1.SimpleText :='start send'; end; procedure TForm1.NMSMTP1Success(Sender: TObject); begin StatusBar1.SimpleText:='send success!'; end;end.请揭帖~
Received: from sm1.163.com([202.108.44.203]) by peoplemail.com.cn(JetMail 2.5.3.0) with SMTP id jm1ac3c063eec; Thu, 29 Nov 2001 07:20:25 -0000 Received: from xubo (unknown [61.154.94.146]) by sm1.163.com (Postfix) with ESMTP id 99CF11C461061 for <[email protected]>; Thu, 29 Nov 2001 15:12:49 +0800 (CST) …… 从该头部资料可以看出,邮件传递的路线是由xubo→sm1.163.com→peoplemail.com.cn,其 中xubo是本人所在机器,邮件是经由sm1.163.com这个中转站才送到目的地的,而我们平常 所说的邮件特快专递,就是把邮件直接送到目的地而不需要中转站。 如何才能知道目的地的地址呢?我们知道电子邮件的地址由用户名(username)和邮箱域 名(address.com)两部分构成的,给域名服务器发送针对“address.com”的MX指令查询 即可找到目的地的地址。被查出来的目的地可能不止一个,有时这些目的地是有优先级别 之分的,分别对应着邮件的优先级别,你可以根据邮件优先级的不同对应发送,也可以任 意选择其中一个发送,本文的示例将选择反馈回来的第一个目的地发送,读者可根据实际 需要进行改进。
SMTP.UserID :=SmtpServerUser;
SMTP.Password := SmtpServerPassword;
SMTP.Host := SmtpServerName;
SMTP.Port := SmtpServerPort;
怎么就是不行呢?
例如:
加一个名叫PLMM的CheckBox在你的发送邮件的Form上。
if PLMM.Checked then
SMTP.AuthenticationType := atLogin
blueshrimp(天空还下着沙)问非所答!呵呵!
blueshrimp(天空还下着沙)答非所问!呵呵!
//带密码险证的邮件发送程序需要BASE64编码,DecodeBase64和 EncodeBase64
//为解码和编码函数
//在263、163和SOHU上都能发送成功
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Psock, NMsmtp, ComCtrls;type
TForm1 = class(TForm)
NMSMTP1: TNMSMTP;
Button1: TButton;
StatusBar1: TStatusBar;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
Label6: TLabel;
Memo1: TMemo;
Label7: TLabel;
Edit5: TEdit;
Label1: TLabel;
Edit6: TEdit;
Label8: TLabel;
procedure Button1Click(Sender: TObject);
procedure NMSMTP1Connect(Sender: TObject);
procedure NMSMTP1InvalidHost(var Handled: Boolean);
procedure NMSMTP1ConnectionFailed(Sender: TObject);
procedure NMSMTP1Status(Sender: TComponent; Status: String);
procedure NMSMTP1SendStart(Sender: TObject);
procedure NMSMTP1Success(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;//BaseTable为BASE64码表
const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';var
Form1: TForm1;
AuthSucc:boolean;// 是否需要密码验证
function DecodeBase64(Source:string):string; //解码函数
function FindInTable(CSource:char):integer; //
function EncodeBase64(Source:string):string; //编码函数
implementation
{$R *.DFM}//
function FindInTable(CSource:char):integer;
begin
result:=Pos(string(CSource),BaseTable)-1;
end;
////function DecodeBase64(Source:string):string;
var
SrcLen,Times,i:integer;
x1,x2,x3,x4,xt:byte;
begin
result:='';
SrcLen:=Length(Source);
Times:=SrcLen div 4;
for i:=0 to Times-1 do
begin
x1:=FindInTable(Source[1+i*4]);
x2:=FindInTable(Source[2+i*4]);
x3:=FindInTable(Source[3+i*4]);
x4:=FindInTable(Source[4+i*4]);
x1:=x1 shl 2;
xt:=x2 shr 4;
x1:=x1 or xt;
x2:=x2 shl 4;
result:=result+chr(x1);
if x3= 64 then break;
xt:=x3 shr 2;
x2:=x2 or xt;
x3:=x3 shl 6;
result:=result+chr(x2);
if x4=64 then break;
x3:=x3 or x4;
result:=result+chr(x3);
end;
end;
/////function EncodeBase64(Source:string):string;
var
Times,LenSrc,i:integer;
x1,x2,x3,x4:char;
xt:byte;
begin
result:='';
LenSrc:=length(Source);
if LenSrc mod 3 =0 then
Times:=LenSrc div 3
else
Times:=LenSrc div 3 + 1;
for i:=0 to times-1 do
begin
if LenSrc >= (3+i*3) then
begin
x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
xt:=(ord(Source[1+i*3]) shl 4) and 48;
xt:=xt or (ord(Source[2+i*3]) shr 4);
x2:=BaseTable[xt+1];
xt:=(Ord(Source[2+i*3]) shl 2) and 60;
xt:=xt or (ord(Source[3+i*3]) shr 6);
x3:=BaseTable[xt+1];
xt:=(ord(Source[3+i*3]) and 63);
x4:=BaseTable[xt+1];
end
else if LenSrc>=(2+i*3) then
begin
x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
xt:=(ord(Source[1+i*3]) shl 4) and 48;
xt:=xt or (ord(Source[2+i*3]) shr 4);
x2:=BaseTable[xt+1];
xt:=(ord(Source[2+i*3]) shl 2) and 60;
x3:=BaseTable[xt+1];
x4:='=';
end else
begin
x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
xt:=(ord(Source[1+i*3]) shl 4) and 48;
x2:=BaseTable[xt+1];
x3:='=';
x4:='=';
end;
result:=result+x1+x2+x3+x4;
end;
end;//////////
procedure TForm1.Button1Click(Sender: TObject);
//var MailTo,MailBody:TStringList;
begin
Nmsmtp1.Host :=Edit1.Text;
nmsmtp1.Port :=25;
nmsmtp1.UserID :=Edit2.Text;//发信人的用户名,必须是真实的
nmsmtp1.ReportLevel :=1;
Nmsmtp1.TimeOut :=10000;
nmsmtp1.Connect ; ///连接
if AuthSucc=true then ////验证成功
begin
nmsmtp1.PostMessage.FromAddress:=Edit4.Text; //发信人的电子邮件地址
nmsmtp1.PostMessage.ToAddress.Text :=Edit5.Text;
nmsmtp1.PostMessage.Body.Text:=Memo1.Text;
nmsmtp1.PostMessage.Subject :=Edit6.Text;
nmsmtp1.SendMail;
end;
end;procedure TForm1.NMSMTP1Connect(Sender: TObject);
begin
//////连接成功,下面用户认证过程
StatusBar1.SimpleText:=nmsmtp1.Status;
if nmsmtp1.ReplyNumber = 250 then
StatusBar1.SimpleText:=nmsmtp1.Transaction('auth login'); //开始认证
if nmsmtp1.ReplyNumber =334 then //返回值为334,让你输入用BASE64编码后的用户名
StatusBar1.SimpleText:=nmsmtp1.Transaction(EncodeBase64(Edit2.Text));
if nmsmtp1.ReplyNumber =334 then // 返回值为334,让你输入用BASE64编码后的用户密码
StatusBar1.SimpleText:=nmsmtp1.Transaction(EncodeBase64(Edit3.Text));
if nmsmtp1.ReplyNumber =235 then
begin
StatusBar1.SimpleText:='successful';
AuthSucc:=true;
end;
end;procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean);
begin
StatusBar1.SimpleText :='Invalid Host';
end;
procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject);
begin
StatusBar1.SimpleText :='connect failed';
end;
procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String);
begin
StatusBar1.SimpleText :=nmsmtp1.Status ;
end;
procedure TForm1.NMSMTP1SendStart(Sender: TObject);
begin
StatusBar1.SimpleText :='start send';
end;
procedure TForm1.NMSMTP1Success(Sender: TObject);
begin
StatusBar1.SimpleText:='send success!';
end;end.请揭帖~
------------------------------------------------------------------
SendMail
------------------------------------------------------------------
553
-------------------------------------------------------
------SMTP登录出错。新浪邮件系统增加了SMTP服务认证。
从2001年2月28日........................
-------------------------------------------------------
所以,你看,即使选择AuthenticationType也是不行的,反而多了一个错误提示:(
例如,你单位的信箱是 [email protected], 你Personal Email account: [email protected], 新浪邮箱为:[email protected],使用MailClient里的例子做了邮件服务器,然后做了以下的Unit Test
[email protected] 成功地发送到 [email protected]
但[email protected] 发送到 [email protected] 失败。
如果是这样的话,我首先想了解以下的信息:
使用Outlook或FoxMail, [email protected] 发送到 [email protected], 状态怎样?
[email protected] 发送到 [email protected]或 [email protected] 状态怎样?如果你在[email protected]或[email protected]的信箱里收不到任何信息的话,说明你单位的邮件服务器有问题。如果收到信息的话,则可能是你使用MailClient里的例子有问题。
你可不可以先回答我这些?
使用foxmail,这几个邮箱之间发都没问题。
[email protected] 发送到 [email protected]或 [email protected] 状态:提示553 host deny relay.
[email protected]发送到[email protected] 也正常。
正因为foxmail里的正常,所以我才觉得单位邮件服务器没有问题的。如果程序有问题,那么为什么sina给sina\163发都没问题呢?现在,我也搞不清哪里的问题啦!
我用“邮件特快专递”已经解决了这个问题。
但是仍然想知道发送到smtp服务器怎样解决。
------------------------------------------------------------------
“邮件特快专递”这个词现在已经是被广大的网民所熟知了,它就好比是网络上的EMS,能够直接把邮件送到对方的邮箱中,邮件发送完毕后,对方就可以立刻收到。Foxmail在其
最新的4.0版本中也特别新增了该功能,作为一名编程爱好者,你是不是也想知道如何编程
实现该功能呢?那就随本文一起揭开“邮件特快专递”的神秘面纱:
一、实现原理
在Outlook Express中,可通过查看邮件的属性得到该邮件的头部资料。我们拿一封不是特快专递的普通邮件来进行剖析,下面是笔者一封邮件的头部资料:
Received: from sm1.163.com([202.108.44.203]) by peoplemail.com.cn(JetMail 2.5.3.0)
with SMTP id jm1ac3c063eec; Thu, 29 Nov 2001 07:20:25 -0000
Received: from xubo (unknown [61.154.94.146])
by sm1.163.com (Postfix) with ESMTP id 99CF11C461061
for <[email protected]>; Thu, 29 Nov 2001 15:12:49 +0800 (CST)
……
从该头部资料可以看出,邮件传递的路线是由xubo→sm1.163.com→peoplemail.com.cn,其
中xubo是本人所在机器,邮件是经由sm1.163.com这个中转站才送到目的地的,而我们平常
所说的邮件特快专递,就是把邮件直接送到目的地而不需要中转站。
如何才能知道目的地的地址呢?我们知道电子邮件的地址由用户名(username)和邮箱域
名(address.com)两部分构成的,给域名服务器发送针对“address.com”的MX指令查询
即可找到目的地的地址。被查出来的目的地可能不止一个,有时这些目的地是有优先级别
之分的,分别对应着邮件的优先级别,你可以根据邮件优先级的不同对应发送,也可以任
意选择其中一个发送,本文的示例将选择反馈回来的第一个目的地发送,读者可根据实际
需要进行改进。
二、用到的核心组件
本文将采用Indy控件集进行域名查询、邮件发送部分的编程。INDY的全名是Internet
Direct(也叫Winshoes),是一套开放源代码、跨平台、优秀的Internet控件集,它支持
大部分流行的Internet协议。Delphi 6已经包含了该控件集,如果你使用的是Delphi 6以
前的版本,请先到Indy主页http://www.nevrona.com/Indy/Download.html下载并安装该
控件集。
三、窗口设计
向窗体上放置三个TEdit组件,一个TMemo组件,四个Tlabel组件,用到的Indy组件为
TIdDNSResolver、TIdAntiFreeze、TIdSMTP、TIdMessage。其中TIdDNSResolver是用来向
域名服务器发出查询请求并得到结果,TIdMessage用来构建邮件,TIdSMTP用来发送邮件,
TidAntiFreeze可以确保Indy在工作时程序能响应来自外界的消息(注:Indy是以同步的方
式进行工作的,在读或写操作完成之前,其它代码无法执行,加入TidAntiFreeze可以在
每隔一段时间通过呼叫Application.ProcessMessage方法响应来自外界的消息。)
程序的界面如下图所示(箭头所指向的文字标识了该组件的名字):
四、程序代码(代码中包含了详细的说明)
……(前面一部分省略)
type
TForm1 = class(TForm)
IdDNSResolver: TIdDNSResolver;
IdAntiFreeze1: TIdAntiFreeze;
btnSend: TButton;
IdSMTP: TIdSMTP;
IdMsgSend: TIdMessage;
mmContent: TMemo;
Label1: TLabel;
edtTo: TEdit;
Label4: TLabel;
Label5: TLabel;
edtFrom: TEdit;
Label6: TLabel;
edtSubject: TEdit;
procedure btnSendClick(Sender: TObject);
private
{ Private declarations }
procedure GetMxList(AMxList: TStringList; AQName: string);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
{ 这个过程是用来得到邮件特快专递目的地服务器名称及优先级别数,参数AMXList是
用来接收结果值,AQName代表传递过来的域名 }
procedure TForm1.GetMxList(AMxList: TStringList; AQName: string);
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;
{ 单击"发送"按钮时发送专递邮件 }
procedure TForm1.btnSendClick(Sender: TObject);
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;
end.
本程序在Windows 2000 + Delphi 6 下调试通过,点击这里下载。
http://www.ccw.com.cn/htm/app/down/1204Source.zip
所以你用sina和163互发邮件可以很正常。所以,你是否可以提供你使用的Host名称和你的帐号给我?
假设你单位的帐号是:[email protected]
如果你可以通过Debug source, 检查TClientSocket.Host是否等于smtp.hello.com?
而 TClientSocket。PostMessages.FromAddress是否等于[email protected]
据说是indy8的一个bug,
试试indy9
SendText('RCPT TO:' + '<' + PostMessages.ToAddress + '>' + CRLF);
RecvText;
这就是接收方伯邮件服务器拒绝了来历不明的邮件。
但你曾说过用Foxmail可以成功地发送出去,由于我没有使用Foxmail,所以用Outlook来代替,但出理同样的错误:
無法傳送郵件,因為某位收件者被伺服器拒絕。被拒絕的電子郵件地址是 '[email protected]"。 主旨 '543543', 帳戶: 'pop3.sanlian.com.cn', 伺服器: 'smtp.sanlian.com.cn', 通訊協定: SMTP, 伺服器回應: '553 host deny relay (eyou mta)', 連接埠: 25, 安全(SSL): 否, 伺服器錯誤: 553, 錯誤碼: 0x800CCC79
你是否确定你单位的邮件服务器没问题?