![]() |
Mail aus Programm abschicken
Hallo Delphianer/innen,
ich habe mich lange nicht mehr hier sehen lassen. Gesundheitliche Probleme, Augen-OP u.a.m. ------------------------------------------------------------------------------------------- Ich bin nicht mehr kreativ. Um so mehr ärgert es mich, wenn ich in einem alten Programm von mir einen Fehler entdecke, der mir unmöglich entgangen sein kann. Es bietet die Möglichkeit, aus dem Programm ein Bild als Mail mit Dateianhang zu versenden. Das funktioniert nicht mehr. Ich habe Thunderbird installiert, Tb wird auch gestartet aber die Datei wird nicht übernommen (Fehler 11). Es liegt nicht am Thunderbird. Mit XNView, was das selbe kann kann, klappt das reibungslos. Folgenden Programmcode habe ich kopiert:
Delphi-Quellcode:
Habe ich im Web gefunden, wahrscheinlich hier im Forum und ist uralt ca. 15 Jahre!
procedure SendMail(Subject,Mailtext,
FromName,FromAdress, ToName,ToAdress, AttachedFileName, DisplayFileName:string; ShowDialog:boolean); var MapiMessage : TMapiMessage; MError : Cardinal; Empfaenger : array[0..1] of TMapiRecipDesc; Absender : TMapiRecipDesc; Datei : array[0..1] of TMapiFileDesc; begin with MapiMessage do begin ulReserved := 0; // Betreff lpszSubject := PAnsiChar(Subject); // Body lpszNoteText := PAnsiChar(Mailtext); lpszMessageType := nil; lpszDateReceived := nil; lpszConversationID := nil; flFlags := 0; // Absender festlegen Absender.ulReserved:=0; Absender.ulRecipClass:=MAPI_ORIG; Absender.lpszName:= PAnsiChar(FromName); Absender.lpszAddress:= PAnsiChar(FromAdress); Absender.ulEIDSize:=0; Absender.lpEntryID:=nil; lpOriginator := @Absender; // Empfänger festlegen (Hier: nur 1 Empfänger) nRecipCount := 1; Empfaenger[0].ulReserved:=0; Empfaenger[0].ulRecipClass:=MAPI_TO; Empfaenger[0].lpszName:= PAnsiChar(ToName); Empfaenger[0].lpszAddress:= PAnsiChar(ToAdress); Empfaenger[0].ulEIDSize:=0; Empfaenger[0].lpEntryID:=nil; lpRecips := @Empfaenger; // Dateien anhängen (Hier: nur 1 Datei) nFileCount := 1; // Name der Datei auf der Festplatte Datei[0].lpszPathName:= PAnsiChar(AttachedFilename); // Name, der in der Email angezeigt wird Datei[0].lpszFileName:= PAnsiChar(DisplayFilename); Datei[0].ulReserved:=0; Datei[0].flFlags:=0; Datei[0].nPosition:=Cardinal(-1); Datei[0].lpFileType:=nil; lpFiles := @Datei; end; Wie schon geschrieben, früher hat es funktioniert! Hat sich bei MAPI etwas geändert? Gruß Willie. |
AW: Mail aus Programm abschicken
Ich würde wetten, dass es daran liegt, dass die Parameter per String übergeben werden, diese dann aber als PAnsiChar gecastet werden. Als in Delphi ein "String" ein AnsiString war, hat das funktioniert. Jetzt (seit Delphi 2009) ist String ein UnicodeString.
Du must dich also für eine Variante entscheiden. Mein erster Versuch wäre, alle PAnsiChar() durch PChar() zu ersetzen. |
AW: Mail aus Programm abschicken
Zitat:
Delphi-Quellcode:
. Alternativ Funktionsparameter als AnsiString deklarieren, damit auch von außen klar ist, dass hier nur AnsiStrings übergeben werden können. Dann muss man logischerweise beim Aufruf der Funktion SendMail casten.
PAnsiChar(AnsiString(StringVariable));
Zitat:
Grüße Dalai |
AW: Mail aus Programm abschicken
In Delphi gibt es die Standard-Action TSendMail in Unit Vcl.ExtActions. Vielleicht kannst du die ja direkt verwenden.
Ich würde dir ja auch vorschlagen, den Source zu analysieren, aber das wird mit einer Starter eventuell schwierig. Nur so am Rande: Der gezeigte Code kann nicht vollständig sein, da die MapiMessage nirgendwo verarbeitet wird. |
AW: Mail aus Programm abschicken
Hallo Uwe,
du hat natürlich Recht, da habe ich was übersehen.
Delphi-Quellcode:
Da steht sogar der Name des Authors.
// Senden
if ShowDialog then MError := MapiSendMail(0, Application.Handle, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI, 0) else // Wenn kein Dialogfeld angezeigt werden soll: MError := MapiSendMail(0, Application.Handle, MapiMessage, 0, 0); if MError <> SUCCESS_SUCCESS then MessageDlg(Format('Mail-Fehler: %d.',[MError]),mterror,[mbok],0); end; {von Christian Schwarz} Ich muss jetzt mal eure Tipps verarbeiten. Danke Freunde. Nein, es wird tatsächlich PAnsiChar erwartet, PChar geht nicht. Das Thema wird hier schon oft besprochen, die Beiträge sind aber alle sehr alt und bringen mich nicht weiter. Willie. |
AW: Mail aus Programm abschicken
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Willie1,
ich mache das immer mit Indy-SMTP:
Code:
Vielleicht hilft dir das ja weiter (?)
procedure TfrmMain.SendMail;
var AttachmentFile: TIdAttachmentFile; begin try AntiFreeze.Active := True; Screen.Cursor := crHourGlass; try with IndyMessage do begin Clear; Organization := CompanyName; From.Name := FromName; From.Address := FromAdress; Recipients.EMailAddresses := ToAdress; Subject := Bodytext; ContentTransferEncoding := 'BASE64'; CharSet := 'ISO-8859-1'; Body.Add(BodyText03 + BodyText02 + FormatDateTime('dd.mm.yyyy', dmMain.tblProduktionsberichteProduktionszeitAnfang.AsDateTime) + ' - ' + comboSchicht.Text + ' - ' + comboLinie.Text); Body.Add('Projektnummer: ' + comboProjektnummer.Text + ' - ' + 'Projektname: ' + comboProjektname.Text + Space + BodyText04); Body.Add(BodyText05); Body.Add(BodyText06); Body.Add(BodyText07); AttachmentFile := TIdAttachmentFile.Create(MessageParts, AttachmentFileName); end; IndySMTP.Host := MailServer; IndySMTP.Username := MailUser; IndySMTP.Password := MailPassword; IndySMTP.Connect; if IndySMTP.Connected then begin IndySMTP.Send(IndyMessage); IndySMTP.Disconnect; end; except if IndySMTP.Connected then IndySMTP.Disconnect; Screen.Cursor := crDefault; FreeAndNil(AttachmentFile); AntiFreeze.Active := False; end; finally Screen.Cursor := crDefault; FreeAndNil(AttachmentFile); AntiFreeze.Active := False; end; end; |
AW: Mail aus Programm abschicken
Zitat:
Danke und schönen Sonntag Abend Willie. |
AW: Mail aus Programm abschicken
Hallo Zusammen
Ich habe versucht die Stanardaktion zu verwenden wie es von Embarcadero beschrieben ist. Leider passiert da gar nichts. ( ![]() Übersehe ich da irgendwas? Ich verwende Delphi 10.4, Windows 11 und habe es mit Outlook und Thunderbird versucht. Beste Grüsse |
AW: Mail aus Programm abschicken
|
AW: Mail aus Programm abschicken
Diese Methoden kenne ich und benutze ich teilweise auch, es geht mir speziell um die TSendMail Aktion und warum diese nicht so funktioniert wie von Embarcadero beschrieben.
|
AW: Mail aus Programm abschicken
Ich vermute die SendMail-Action aus Vcl.ExtActns nutzt die Mapi-Schnittstelle.
Nur mal eine 2. Vermutung: du hast vielleicht eine 32-bit-Anwendung und dein Email-Programm, das für MAPI registriert ist, ist eine 64-bit-Anwendung oder umgekehrt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz