Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Outlook 2013 Mapi Error (https://www.delphipraxis.net/179045-outlook-2013-mapi-error.html)

stalkingwolf 11. Feb 2014 10:36

Outlook 2013 Mapi Error
 
Hallo zusammen.

Einige unserer Kunden haben Outlook 2013 (32Bit) installiert und nu funktioniert die Mapi nicht mehr. Wir selber haben leider kein Outlook 2013, aber evtl hatte jemand das gleiche Problem.

und zwar wird
Delphi-Quellcode:
result:=MapiLogon(Handle, PAnsiChar(''), PAnsiChar(''), MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @MAPI_Session);
abgelehnt mit MAPI_USER_ABORT.

LG
Sven

Der schöne Günther 11. Feb 2014 10:57

AW: Outlook 2013 Mapi Error
 
Ich habe zwar Outlook 2013 in 32 Bit und Delphi/C++ Builder installiert, verstehe aber kein Wort. Kann ich trotzdem irgendwie helfen? :stupid:

SebastianZ 11. Feb 2014 16:06

AW: Outlook 2013 Mapi Error
 
Um hier helfen zu können bräuchte ich genauere Informationen:

Welche Mapi - Komponenten sind im Einsatz?
Ist das Betriebssystem x86 oder x64
Läuft die Andwendung die das MAPI von Outlook ansprechen soll auf x86 oder x64?

LG

stalkingwolf 12. Feb 2014 15:02

AW: Outlook 2013 Mapi Error
 
Liste der Anhänge anzeigen (Anzahl: 1)
Office wie auch unsere Programm sind 32 Bit Programme.
Das es Probleme mit Office 64Bit und der Mapi gibt ist uns bekannt.

Mapi Unit ist die in Delphi unter rtl\Win\Mapi.pas sprich "Mapi32.dll".

Ich habe einmal ein kleines Programm angehängt, was eine Email im Emailprogramm öffnet.
Es wird nicht rausgesendet oder ähnliches.

Anbei noch der Quellcode :
Delphi-Quellcode:
unit umain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,mapi;

type
  Tfmain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fmain: Tfmain;

implementation

{$R *.dfm}

function SendEMailMapi(Handle:THandle; Mail:TStrings; showdialog:boolean):Cardinal;

const MapiRecipClassStrings : array[1..3] of String =('to','cc','bcc');

var MapiMessage:    TMapiMessage;
    Receip         : array of TMapiRecipDesc;
    i,j, mc,
    ReceipCount      : integer;
    MAPI_Session     : Cardinal;
    WndList          : Pointer;
    MapiRecipClassCounter : array[1..3] of Integer;

    function GetMailValue (AMapiRecipClass, Index : Integer) : string;
    begin
        result:=Mail.Values[MapiRecipClassStrings[AMapiRecipClass]+IntToStr(index)];
    end;
begin
    result:=MapiLogon(Handle, PAnsiChar(''), PAnsiChar(''), MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @MAPI_Session);
    if ( result <> SUCCESS_SUCCESS) then
        MessageBox(Handle, PChar(format('Fehler beim Versuch eMails zu versenden'+#13+'Fehlercode :<%d>',[Result])), PChar('Error'), MB_ICONERROR or MB_OK)
    else begin
        for MC:=MAPI_TO to MAPI_BCC do begin
            MapiRecipClassCounter[MC]:=0;
            for j:= 0 to MaxInt do begin
                // Empfänger zählen
                if GetMailValue(MC,j) = '' then break;
                Inc(MapiRecipClassCounter[MC]);
            end;
        end;
        ReceipCount:=MapiRecipClassCounter[MAPI_TO]+
            MapiRecipClassCounter[MAPI_CC]+
            MapiRecipClassCounter[MAPI_BCC]; // Gesamtempfängerzahl errechnen
        SetLength(Receip,ReceipCount);     // Empfängerarray dimensionieren
        i:=0;
        if ReceipCount>0 then begin
            for MC:=MAPI_TO to MAPI_BCC do
                if MapiRecipClassCounter[MC]>0 then
                    for j:=0 to MapiRecipClassCounter[MC]-1 do begin
                        Receip[i].ulReserved:= 0;
                        Receip[i].ulRecipClass:= MC;
                        Receip[i].lpszName:= StrNew(PAnsiChar(AnsiString(GetMailValue(MC,j))));
                        Receip[i].lpszAddress:= StrNew(PAnsiChar(AnsiString('SMTP:' + GetMailValue(MC,j))));
                        Receip[i].lpEntryID:=nil;
                        Receip[i].ulEIDSize:= 0;
                        inc(i);
                    end;
        end;
        MapiMessage.nRecipCount := ReceipCount; // Empfängeranzahl in Message setzen
        MapiMessage.lpRecips   := Pointer(Receip); // Pointer auf Empfängerarray übergeben

        if Mail.Values['subject'] <>'' then MapiMessage.lpszSubject:= PAnsiChar(AnsiString(Mail.Values['subject']));
        if Mail.Values['body'] <>'' then MapiMessage.lpszNoteText:= PAnsiChar(AnsiString(Mail.Values['body']));

        WndList:= DisableTaskWindows(0); // "semimodal" machen
        try
            if ShowDialog then begin
                Result:= MapiSendMail(MAPI_Session, Handle, MapiMessage, MAPI_DIALOG, 0);// senden der Mail
            end else begin
                // Funktioniert aus Sicherheitsrichtlinien nicht mehr mit jedem Emailprogramm
                Result:= MapiSendMail(MAPI_Session, Handle, MapiMessage, 0, 0);// senden der Mail
            end;

            if result <> 0 then begin

                Case result of
                    MAPI_E_AMBIGUOUS_RECIPIENT:
                        MessageDlg('Empfänger nicht eindeutig. (Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);

                    MAPI_E_ATTACHMENT_NOT_FOUND:
                        MessageDlg('Datei zum Anhängen nicht gefunden',mterror,[mbok],0);

                    MAPI_E_ATTACHMENT_OPEN_FAILURE:
                        MessageDlg('Datei zum Anhängen konnte nicht geöffnet werden.',mterror,[mbok],0);

                    MAPI_E_BAD_RECIPTYPE:
                        MessageDlg('Empfängertyp nicht MAPI_TO, MAPI_CC oder MAPI_BCC.',mterror,[mbok],0);

                    MAPI_E_FAILURE:                                                                                  
                        MessageDlg('Unbekannter Fehler.',mterror,[mbok],0);

                    MAPI_E_INSUFFICIENT_MEMORY:
                        MessageDlg('Nicht genug Speicher.',mterror,[mbok],0);

                    MAPI_E_LOGIN_FAILURE:
                        MessageDlg('Benutzerlogin fehlgeschlagen.',mterror,[mbok],0);

                    MAPI_E_TEXT_TOO_LARGE:
                        MessageDlg('Text zu groß.',mterror,[mbok],0);

                    MAPI_E_TOO_MANY_FILES:
                        MessageDlg('Zu viele Dateienanhänge.',mterror,[mbok],0);

                    MAPI_E_TOO_MANY_RECIPIENTS:
                        MessageDlg('Zu viele Empfänger angegeben.',mterror,[mbok],0);

                    MAPI_E_UNKNOWN_RECIPIENT: MessageDlg('Empfänger nicht in Adressbuch gefunden. '+
                     '(Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);

                    MAPI_E_USER_ABORT:
                        MessageDlg('Benutzer hat Senden abgebrochen oder MAPI nicht installiert.',mterror,[mbok],0);
               else
                    MessageBox(Handle, PChar(format('Fehler beim Versuch eMails zu versenden'+#13+'Fehlercode :<%d>',[Result])),
                        PChar('Error'),
                        MB_ICONERROR or MB_OK);
                end;
            end;
        finally
            // aufräumen
            EnableTaskWindows(WndList);
            for i:=0 to ReceipCount-1 do begin

                StrDispose(Receip[i].lpszName);
                StrDispose(Receip[i].lpszAddress);
            end;
            Finalize(Receip);
        end;
        MapiLogOff(MAPI_Session, Handle, 0, 0);
    end;
end;

procedure SendEmail(const Subject, Body, SenderName, SenderEMail,Recipientsemail:
   string; CCEmail,FileNamelist:string;typ : Cardinal;showdialog:boolean);
var mail           : TStringList;
begin
    mail:= TStringList.Create;
    try
        mail.values['to0']     := Recipientsemail;
        mail.values['subject'] := PChar(Subject);
        mail.values['body']    := PChar(Body);
        SendEMailMapi(Application.Handle, mail, showdialog);
    finally
        mail.Free;
    end;
end;


procedure Tfmain.Button1Click(Sender: TObject);
begin
    SendEmail('Test per Mapi', 'Dies ist ein Mapi Test', 'Mapi Tester','mapitester@mapitest.de','empfaenger@irgendwas.de','','',MAPI_CC,true);
end;

end.

ULIK 12. Feb 2014 16:43

AW: Outlook 2013 Mapi Error
 
Probier's mal damit:

laß das Logon / LogOff weg und arbeite bei SendMail mit Sessionhandle 0. Damit haben wir hier in der Firma eine Teil der Probleme lösen können. Allerdings gibt es bei einzelnen Kunden immer noch die abstrusesten Probleme mit MAPI und Outlook 2013.

Such auch mal danach im Web, ich find leider auf die Schnelle die Stelle nicht mehr, die mich auf Sessionhandle 0 gebracht hat.


Grüße,
Uli

stalkingwolf 13. Feb 2014 08:19

AW: Outlook 2013 Mapi Error
 
Ich erhalte dann die Meldung ( schon bei uns ) MAPI_E_TOO_MANY_FILES, obwohl gar keine mitgegeben werden.

Edit nun geht es, nachdem ich den einen Teil für die Attachments aus der Original Funktion eingefügt habe, welche aber gar nicht benutzt wird. Egal, ich werde es einmal bei unserem Kunden testen.

stalkingwolf 13. Feb 2014 10:41

AW: Outlook 2013 Mapi Error
 
Gleiches Problem MAPI_E_USER_ABORT.

Wolfgang55 22. Jul 2015 08:02

AW: Outlook 2013 Mapi Error
 
Hallo,

ich habe zur Zeit das selbe Problem bei einem Kunden der auf Outlook 2013 umgestiegen ist. MAPI lief bislang problemlos nach dem Umstieg aber nicht mehr. Konnte die Ursache gefunden werden?

Grüße
Wolfgang

Bernhard Geyer 22. Jul 2015 08:27

AW: Outlook 2013 Mapi Error
 
Haben Outlook 2013 und die JCL-SimpleMAPI-Implementierung - Kein Problem.

Kannst du es damit mal testen?

Wolfgang55 22. Jul 2015 09:01

AW: Outlook 2013 Mapi Error
 
Wenn möglich sollte das Programm, so wie bisher, mit den direkten MAPI Aufrufe ohne zusätzliche Komponente laufen. Es scheinen ja nur bestimmte Insatallationen von Outlook 2013 davon betroffen zu sein.

Es wäre sehr interessant ob stalkingwolf das Problem lösen konnte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 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