Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Email direkt aus Program mraus (https://www.delphipraxis.net/59009-email-direkt-aus-program-mraus.html)

marabu 13. Jan 2006 18:37

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:
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;
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.

Grüße vom marabu

renekr 13. Jan 2006 19:06

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:
lpszName := PChar(Trim(Before(Recipients[i], '<')));
lpszAddress := PChar(Trim(Between(Recipients[i], '<', '>')));
Vielen Dank.
@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.

marabu 13. Jan 2006 20:45

Re: Email direkt aus Program mraus
 
Entschuldige René,

Delphi-Quellcode:
lpszName := PChar(Trim(Before(Recipients[i], '<')));
lpszAddress := PChar(Trim(Between(Recipients[i], '&lt;', '>')));
mit den beiden Funktionen zerlege ich das von mir gewählte Eingabeformat für die mail recipients - sie tun genau das was ihr Name suggeriert:

Delphi-Quellcode:
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;
marabu

renekr 13. Jan 2006 22:27

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:
lpszAddress :=PChar(Recipients[i]);
Ich geben meine Empfänger so an:ohne die Vor - Nachnamen und dann durch <Email Adresse>

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.

marabu 14. Jan 2006 15:49

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:
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;
Grüße vom marabu

renekr 14. Jan 2006 17:50

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:
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;
Aber die Empfänger ( AN ) bleiben leer.
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.

marabu 15. Jan 2006 20:45

Re: Email direkt aus Program mraus
 
Zwei bugs habe ich gefunden:

Delphi-Quellcode:
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;
marabu

renekr 16. Jan 2006 18:30

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.

renekr 22. Apr 2008 19:40

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.

marabu 22. Apr 2008 20:29

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: Email Adresse des Senders über MAPI holen

Ich erinnere mich aber auch noch an andere Threads zum Thema Hier im Forum suchenExtended MAPI.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.
Seite 2 von 3     12 3      

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