|
Antwort |
Registriert seit: 26. Nov 2007 15 Beiträge |
#1
Ich möchte aus einer App heraus eine Email versenden. Die App soll universell auf Windows, Android und iOS Geräten einsetzbar sein. Mit dem untenstehenden Code läuft alles super unter Windows und Android. Leider stürzt die App bei iOS einfach ab. Der code ist als universell einsetzbare Klasse geschrieben, so dass er für den einen oder anderen nutzbar sein könnte. Daher poste ich hier mal die ganze Unit. Es wäre super, wenn jemand wüsste was man tun muss, um es unter iOS zum Laufen zu bringen.
Der code basiert auf einem Vorschlag von: Remy Lebeau (TeamB): https://forums.embarcadero.com/messa...ssageID=526373 :
Delphi-Quellcode:
Die Unit kann man z.B. wie folgt benutzen:
unit UnitSendEmail;
interface uses IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdMessage, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin, IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5, IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest, IdSASLAnonymous, IdUserPassProvider, System.Classes; type TSSLEmail = class constructor Create; destructor Destroy; override; private { Private declarations } public { Public declarations } edSMTPServer: string; edSMTPPort: integer; edUserName: string; edPassword: string; edSSLConnection: boolean; edSenderEmail: string; edSenderName: string; edToEmail: string; edCCEmail: string; edBCCEmail: string; edSubject: string; edPriority: TIdMessagePriority; edBody: TStrings; Procedure Init; procedure SendEmail; end; Var SSLEmail1: TSSLEmail; implementation constructor TSSLEmail.Create; begin inherited; edBody := TStringList.Create; end; destructor TSSLEmail.Destroy; begin edBody.Free; inherited; end; procedure TSSLEmail.Init; begin edSMTPServer := ''; edSMTPPort := 0; edUserName := ''; edPassword := ''; edSSLConnection := True; edSenderEmail := ''; edSenderName := ''; edToEmail := ''; edCCEmail := ''; edBCCEmail := ''; edSubject := ''; edPriority := TIdMessagePriority.mpNormal; edBody.Clear; end; procedure TSSLEmail.SendEmail; var IdMessage: TIdMessage; // enthält Eigenschaften der Email SMTP: TIdSMTP; // enthält Eigenschaften des SMTP Servers SSLHandler: TIdSSLIOHandlerSocketOpenSSL; // alles weitere ist für die SSL Verschlüsselung IdUserPassProvider: TIdUserPassProvider; IdSASLCRAMMD5: TIdSASLCRAMMD5; IdSASLCRAMSHA1: TIdSASLCRAMSHA1; IdSASLPlain: TIdSASLPlain; IdSASLLogin: TIdSASLLogin; IdSASLSKey: TIdSASLSKey; IdSASLOTP: TIdSASLOTP; IdSASLAnonymous: TIdSASLAnonymous; IdSASLExternal: TIdSASLExternal; begin IdMessage := TIdMessage.Create(nil); try // Eigenschaften der email setzen IdMessage.ContentType := 'text/plain'; IdMessage.Charset := 'UTF-8'; IdMessage.Body.Assign(edBody); IdMessage.Sender.Text := edSenderEMail; IdMessage.From.Name := edSenderName; IdMessage.From.Address := edSenderEMail; IdMessage.ReplyTo.EMailAddresses := edSenderEmail; IdMessage.Recipients.EMailAddresses := edToEmail; IdMessage.Subject := edSubject; IdMessage.Priority := edPriority; IdMessage.CCList.EMailAddresses := edCCEMail; IdMessage.ReceiptRecipient.Text := ''; IdMessage.BccList.EMailAddresses := edBCCEMail; SMTP := TIdSMTP.Create(nil); try if edSSLConnection then begin SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP); // SSLHandler.MaxLineAction := maException; SSLHandler.SSLOptions.Method := sslvSSLv23; // SSL/TLS handshake determines the highest available SSL/TLS version dynamically SSLHandler.SSLOptions.Mode := sslmClient; SSLHandler.SSLOptions.VerifyMode := []; SSLHandler.SSLOptions.VerifyDepth := 0; SMTP.IOHandler := SSLHandler; if edSMTPPort=587 then SMTP.UseTLS := utUseExplicitTLS else SMTP.UseTLS := utUseImplicitTLS; // ImplicitTLS insbesondere auch bei Port 465 end; if (edUserName<>'') or (edPassword<>'') then begin SMTP.AuthType := satSASL; // Username und Passwort verschlüsselt bereitstellen IdUserPassProvider := TIdUserPassProvider.Create(SMTP); IdUserPassProvider.Username := edUserName; IdUserPassProvider.Password:= edPassword; // SASL-Komponenten für SSL Verschlüsselung IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP); IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider; IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP); IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider; IdSASLSKey := TIdSASLSKey.Create(SMTP); IdSASLSKey.UserPassProvider := IdUserPassProvider; IdSASLOTP := TIdSASLOTP.Create(SMTP); IdSASLOTP.UserPassProvider := IdUserPassProvider; IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP); IdSASLExternal := TIdSASLExternal.Create(SMTP); IdSASLLogin := TIdSASLLogin.Create(SMTP); IdSASLLogin.UserPassProvider := IdUserPassProvider; IdSASLPlain := TIdSASLPlain.Create(SMTP); IdSASLPlain.UserPassProvider := IdUserPassProvider; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5; SMTP.SASLMechanisms.Add.SASL := IdSASLSKey; SMTP.SASLMechanisms.Add.SASL := IdSASLOTP; SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous; SMTP.SASLMechanisms.Add.SASL := IdSASLExternal; SMTP.SASLMechanisms.Add.SASL := IdSASLLogin; SMTP.SASLMechanisms.Add.SASL := IdSASLPlain; end else begin SMTP.AuthType := satNone; end; // Verbindung zum Server herstellen und email senden SMTP.Host := edSMTPServer; SMTP.Port := edSMTPPort; SMTP.ConnectTimeout := 30000; SMTP.UseEHLO := True; SMTP.Connect; // verbinden try SMTP.Send(IdMessage); // senden finally SMTP.Disconnect; // Verbindung lösen end; finally SMTP.Free; end; finally IdMessage.Free; end; end; end.
Delphi-Quellcode:
Unter iOS tritt der Fehler in der Zeile "SMTP.Connect;" auf. Das Fenster geht einfach zu und nichts passiert. Unter Windos und Android wird die mail wie gewünscht verschickt. Es wäre super, wenn ihr mir helfen könntet, den code auch unter iOS zum Laufen zu bringen.
procedure THeaderFooterForm.Button1Click(Sender: TObject);
begin if Edit1.Text<>'' then begin With SSLEmail1 do begin // Konkrete Daten dieser Email edSenderName := 'Mein Name'; // Name, der als Absender erscheint edSenderEmail := 'Username@gmail.com'; // Meine Emailadresse, von der ich sende; edToEmail := Edit1.Text; edCCEmail := ''; edBCCEmail := ''; edSubject := Edit2.Text; edBody := Memo1.Lines; SendEmail; // Email absenden Edit1.Text:=''; Edit2.Text:=''; Memo1.SelectAll; Memo1.DeleteSelection; end; end; end; procedure THeaderFooterForm.FormCreate(Sender: TObject); begin SSLEmail1 := TSSLEmail.Create; // Serverdaten und Verbindungseigenschaften festlegen With SSLEmail1 do begin Init; edSMTPServer := 'smtp.googlemail.com'; // SMTP Server hier das Beispiel von Google-Mail edSMTPPort := 465; // Port auf dem Server edSSLConnection := True; // SSL Verbindung verwenden edUserName := 'Username@gmail.com'; // Mein Username von dem ich die Mail sende edPassword := 'Passwort'; // Mein Passwort dazu end; end; |
Zitat |
Registriert seit: 14. Apr 2008 3.006 Beiträge Delphi 2009 Professional |
#2
iOS habe ich leider nicht, aber einen "Absturz" auf Windows am Programmende konnte ich durch Freigabe des TSSLEmail Objekts nach dem Senden der Mail erreichen. Ursache ist die fehlerhafte Zuweisung des Body Textes, hier muss Assign verwendet werden.
Weitere kleine Änderungen: Units die im Interface nicht benötigt werden habe ich in implementation verschoben, Create(nil) durch Create ersetzt und die implizite published Sichtbarkeit des Konstruktors und Destruktors auf public geändert.
Delphi-Quellcode:
unit IndySecureMailClient;
interface uses IdMessage, Classes; type TSSLEmail = class(TObject) private FedBody: TStrings; procedure SetBody(const Value: TStrings); public edSMTPServer: string; edSMTPPort: integer; edUserName: string; edPassword: string; edSSLConnection: boolean; edSenderEmail: string; edSenderName: string; edToEmail: string; edCCEmail: string; edBCCEmail: string; edSubject: string; edPriority: TIdMessagePriority; constructor Create; destructor Destroy; override; procedure Init; procedure SendEmail; property edBody: TStrings read FedBody write SetBody; end; implementation uses IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin, IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5, IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest, IdSASLAnonymous, IdUserPassProvider; constructor TSSLEmail.Create; begin inherited; FedBody := TStringList.Create; end; destructor TSSLEmail.Destroy; begin edBody.Free; inherited; end; procedure TSSLEmail.SetBody(const Value: TStrings); begin FedBody.Assign(Value); end; procedure TSSLEmail.Init; begin edSMTPServer := ''; edSMTPPort := 0; edUserName := ''; edPassword := ''; edSSLConnection := True; edSenderEmail := ''; edSenderName := ''; edToEmail := ''; edCCEmail := ''; edBCCEmail := ''; edSubject := ''; edPriority := TIdMessagePriority.mpNormal; edBody.Clear; end; procedure TSSLEmail.SendEmail; var IdMessage: TIdMessage; // enthält Eigenschaften der Email SMTP: TIdSMTP; // enthält Eigenschaften des SMTP Servers SSLHandler: TIdSSLIOHandlerSocketOpenSSL; // alles weitere ist für die SSL Verschlüsselung IdUserPassProvider: TIdUserPassProvider; IdSASLCRAMMD5: TIdSASLCRAMMD5; IdSASLCRAMSHA1: TIdSASLCRAMSHA1; IdSASLPlain: TIdSASLPlain; IdSASLLogin: TIdSASLLogin; IdSASLSKey: TIdSASLSKey; IdSASLOTP: TIdSASLOTP; IdSASLAnonymous: TIdSASLAnonymous; IdSASLExternal: TIdSASLExternal; begin IdMessage := TIdMessage.Create; try // Eigenschaften der email setzen IdMessage.ContentType := 'text/plain'; IdMessage.Charset := 'UTF-8'; IdMessage.Body.Assign(edBody); IdMessage.Sender.Text := edSenderEMail; IdMessage.From.Name := edSenderName; IdMessage.From.Address := edSenderEMail; IdMessage.ReplyTo.EMailAddresses := edSenderEmail; IdMessage.Recipients.EMailAddresses := edToEmail; IdMessage.Subject := edSubject; IdMessage.Priority := edPriority; IdMessage.CCList.EMailAddresses := edCCEMail; IdMessage.ReceiptRecipient.Text := ''; IdMessage.BccList.EMailAddresses := edBCCEMail; SMTP := TIdSMTP.Create; try if edSSLConnection then begin SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP); SSLHandler.SSLOptions.Method := sslvSSLv23; // SSL/TLS handshake determines the highest available SSL/TLS version dynamically SSLHandler.SSLOptions.Mode := sslmClient; SSLHandler.SSLOptions.VerifyMode := []; SSLHandler.SSLOptions.VerifyDepth := 0; SMTP.IOHandler := SSLHandler; if edSMTPPort = 587 then SMTP.UseTLS := utUseExplicitTLS else SMTP.UseTLS := utUseImplicitTLS; // ImplicitTLS insbesondere auch bei Port 465 end; if (edUserName<>'') or (edPassword<>'') then begin SMTP.AuthType := satSASL; // Username und Passwort verschlüsselt bereitstellen IdUserPassProvider := TIdUserPassProvider.Create(SMTP); IdUserPassProvider.Username := edUserName; IdUserPassProvider.Password:= edPassword; // SASL-Komponenten für SSL Verschlüsselung IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP); IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider; IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP); IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider; IdSASLSKey := TIdSASLSKey.Create(SMTP); IdSASLSKey.UserPassProvider := IdUserPassProvider; IdSASLOTP := TIdSASLOTP.Create(SMTP); IdSASLOTP.UserPassProvider := IdUserPassProvider; IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP); IdSASLExternal := TIdSASLExternal.Create(SMTP); IdSASLLogin := TIdSASLLogin.Create(SMTP); IdSASLLogin.UserPassProvider := IdUserPassProvider; IdSASLPlain := TIdSASLPlain.Create(SMTP); IdSASLPlain.UserPassProvider := IdUserPassProvider; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5; SMTP.SASLMechanisms.Add.SASL := IdSASLSKey; SMTP.SASLMechanisms.Add.SASL := IdSASLOTP; SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous; SMTP.SASLMechanisms.Add.SASL := IdSASLExternal; SMTP.SASLMechanisms.Add.SASL := IdSASLLogin; SMTP.SASLMechanisms.Add.SASL := IdSASLPlain; end else begin SMTP.AuthType := satNone; end; SMTP.Host := edSMTPServer; SMTP.Port := edSMTPPort; SMTP.ConnectTimeout := 30000; SMTP.UseEHLO := True; SMTP.Connect; try SMTP.Send(IdMessage); finally SMTP.Disconnect; end; finally SMTP.Free; end; finally IdMessage.Free; end; end; end.
Michael Justin
Geändert von mjustin (27. Jul 2014 um 12:01 Uhr) |
Zitat |
Registriert seit: 5. Jan 2005 Ort: Stadthagen 9.454 Beiträge Delphi 10 Seattle Enterprise |
#3
Das generelle Problem liegt wohl bei der OpenSSL-Bibliothek.
Siehe dazu http://blog.marcocantu.com/blog/usin...elphi_ios.html BTW: Der Code ist echt grausam, da läuft es mir kalt den Rücken runter
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60) |
Zitat |
Registriert seit: 26. Nov 2007 15 Beiträge |
#4
Ihr seid großartig! Es funktioniert jetzt mit iOS.
Man muss folgendes im code ergänzen: In der Uses-Liste einfügen: IdSSLOpenSSLHeaders_Static und die zugehörigen Files (libcrypto.a und libssl.a) downloaden, wie in dem oben genannten Artikel beschrieben. Ich habe sie von folgender Seite heruntergeladen: http://indy.fulgan.com/SSL/OpenSSLStaticLibs.7z und dann in den Ordner mit meinem Quellcode abgelegt. Wie von Michael empfohlen, habe ich auch noch im Hauptprogramm die Zuweisung des Body-Textes geändert in: edBody.Assign(Memo1.Lines); und die Unit verwendet, wie er sie gepostet hat. Herzlichen Dank nochmal! |
Zitat |
Registriert seit: 29. Dez 2006 Ort: NRW 831 Beiträge Delphi 10.4 Sydney |
#5
Hallo Zusammen,
dieses Thema ist zwar schon sehr alt, hat mir aber trotzdem sehr geholfen. Ich habe die Unit um HTML und Anhänge erweitert und die Zugangsdaten in eine *.ini Datei gepackt. Daher poste ich die Unit hier trotzdem noch einmal...
Delphi-Quellcode:
Ich habe eine Mini-*.ini Datei erstellt:
unit TSendMail;
interface uses IdMessage, Classes; type TSSLEmail = class(TObject) private FedBody: TStrings; FedAttachments: TStrings; procedure SetBody(const Value: TStrings); procedure SetedAttachments(const Value: TStrings); public edSMTPServer: string; edSMTPPort: integer; edUserName: string; edPassword: string; edSSLConnection: boolean; edSenderEmail: string; edSenderName: string; edToEmail: string; edCCEmail: string; edBCCEmail: string; edSubject: string; edPriority: TIdMessagePriority; edIsBodyHTML: boolean; constructor Create; destructor Destroy; override; procedure Init; procedure SendEmail; property edBody: TStrings read FedBody write SetBody; property edAttachments: TStrings read FedAttachments write SetedAttachments; end; implementation uses IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin, IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5, IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest, IniFiles, IdSASLAnonymous, IdUserPassProvider, IdSSLOpenSSLHeaders_Static, IdAttachment, IdAttachmentFile, System.SysUtils, IdMessageBuilder; constructor TSSLEmail.Create; begin inherited; FedBody := TStringList.Create; FedAttachments := TStringList.Create; end; destructor TSSLEmail.Destroy; begin edBody.Free; edAttachments.Free; inherited; end; procedure TSSLEmail.SetBody(const Value: TStrings); begin FedBody.Assign(Value); end; procedure TSSLEmail.SetedAttachments(const Value: TStrings); begin FedAttachments.Assign(Value); end; procedure TSSLEmail.Init; begin edSMTPServer := ''; edSMTPPort := 0; edUserName := ''; edPassword := ''; edSSLConnection := True; edSenderEmail := ''; edSenderName := ''; edToEmail := ''; edCCEmail := ''; edBCCEmail := ''; edSubject := ''; edIsBodyHTML:= true; edPriority := TIdMessagePriority.mpNormal; edBody.Clear; edAttachments.Clear; end; procedure TSSLEmail.SendEmail; var IdMessage: TIdMessage; // enthält Eigenschaften der Email SMTP: TIdSMTP; // enthält Eigenschaften des SMTP Servers SSLHandler: TIdSSLIOHandlerSocketOpenSSL; // alles weitere ist für die SSL Verschlüsselung IdUserPassProvider: TIdUserPassProvider; IdSASLCRAMMD5: TIdSASLCRAMMD5; IdSASLCRAMSHA1: TIdSASLCRAMSHA1; IdSASLPlain: TIdSASLPlain; IdSASLLogin: TIdSASLLogin; IdSASLSKey: TIdSASLSKey; IdSASLOTP: TIdSASLOTP; IdSASLAnonymous: TIdSASLAnonymous; IdSASLExternal: TIdSASLExternal; INI: TIniFile; INI_FileName: string; edAttachmentPath: string; IdBuilder: TIdMessageBuilderHtml; begin INI_FileName:= ExtractFilePath(ParamStr(0)) + 'Res\MailProps.ini'; INI:= TIniFile.Create(INI_FileName); IdMessage := TIdMessage.Create; IdBuilder := TIdMessageBuilderHtml.Create; try // Eigenschaften der email setzen IdMessage.ContentType := INI.ReadString('IdMessageProps','MessageContentType',''); IdMessage.Charset := INI.ReadString('IdMessageProps','Charset',''); IdMessage.Sender.Text := edSenderEMail; IdMessage.From.Name := edSenderName; IdMessage.From.Address := edSenderEMail; IdMessage.ReplyTo.EMailAddresses := edSenderEmail; IdMessage.Recipients.EMailAddresses := edToEmail; IdMessage.Subject := edSubject; IdMessage.Priority := edPriority; IdMessage.CCList.EMailAddresses := edCCEMail; IdMessage.ReceiptRecipient.Text := ''; IdMessage.BccList.EMailAddresses := edBCCEMail; //Hinzugefügt edSMTPServer:= INI.ReadString('SSLConnection','SMTPServer',''); edSMTPPort:= INI.ReadInteger('SSLConnection','SMTPPort',0); edSSLConnection:= INI.ReadBool('SSLConnection','SSL',true); edUserName:= INI.ReadString('SSLConnection','User',''); edPassword:= INI.ReadString('SSLConnection','Password',''); if edIsBodyHTML then begin IdBuilder.Html.Text := edBody.Text; IdBuilder.HtmlCharSet := INI.ReadString('IdMessageProps','Charset',''); IdBuilder.HtmlContentTransfer := INI.ReadString('IdMessageProps','ContentTransfer',''); end else begin IdBuilder.PlainText.Text := edBody.Text; IdBuilder.PlainTextCharSet := INI.ReadString('IdMessageProps','Charset',''); IdBuilder.PlainTextContentTransfer := INI.ReadString('IdMessageProps','ContentTransfer',''); end; if edAttachments <> nil then begin for edAttachmentPath in edAttachments do begin if FileExists(edAttachmentPath) then begin IdBuilder.Attachments.Add(edAttachmentPath); end; end; end; IdBuilder.FillMessage(IdMessage); SMTP := TIdSMTP.Create; try if edSSLConnection then begin SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP); SSLHandler.SSLOptions.Method := sslvSSLv23; // SSL/TLS handshake determines the highest available SSL/TLS version dynamically SSLHandler.SSLOptions.Mode := sslmClient; SSLHandler.SSLOptions.VerifyMode := []; SSLHandler.SSLOptions.VerifyDepth := 0; SMTP.IOHandler := SSLHandler; if edSMTPPort = 587 then begin SMTP.UseTLS := utUseExplicitTLS end else begin SMTP.UseTLS := utUseImplicitTLS; // ImplicitTLS insbesondere auch bei Port 465 end; end; if (edUserName<>'') or (edPassword<>'') then begin SMTP.AuthType := satSASL; // Username und Passwort verschlüsselt bereitstellen IdUserPassProvider := TIdUserPassProvider.Create(SMTP); IdUserPassProvider.Username := edUserName; IdUserPassProvider.Password:= edPassword; // SASL-Komponenten für SSL Verschlüsselung IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP); IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider; IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP); IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider; IdSASLSKey := TIdSASLSKey.Create(SMTP); IdSASLSKey.UserPassProvider := IdUserPassProvider; IdSASLOTP := TIdSASLOTP.Create(SMTP); IdSASLOTP.UserPassProvider := IdUserPassProvider; IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP); IdSASLExternal := TIdSASLExternal.Create(SMTP); IdSASLLogin := TIdSASLLogin.Create(SMTP); IdSASLLogin.UserPassProvider := IdUserPassProvider; IdSASLPlain := TIdSASLPlain.Create(SMTP); IdSASLPlain.UserPassProvider := IdUserPassProvider; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5; SMTP.SASLMechanisms.Add.SASL := IdSASLSKey; SMTP.SASLMechanisms.Add.SASL := IdSASLOTP; SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous; SMTP.SASLMechanisms.Add.SASL := IdSASLExternal; SMTP.SASLMechanisms.Add.SASL := IdSASLLogin; SMTP.SASLMechanisms.Add.SASL := IdSASLPlain; end else begin SMTP.AuthType := satNone; end; SMTP.Host := edSMTPServer; SMTP.Port := edSMTPPort; SMTP.ConnectTimeout := 30000; SMTP.UseEHLO := True; SMTP.Connect; try SMTP.Send(IdMessage); finally SMTP.Disconnect; end; finally SMTP.Free; end; finally IdMessage.Free; INI.Free; IdBuilder.Free; end; end; end.
Code:
Der Aufruf sieht dann abgekürzt so aus:
[IdMessageProps]
TextContentType=text/html MessageContentType=multipart/mixed Charset=UTF-8 ContentTransfer=8bit [SSLConnection] SMTPServer=xxx.xxx.xxx.xxx SMTPPort=587 SSL=true User=xxx@xxxxxx.de Password=*******
Delphi-Quellcode:
So funktioniert das bei mir wunderbar. Eine Sache stört mich noch, nämlich dass ich im Outlook in der Mailliste statt der ersten Zeile des Mailtestes die Info bekomme: Zum Anzeigen der Meldung ist ein HTML-Viewer erforderlich <Ende>
procedure TForm_Main.CreateSendReport;
var AttachPfad, AttachFile: string; BodyPfad, BodyFile: string; Absender, MailAn, MailCC, MailBCC, Betreff: string; Sig_Mail, Sig_DWahl, Sig_APartner, Anrede: string; vDate, bDate: TDate; KdNr, ReportTitel: string; SG: TAdvStringGrid; Body : TStringList; KW: string; SendMail: TSSLEmail; begin //Variablen mit Werten füllen SendMail:= TSSLEmail.Create; Try //Hier werden Daten in das StringGrid SG geladen Export_Grid(SG, ReportTitel, AttachPfad + AttachFile, false, false, false); Body := //HTML-Body erstellen With SendMail do begin Init; //Alles auf Anfang setzen edSenderName := Sig_APartner; // Name, der als Absender erscheint edSenderEmail := Absender; // Meine Emailadresse, von der ich sende; edToEmail := MailAn; edCCEmail := MailCC; edBCCEmail := MailBCC; edSubject := Betreff; edBody := Body; edAttachments.Add(AttachPfad + AttachFile); SendEmail; end; Finally SG.Free; Body.Free; SendMail.Free End; end; Ich habe mal zwei Screenshots hochgeladen, die es zeigen. Hat jemand eine Idee, wie man das noch wegbekommen könnte? Vielen Dank Patrick
Patrick
|
Zitat |
Registriert seit: 11. Mär 2007 Ort: Saalkreis 1.643 Beiträge Delphi 12 Athens |
#6
Bei Outlook kann man einstellen, ob man die Mail als Text oder als HTML senden möchte. Das scheint hier ein Hinweis zu sein, dass dies eine HTML Mail ist und du das mit einem "HTML Viewer anzeigen lassen musst. Wo du das aber einstellen kannst, weiß ich leider nicht.
Matthias
Es ist nie falsch das Richtige zu tun! - Mark Twain |
Zitat |
Registriert seit: 21. Mär 2012 Ort: Hannover 898 Beiträge Delphi 10.4 Sydney |
#7
Du hast hier ja
TextContentType=text/html stehen. Damit versendest du HTML-Mail. Wenn du TextContentType=text/plain nimmst, ist es keine HTML-Mail und es ist kein HTML-Viewer notwendig. |
Zitat |
philipp.hofmann |
Öffentliches Profil ansehen |
Mehr Beiträge von philipp.hofmann finden |
Registriert seit: 29. Dez 2006 Ort: NRW 831 Beiträge Delphi 10.4 Sydney |
#8
Hallo zusammen,
Vielen Dank für eure Antworten! Ich habe die Mail bewusst als HTML verschickt, weil auch ein Firmen, Logo und Formatierungen enthalten sind. Diese Darstellungsart wird erst seit der Verwendung des HTML Builders angezeigt. In meinem Outlook bekomme ich andere HTML Mails auch in der Vorschau angezeigt, so wie in dem zweiten Screenshot. Es muss also irgendwo etwas in dem Code drin stecken, dass das hervorruft… Vielen Dank. Patrick
Patrick
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |