Einzelnen Beitrag anzeigen

stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#4

AW: Outlook 2013 Mapi Error

  Alt 12. Feb 2014, 16:02
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.
Angehängte Dateien
Dateityp: zip mapitest.zip (213,7 KB, 30x aufgerufen)

Geändert von stalkingwolf (12. Feb 2014 um 16:09 Uhr)
  Mit Zitat antworten Zitat