Форум: "Сети";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизIndy9-SMTP-Server Найти похожие ветки
← →
Winni (2004-12-30 13:07) [0]Добрый день, уважаемые мастера !
Пытаюсь понять работу SMTP-Srver. Скачал демо от Indy (ANeillans Version: 9.0.17) и не могу понять, почему не работает подпрограммка:
procedure TForm1.IdSMTPServer1ReceiveMessageParsed(ASender: TIdCommand;
var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
var CustomError: String);
begin
// This is the main event if you have opted to have the idSMTPServer to do your parsing for you.
// The AMessage contains the completed TIdMessage.
// NOTE: Dont forget to add IdMessage to your USES clause!
ToLabel.Caption := AMsg.Recipients.EMailAddresses;
FromLabel.Caption := AMsg.From.Text;
SubjectLabel.Caption := AMsg.Subject;
Memo1.Lines := AMsg.Body;
// Implement your file system here :)
end;
в том смысле, что ничего не появляется в лейблах и Memo1.
Беседую с этим сервером на локальной машине при помощи телнет, т е
telnet 127.0.0.1 25 <здесь он приветствует>
helo er.rt <тоже что-то говорит>
mail from:df@rt
rcpt to:rt@iu <все эти адреса принимает, проверяет только наличие @>
data <приглашает ввести данные>
11111
2222
.
quit <конец>
С этой штукой долбаюсь около месяца, в 8-м Indy, теперь скачал 9-й, может, перейти на 10-й? Но раписано, что 10-й для .NET будет ли работать в D6? Могу поставить Д7, боюсь не поможет.
Удается решить эту задачку используя потоки, но это явно не то, что задумано индейцами. Вот как можно:
implementation
Var SMServ:TIdSMTPServer; id:Boolean=false; Lisa: TStringList;
mal:boolean=true; rcp:Boolean=true; My1Sender: TIdCommand;
procedure TForm1.OnRe(ASender: TIdCommand; var VStream: TStream;
RCPT: TIdEMailAddressList; var CustomError: string);
var busik:string; ii:Integer; ch:Char;
begin
Memo3.Clear; busik:="";
for ii:=1 to VStream.Size do
begin VStream.position:= ii-1; VStream.Read(Ch,1);
if (ch<>#13) and (ch<>#10) then busik:=busik+Ch else
if ch=#13 then begin
Lisa.Add(busik);
{ Memo3.Lines.Add(busik);} busik:="";
end;
end; Busik:="~~ The End ~~"; Lisa.Add(busik);
{Edit1.Text:= inttostr(VStream.Size);} Id := True;
My1Sender:=ASender;
end;
Т е поток Lisa:TStringList заполняется нормально, а потом из него
заполняю файлы почтовых ящиков.
Помогите пожалуйста, нормально решить задачку.
← →
aus (2004-12-30 14:24) [1]ReceiveMode := rmMessageParsed
Вообще посмотри какие события происходят в зависимости от ReceiveMode
← →
Winni (2004-12-30 18:47) [2]Спасибо,Aus!
Это я не написал, но ReceiveMode = rmMessageParsed присвоено в Object Inspector. Была у меня версия, когда использовал не компонент, а модуль IdSMPTServer, там присваивал ReceiveMode := rmMessageParsed внутри TForm1.Create.
← →
Winni (2004-12-31 00:18) [3]Всего хорошего всем в Новом Году !
Продолжаю долбить свою задачу. Но крутюсь на месте. Постаил снова Д7. Процедурка теперь такая:
procedure TForm1.IdSMTPServer1ReceiveMessageParsed(ASender: TIdCommand;
var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
var CustomError: String);
begin
// This is the main event if you have opted to have the idSMTPServer to do your parsing for you.
// The AMessage contains the completed TIdMessage.
// NOTE: Dont forget to add IdMessage to your USES clause!
BEEP; {sleep(1000);beep;}
Lisa := "+"+TIdSMTPServerThread(ASender.Thread).From +"+"+
TIdSMTPServerThread(ASender.Thread).RCPTList.EMailAddresses;
ToLabel.Caption := AMsg.Recipients.EMailAddresses;
FromLabel.Caption := AMsg.From.Text;
SubjectLabel.Caption := AMsg.Subject;
Memo1.Lines := AMsg.Body;
// Implement your file system here :)
end;
При этом Lisa: String; Адреса From и To передаются нормально и
затем я делаю по щелчку кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin
Label5.Caption:=">"+Lisa+"<";
end;
а объект AMsg видно, приходит пустой.
В модуле IdSMTPServer при этом происходит вот что:
rmMessageParsed:
begin
if not Assigned(OnReceiveMessageParsed) then
raise
EIdTCPServerError.Create("No OnReceiveMessageParsed defined."); {Do not Localize}
try
LMsg := TIdMessage.Create(Nil);
LMsg.NoDecode := fNoDecode;
LMsg.NoEncode := fNoEncode;
LMsgClient := TIdMessageClient.Create(Nil);
LMsgClient.IOHandler := ASender.Thread.Connection.IOHandler;
LMsgClient.ProcessMessage(LMsg);
LMsg.Headers.Values["X-Server"] := FMessages.XServer; {Do not Localize}
// Match RCTPList to the TO Field in msg. Difference is the BCCList.
// Check the TO
if TIdSMTPServerThread(ASender.Thread).RCPTList.Count > 0 then
for x := 1 to TIdSMTPServerThread(ASender.Thread).RCPTList.Count do
begin
if IndyPos(TIdSMTPServerThread(ASender.Thread).RCPTList.Items[x
- 1].Address, LMsg.Recipients.EMailAddresses) = 0 then
begin
if IndyPos(TIdSMTPServerThread(ASender.Thread).RCPTList.Items[x - 1].Address, LMsg.CCList.EMailAddresses) = 0 then
Lmsg.BCCList.Add.Text := TIdSMTPServerThread(ASender.Thread).RCPTList.Items[x - 1].Text;
end;
end;
{ Lisa:= "+"+LMsg.From.Text+"+"; }
OnReceiveMessageParsed(ASender, LMsg, TIdSMTPServerThread(ASender.Thread).RCPTList, CustomError);
finally
LMsgClient.IOHandler := nil;
FreeAndNil(LMsgClient);
FreeAndNil(LMsg);
end;
end;
end;
CustomError := Trim(CustomError);
if CustomError = "" then {Do not Localize}
begin
ASender.Thread.Connection.WriteLn("250 " + Messages.DataReplies.EndDataReply); {Do not Localize}
TIdSMTPServerThread(ASender.Thread).SMTPState := idSMTPData;
end
else
ASender.Thread.Connection.Writeln(CustomError);
end
else // No EHLO / HELO was received
ASender.Thread.Connection.Writeln("501 " + FMessages.Greeting.NoHello); {Do not Localize}
end;
И не пойму, что значит {Do not Localize}?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c