![]() |
Re: Email direkt aus Program mraus
Hallo René,
ich habe mir eine Testanwendung gebaut und dann einige Dinge an deiner Funktion SendMail() abgeändert, da ich den Eindruck hatte, dass du sie noch nicht ganz fertige hattest. Sie sieht jetzt bei mir so aus:
Delphi-Quellcode:
Auf der Maschine, die mir gerade zur Verfügung steht, habe ich nur Mozilla Thunderbird als Simple MAPI Client drauf. Keine Zugriffsverletzung. Allerdings werden die Recipients nicht übernommen. Ich erhalte aber auch keine Fehlermeldung. Muss da später nochmal nachschauen. Vielleicht ein Sicherheitsmerkmal, damit der Thunderbird nicht wie Outlook als Virenschleuder verwendet werden kann.
function SendMail(const Subject, Body, FileName, SenderName,
SenderEMail: String; Recipients: TStrings): Integer; var msg: TMapiMessage; lpSender: TMapiRecipDesc; FileAttach: TMapiFileDesc; recips: array of MapiRecipDesc; i: integer; SM: TFNMapiSendMail; MAPIModule: HModule; begin FillChar(msg, SizeOf(msg), 0); with msg do begin lpszSubject := PChar(Subject); lpszNoteText := PChar(Body); if (SenderEmail <> '') then begin FillChar(lpSender, SizeOf(lpSender), 0); lpOriginator := @lpSender; lpSender.ulRecipClass := MAPI_ORIG; if (SenderName = '') then lpSender.lpszName := PChar(SenderEMail) else lpSender.lpszName := PChar(SenderName); lpSender.lpszAddress := PChar(SenderEmail); end; if Recipients.Count > 0 then begin SetLength(recips, Recipients.Count); ZeroMemory(@recips[0], SizeOf(MapiRecipDesc) * Recipients.Count); for i := Low(recips) to High(recips) do with recips[i] do begin ulRecipClass := MAPI_TO; lpszName := PChar(Trim(Before(Recipients[i], '<'))); lpszAddress := PChar(Trim(Between(Recipients[i], '<', '>'))); end; lpRecips := @recips; end; if (FileName <> '') then begin FillChar(FileAttach, SizeOf(FileAttach), 0); FileAttach.nPosition := Cardinal($FFFFFFFF); FileAttach.lpszPathName := PChar(FileName); nFileCount := 1; lpFiles := @FileAttach; end; end; MAPIModule := LoadLibrary(PChar(MAPIDLL)); if MAPIModule = 0 then Result := -1 else try @SM := GetProcAddress(MAPIModule, 'MAPISendMail'); if Assigned(@SM) then Result := SM(0, Application.Handle, msg, MAPI_DIALOG or MAPI_LOGON_UI, 0) else Result := 1; finally FreeLibrary(MAPIModule); end; end; Grüße vom marabu |
Re: Email direkt aus Program mraus
Hi @,
Erstmal Vielen Dank für eure schnelle und Fachliche Hilfe ( wie gewohnt in der DP ) Ich werde das gleich aus probieren und Rückinfo geben. Kannst du mir das mal erklären ? Was machst du da mit Trim(Before und Trim(Between Ich bekomme Undefinierter Bezeichner bei den beiden. Das kenne ich bis jetzt noch nicht.
Delphi-Quellcode:
Vielen Dank.
lpszName := PChar(Trim(Before(Recipients[i], '<')));
lpszAddress := PChar(Trim(Between(Recipients[i], '<', '>'))); @shmia : Das war mir klar, ich habe nur ein Problem weil ich in unserer Netzwerkumgebung ziemlich Eingeschränkt sind ( Sicherheitstechnischer Hinsicht ) zb: Das man per SMTP Server nur Emails schicken kann wenn die IP Fest im Server hinterlegt ist und das kann ich nicht bei allen PCs machen lasse. Werde zuerst mal über MAPI an Outlook gehen , und dan nmal schaun wie ich das über SMTP mit der sicherheit mache kann. Trotzdem Vielen Dank für die Info. |
Re: Email direkt aus Program mraus
Entschuldige René,
Delphi-Quellcode:
mit den beiden
lpszName := PChar(Trim(Before(Recipients[i], '<')));
lpszAddress := PChar(Trim(Between(Recipients[i], '<', '>'))); ![]()
Delphi-Quellcode:
marabu
const
sRecipient = 'Nachname, Vorname <postfach@mail-domain.de>'; begin if Before(sRecipient, '<') = 'Nachname, Vorname ' then ShowMessage('na also'); if Between(sRecipient, '<', '>') = 'postfach@mail-domain.de' then ShowMessage('geht doch'); end; |
Re: Email direkt aus Program mraus
Hi marabu,
vielen Dank für deine Mühe. Gleiches Ergebnis wie bei dir : "Recipients werden nicht übernommen." Wie ist es wenn ich die nachname,Vorname und dann Emai lnicht so komplex schreiben will,reicht dann folgendes:
Delphi-Quellcode:
Ich geben meine Empfänger so an:ohne die Vor - Nachnamen und dann durch <Email Adresse>
lpszAddress :=PChar(Recipients[i]);
Name1;Name2;name3;name4 Die namen werden von Outlook durch das Öffentliche Adressbuch entschlüsselt. das Trennzeichen ist frei wählbar(bei ner Stringlist entfällt es natürlich). Danke. |
Re: Email direkt aus Program mraus
Hallo René,
na klar kannst du deine Empfänger auch als Feldliste in einem String an deine SendMail-Funktion übergeben. Du musst sie dann aber zerlegen und für jeden einzelnen eine MapiRecipDesc-Struktur ausfüllen. In deinem Code darfst du dann aber nicht lpszName und lpszAddress mit dem gleichen Wert beschicken. Ist es ein DisplayName, dann weise ihn nur lpszName zu und MAPI-intern wird die Mail-Adresse ermittelt. Sobald du lpszAddress etwas zuweist gibt es keinen Automatismus mehr und die zugewiesene Adresse wird für den Versand benutzt. Für die einfache Zerlegung deiner Empfänger-Feldliste kannst du vielleicht diesen Code brauchen:
Delphi-Quellcode:
Grüße vom marabu
function ParseStr(var s: string; delimiters: string; purge: boolean): string;
var i: integer; begin i := 0; while (i < Length(s)) and (Pos(s[Succ(i)], delimiters) = 0) do Inc(i); Result := Copy(s, 1, i); Delete(s, 1, i + Ord(purge)); end; procedure UsageDemo; var sReceipients: String; begin sRecipients := 'John Doe;Lisa Doe;Brother Tuck'; while sReceipients <> '' do ShowMessage(ParseStr(sReceipients, ';', true)); end; |
Re: Email direkt aus Program mraus
Hi,
Danke aber das ist im moment nicht das Problem: Wie gesagt ich gebe folgendes an in der SendMail Funktion:
Delphi-Quellcode:
Aber die Empfänger ( AN ) bleiben leer.
if Recipients.Count > 0 then
begin SetLength(recips, Recipients.Count); ZeroMemory(@recips[0], SizeOf(MapiRecipDesc) * Recipients.Count); for i := Low(recips) to High(recips) do with recips[i] do begin ulRecipClass := MAPI_TO; lpszName := PChar(Recipients[i]); end; lpRecips := @recips; end; Ich gebe ja nur den Display name mit in der Funktion anhand der vorab erstellten Stringliste. Das mit den ; zwischen den Namen habe ich am Anfang verwendet,jetzt stelle ich die Namen mit Stringlist.add in der Stringliste zusammen ohne richtige Email Adresse, nur die namen. Damit muß ich die Strings nicht entschlüsseln. Aber das Problem das ich keine Namen habe ist immer noch da obwohl in der Schleife die Namen gesetzt werden. Hast du dafür eine Erklärung was falsch ist? In der Funktion wo ich gepostet habe geht es ( ohne mehrere Empfänger ). Aber ich kann nicht erkennen was da unterschiedlich ist. Danke. |
Re: Email direkt aus Program mraus
Zwei bugs habe ich gefunden:
Delphi-Quellcode:
marabu
if Recipients.Count > 0 then
begin SetLength(recips, Recipients.Count); ZeroMemory(@recips[0], SizeOf(MapiRecipDesc) * Recipients.Count); for i := Low(recips) to High(recips) do with recips[i] do begin ulRecipClass := MAPI_TO; lpszName := PChar(Recipients[i]); end; lpRecips := @recips[0]; // bug #1: @recips ist was anderes nRecipCount := Recipients.Count; // bug #2: hat gefehlt ... end; |
Re: Email direkt aus Program mraus
Hi marabu,
Erstmal Vielen Vielen Dank für deine Geduld und Hilfe. Hoffe nur ich kann mich mal Revanchieren :-D . Wäre echt aufgeschmissen gewesen ohne deine Hilfe. Danke. |
Re: Email direkt aus Program mraus
Hi Marabu,
Ich hoffe du kannst mir nochmals einen Tipp geben? Ich bin soeben unter Vista und Outlook 2007 am Testen udn da geht es leider nicht. Result:MAPI_E_FAILURE One or more unspecified errors occurred; no message was sent. Ist die Mapi Routine unter Outlook 2007 anderst vom Handling? Vielen Dank. |
Re: Email direkt aus Program mraus
Hallo René,
kann es sein, dass du früher OL98 oder OL2000 installiert hattest? Seither hat sich die Welt etwas verändert. Insbesondere hatte Microsoft es leid, dass Viren die MAPI.DLL recht einfach zur Reproduktion benutzt haben. Der bei dir auftretende Fehler MAPI_E_FAILURE (2) ist typisch für die verschärfte Sicherheit der neueren Outlook-Versionen. Dieser Thread zeigt Wege aus dem Dilemma auf: ![]() Ich erinnere mich aber auch noch an andere Threads zum Thema ![]() Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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