Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TSendMail (https://www.delphipraxis.net/201242-tsendmail.html)

HiWieGehts 4. Jul 2019 11:06

TSendMail
 
hallo,
ich versuche seit Tagen in Delphi 10 eine Mail mit vorangestellten Werten zu erzeugen. Ich finde im WWW keine brauchbare Info, wie die TSendMail-Komponente zu verwenden ist. Wer kann mir helfen? Bekomme immer die Fehlermeldung UserAbort ohne dass das Mail-Fenster geöffnet wird. Codeauszug:
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    ActionList1: TActionList;
    [B] InternetSendMail1: TSendMail;[/B]

procedure TForm2.Button1Click(Sender: TObject);
var
  OK: Boolean;
// RC: TRecipientCollection;
// RI: TRecipientItem;
// CI: TCollectionItem;
begin
  // RI := TRecipientItem.Create(RC);
  // InternetSendMail1.Recipients := rc;
  // RC := TRecipientCollection.Create(InternetSendMail1);
  // RC.Clear;
//  InternetSendMail1.Recipients.Clear;
  // ri.Create(CI);
  InternetSendMail1.OnMailSendStatus := SendStatus;
  InternetSendMail1.Recipients.Add;
//  InternetSendMail1.Recipients.Count;
  InternetSendMail1.Recipients[0].Address      := 'Empfänger@aon.at';
  InternetSendMail1.Recipients[0].RecipientType := rtPrimary;
  InternetSendMail1.Recipients[0].DisplayName  := 'Name';
  InternetSendMail1.Subject := 'Test';
  InternetSendMail1.Text.Add('Testtext');
//  // rc..Assign(ri);
  // InternetSendMail1.Recipients.Assign(RC);
  // RC.Add;
  // RC.                       := InternetSendMail1.Recipients;
//  InternetSendMail1.Visible := True;
  OK := InternetSendMail1.Execute;
end;
Win 10 64 Bit
Outlook 365

DieDolly 4. Jul 2019 11:11

AW: TSendMail
 
Muss es dieses TSendMail sein? Wenn nicht, hätte ich eine bessere Lösung für dich.
Ich kenne TSendMail eh nicht. Meine Lösung braucht die Daten eines SMTP-Servers.

hoika 4. Jul 2019 12:16

AW: TSendMail
 
Hallo,
nimm doch mal das Bsp. aus der Hilfe.

http://docwiki.embarcadero.com/CodeE...ndMail_(Delphi)

Dann musst du zwar ein paar Sache eintragen (Empfänger),
aber wenn das geht, kannst du deine Sachen schrittweise wieder reinnehmen.

Delphi.Narium 4. Jul 2019 15:16

AW: TSendMail
 
Das Beispiel ist unvollständig:

Welchen SMTP-Server nutzt Du?
Welche Ports nutzt Du?

Der Fehler kann bedeuten, dass mit Benutzername und Passwort, sowie SMTP-Server und / oder Port eine gültige Anmeldung nicht möglich ist.

Bei Nutzung anderer Komponenten wird dieses Problem bestehen bleiben, bis auf jeden Fall alle Angaben korrekt sind.
Sind sie jedoch alle korrekt, sollte die Nutzung der Komponenten egal sein.

Tante Google liefert als erstes Ergebnis : https://www.google.com/search?q=mail...utf-8&oe=utf-8

Dann wäre da noch:
http://telekomcenter.at/mailservereinstellungen/
https://www.a1.net/hilfe-kontakt/art...00000000027481
und viele andere ...

Michael II 4. Jul 2019 17:42

AW: TSendMail
 
Ich glaube TSendMail verwendet die MAPI Schnittstelle.

Wenn dem so ist: Wenn du ein MAPI fähiges eMail Programm P installiert hast (und dort MAPI eingeschaltet ist), dann sendet TSendMail an P und dann wird deine eMail von P aus gesendet.

Im Help steht:
the e-mail is shown for editing (with the help of any e-mail application available on the computer).


Sende doch deine eMail direkt an den Mailserver via die entsprechende Indy oder ICSOverbyte (SyncSmtpCli oder SslSmtpClient) oder irgend eine andere eMail Komponente.

Mit ICSOverbyte (via Delphi "Tools > GetIt…" installierbar) SycSMTPCli zum Beispiel so:

Delphi-Quellcode:
 
  SyncSmtpCli1.AbortSync;

  SyncSmtpCli1.SignOn := 'swiss.ch';
  SyncSmtpCli1.FromName := 'supp@swiss.ch';
  SyncSmtpCli1.HdrFrom := 'supp@swiss.ch';
  SyncSmtpCli1.Host := 'mail.swiss.ch';
  SyncSmtpCli1.Password := mailpw;
  SyncSmtpCli1.UserName := mailID;
  SyncSmtpCli1.AuthType := smtpAuthLogin;

  SyncSmtpCli1.HdrTo := ….
  SyncSmtpCli1.RcptName.Clear;
  SyncSmtpCli1.RcptName.Add( SyncSmtpCli1.HdrTo );
  SyncSmtpCli1.HdrSubject := ….
  SyncSmtpCli1.MailMessage.Text := ….

  SyncSmtpCli1.ConnectSync;
  SyncSmtpCli1.EhloSync;
  SyncSmtpCli1.AuthSync;
  SyncSmtpCli1.MailSync;
  SyncSmtpCli1.QuitSync;
Wobei die obigen Methoden TRUE zurückgeben, wenn OK. D.h. du solltest die Rückgabewerte von ConnectSync bis QuitSync noch sinnvoll auswerten...

philipp.hofmann 5. Jul 2019 07:17

AW: TSendMail
 
Hier mal eine Beispielklasse, wie ich auf allen Betriebssystemen Mails versende,
dies nutzt aber nicht deinen E-Mail-Client, sondern verschickt Mails im Hintergrund über einen SMTP-Server:

Delphi-Quellcode:
unit EmailUtils;

interface

uses
  IdSMTP, IdMessage, IdEMailAddress, IdAttachmentFile,
  IdSSL, IdSSLOpenSSL, IdExplicitTLSClientServerBase, IdIOHandlerStack,
  IdSMTPBase, IdTCPClient, IdIOHandler, IdIOHandlerSocket,
  System.Classes, System.UITypes;

type
  TEMailUtils = class(TObject)
  public
    class function sendEmail(receiver,subject,body,attachment:String):boolean;
  end;

implementation


{$IFDEF IOS}
  uses System.SysUtils,IdSSLOpenSSLHeaders_Static;
{$ELSE}
  uses System.SysUtils;
{$ENDIF}

class function TEMailUtils.sendEmail(receiver,subject,body,attachment:String):boolean;
var IDSMTP1:TIDSMTP;
    IdIOHandler:TIdIOHandler;
    IdMessage: TIdMessage;
    errorInfo:String;
begin
  Result:=false;
  try
    IDSMTP1:=TIDSMTP.Create();
    IdIOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create();
    try
      errorInfo:='fill IDSMTP1';
      IDSMTP1.Host := '[smtp-server]';
      IDSMTP1.Port := [Port];
      IDSMTP1.IOHandler := IdIOHandler;
      IDSMTP1.AuthType := satDefault;
      IDSMTP1.UseTLS := utUseRequireTLS;
      IDSMTP1.Username := '[username]';
      IDSMTP1.Password := '[password]';
      IdMessage := TIdMessage.Create(nil);
      try
        errorInfo:='fill IdMessage';
        IdMessage.From.Name:='[From]';
        IdMessage.From.Address:='[From-Emailaddress]';
        IdMessage.Subject:=subject;
        IdMessage.Body.Add(body);
        IdMessage.Recipients.EMailAddresses:=receiver;
        if (attachment<>'') then
          TIdAttachmentFile.Create(IdMessage.MessageParts,attachment);
        errorInfo:='check IDSMTP1';
        if not IDSMTP1.Connected then
        begin
          errorInfo:='conect IDSMTP1';
          IDSMTP1.Connect;
        end;
        errorInfo:='send IdMessage';
        IDSMTP1.Send(IdMessage);
        Result:=true;
      finally
        IdMessage.Free;
      end;
    finally
      IDSMTP1.Free;
      IdIOHandler.Free;
    end;
  except on E: Exception do
    //do something
  end;
end;

end.
P.S.: Es müssen natürlich die SMTP-Email-Infos eingetragen werden.
P.P.S. : Ich habe meinen Logging-Code entfernt, damit es kompilierbar ist, kann aber nicht ausschließen, dabei etwas übersehen zu haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz