AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Email direkt aus Program mraus
Thema durchsuchen
Ansicht
Themen-Optionen

Email direkt aus Program mraus

Ein Thema von renekr · begonnen am 15. Dez 2005 · letzter Beitrag vom 23. Apr 2008
Antwort Antwort
Seite 2 von 3     12 3      
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#11

Re: Email direkt aus Program mraus

  Alt 13. Jan 2006, 19:37
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Email direkt aus Program mraus

  Alt 13. Jan 2006, 20:06
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#13

Re: Email direkt aus Program mraus

  Alt 13. Jan 2006, 21:45
Entschuldige René,

Delphi-Quellcode:
lpszName := PChar(Trim(Before(Recipients[i], '<')));
lpszAddress := PChar(Trim(Between(Recipients[i], '<', '>')));
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.dethen
    ShowMessage('geht doch');
end;
marabu
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Email direkt aus Program mraus

  Alt 13. Jan 2006, 23:27
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:

lpszAddress :=PChar(Recipients[i]); Ich geben meine Empfänger so anhne 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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#15

Re: Email direkt aus Program mraus

  Alt 14. Jan 2006, 16:49
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: Email direkt aus Program mraus

  Alt 14. Jan 2006, 18:50
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#17

Re: Email direkt aus Program mraus

  Alt 15. Jan 2006, 21:45
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#18

Re: Email direkt aus Program mraus

  Alt 16. Jan 2006, 19:30
Hi marabu,
Erstmal Vielen Vielen Dank für deine Geduld und Hilfe.

Hoffe nur ich kann mich mal Revanchieren .
Wäre echt aufgeschmissen gewesen ohne deine Hilfe.


Danke.
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Email direkt aus Program mraus

  Alt 22. Apr 2008, 20:40
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#20

Re: Email direkt aus Program mraus

  Alt 22. Apr 2008, 21:29
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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