28. juni 2001 - 02:41
Der er
9 kommentarer og
1 løsning
SMTP
Jeg vil gerne sende en mail via min egen mailserver.
Men får incorrect command sequence ved NMSMTP fra fastnet.
Er der en fejl i denne kode?
Eller er det muligt at køre SMTP \"rent\", så jeg bare send skriver de kommandoer den skal bruge?
I loggen til mailserveren, kan jeg se at den ikke sender en modtageradresse, men kun fra, og så data = Forkert rækkefølge...
form1.NMSMTP1.Host:=\'localhost\';
form1.NMSMTP1.port:=25;
form1.NMSMTP1.UserID:=\'root\';
form1.NMSMTP1.connect;
form1.NMSMTP1.PostMessage.Body.add(body);
form1.NMSMTP1.PostMessage.FromAddress:=\'www@localhost\';
form1.NMSMTP1.PostMessage.ToAddress.add(fra);
form1.NMSMTP1.PostMessage.Subject:=kommando;
form1.NMSMTP1.SendMail;
fra, body og kommando er String
Her er noget code, jeg benytter i et program jeg har skrevet. Coden virker, så måske kan den gi\' inspiration?
Det skal lige siges, at der i coden kaldes en rutine kaldet GetEmailUserInfo. Det er en rutine jeg har skrevet, der går ind i registrerings databasen og der finder oplysninger om POP3UserID, SMTPServer adresse, Email adresse mv. Dette er kun nødvendigt, fordi min application kommer ud til mange forskellige folk med forskellige mail systemer (Outlook, Notes etc.). Hvis info ikke kan findes i RegDB\'en (fx. fordi brugeren benytter et for mig ukendt email system, således at jeg ikke ved hvorledes jeg finder informationerne, så spørges brugeren og indtastede data gemes til en anden god gangs skyld.
Hvis denne info er kendt, som den ser ud til at være i dit eksempel, så er det jo inderligt overflødigt.
Function TfmSendEmail.SendMail : Boolean;
Const
ExcepTxt = \'Send Mail action aborted by user.\';
Procedure ParseAddressToStrings(Addr : String; Strings : TStrings);
Begin
// Remove all space chars.
While Pos(\' \', Addr) > 0 Do
Delete(Addr, Pos(\' \', Addr), 1);
// Change all \',\'s to \';\'s.
While Pos(\',\', Addr) > 0 Do
Addr[Pos(\',\', Addr)] := \';\';
While Length(Addr)>0 Do
If Pos(\';\', Addr)=0 Then
Begin // Only one address is contained (or left) in string. Add it.
Strings.Add(Addr);
Addr := \'\';
End
Else
Begin // There are more than one address in string. Add the first.
Strings.Add(Copy(Addr, 1, Pos(\';\', Addr)-1));
// Delete address separator (\';\')
Delete(Addr, 1, Pos(\';\', Addr));
End;
End;
begin
Result := False;
If Not NMSMTP1.Connected Then
Begin
If Not GetEmailUserInfo Then
Begin
{ DONE : Ask user for email info }
Try
If Not InputQuery(\'Input mail account information\',
\'User ID, eg. mbx2345\', FPOP3UserID) Then
Raise Exception.Create(ExcepTxt);
If Not InputQuery(\'Input mail account information\',
\'SMTP Server, eg. mailbox.tele.dk\', FSMTPServer) Then
Raise Exception.Create(ExcepTxt);
If Not InputQuery(\'Input mail account information\',
\'User Name, eg. John Doe\', FSMTPDispName) Then
Raise Exception.Create(ExcepTxt);
If Not InputQuery(\'Input mail account information\',
\'Reply email address, eg. John@doe.com\', FSMTPEmailAdd) Then
Raise Exception.Create(ExcepTxt);
{ DONE : Store entered info to next time }
SaveEmailUserInfoInRegDB;
Except
Result := False;
Exit;
End;
End;
NMSMTP1.UserID := FPOP3UserID; // eg. \'xxx12345\';
NMSMTP1.Host := FSMTPServer; // eg. \'pasmtp.tele.dk\';
NMSMTP1.Port := FSMTPPort;
NMSMTP1.Connect;
End;
NMSMTP1.ClearParams := True;
NMSMTP1.SubType := mtPlain;
NMSMTP1.EncodeType := uuMime;
With NMSMTP1.PostMessage Do
Begin
FromName := FSMTPDispName;
FromAddress := FSMTPEmailAdd;
ReplyTo := FSMTPEmailAdd;
ParseAddressToStrings(edTo.Text, ToAddress);
ParseAddressToStrings(edCC.Text, ToCarbonCopy);
Subject := edSubject.Text;
Body.Text := meText.Text;
Date := DateToStr(Now);
LocalProgram := \'TAGARNO POLLUX\';
Attachments.Assign(lbAttachedFiles.Items);
End;
Screen.Cursor := crHourGlass;
Try
NMSMTP1.SendMail;
Result := True;
Finally
Screen.Cursor := crdefault;
End;
end;
Umiddelbart ser det ud til at du mangler følgende linier i forhold til min kode:
NMSMTP1.ClearParams := True;
NMSMTP1.SubType := mtPlain;
NMSMTP1.EncodeType := uuMime;
Jeg sættter også nogle enkelte andre properties, fx. FromName, Date og LocalProgram, men det burde være ligegyldigt.
Desuden er det ulogisk at din modtager adresse hedder \"fra\" (men hvad ved jeg...) ;)
Peter
modtageren hedder fra, fordi programmet checker mails og sender et svar, afhængingt at indholdet af mailens linje 1.
Det overstående virkede ikke, den fatteede ikke de her 2 linjer, og fik exception \"incomplete header\".
Jeg prøver med en anden komponent.
form1.NMSMTP1.SubType := mtPlain;
form1.NMSMTP1.EncodeType := uuMime;
Hvad men er du med at ovenstående ikke virker. Har du kørt mit program, dvs. fjernet alt det unødvendige og set hvad der sker?
Dvs. noget i retning af:
procedure TForm1.Button1Click(Sender: TObject);
begin
NMSMTP1.UserID := \'xxx12345\'; // Brug dine egne data her
NMSMTP1.Host := \'pasmtp.tele.dk\'; // Brug dine egne data her
NMSMTP1.Port := 25; // Brug dine egne data her
NMSMTP1.Connect;
NMSMTP1.ClearParams := True;
NMSMTP1.SubType := mtPlain;
NMSMTP1.EncodeType := uuMime;
NMSMTP1.PostMessage.FromName := \'Niels Peter Gibe\';
NMSMTP1.PostMessage.FromAddress := \'np@tagarno.dk\';
NMSMTP1.PostMessage.ReplyTo := \'np@tagarno.dk\';
NMSMTP1.PostMessage.Subject := \'Hest\';
NMSMTP1.PostMessage.ToAddress.Add(\'mora@ready.dk\');
NMSMTP1.PostMessage.ToCarbonCopy.Add(\'Rytter@Hest.com\');
NMSMTP1.PostMessage.Body.Add(\'Hest.\'+#13+#10+
\'Denne mail er sendt fra Delphi med en NMSMTP\');
NMSMTP1.SendMail;
end;
Det bør sgu. virke. Det gør det altså hos mig. Jeg har lige prøvet det, så du skulle altså genre ha modtaget en test mail (i fald du staig bruger adressen \'mora@ready.dk).
Peter
Dammit ...
Jeg var led nok til at skrive til deres support :)
De svarede at min fra variabel, højst sandsynlig var invalid.
Korrekt...
Jeg tror den indeholder et \"space\" tilsidst :(
___
Most probably the address given in fra was either invalid, had the wrong format, was among those the server didn\'t relay to or the server didn\'t have authentication to relay to.
regards ken