2009-08-05 7 views
2

Ich verwende this method, um eine MAPI-E-Mail mit einem PDF-Anhang aus einer Delphi-Anwendung zu senden.Wie wird eine MAPI-E-Mail mit einem Anhang an einen Faxempfänger gesendet?

Es bringt eine MS Outlook „neue Nachricht“ Fenster mit dem PDF-Dokument bereits angebracht ist, und ein leerer Empfänger auf.

Wenn Sie in einem normalen E-Mail-Kontakt, dann geht es durch fein.

Wenn Sie jedoch einen Faxempfänger auswählen, wird er in meinem Ordner "Gesendete Objekte" angezeigt, aber die Zustellung schlägt automatisch fehl (kein Fehler, keine MS Outlook-Nachricht "Zustellung fehlgeschlagen" und keine Zustellung der Nachricht).

Der „Fax-Empfänger“ in MS Outlook mit nichts als eine Faxnummer eingerichtet. Keine E-Mail oder irgendetwas. Wir verwenden eine faxcore server, um diese "Faxe" in den Outlook-Posteingang zu leiten.

Wenn Sie look at this image, das einzige Feld, füllte ich habe für diesen Kontakt in der ein „Business-Fax“ bezeichnet. manuell

Wenn ich (das heißt außerhalb meiner Anwendung) erstellen ein Standard-E-Mail-MS Outlook und wählen Sie das gleiche Fax-Empfänger, und manuell die gleichen PDF anhängen, dann geht es durch fein.

So scheint es, dass etwas über MAPI an eine Faxnummer senden bewirkt, dass es zum Scheitern verurteilt. This post sounds similar, except they get a "message undeliverable" error and I don't.

Kann mir jemand einige Hinweise zu diesem Thema geben?

Dank

Update: Wenn ich MAPI verwenden, um die E-Mail zu erstellen, aber dann ich manuell löschen die Anlage, dann tut Arbeit. Aus Outlook heraus kann ich einen Anhang an einen Faxempfänger senden, aber MAPI schlägt fehl.

Der komplette Quellcode folgt:

unit Main; 

interface 

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

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    function SendEMailUsingMAPI(const Subject, Body, FileName, SenderName, 
     SenderEMail, RecipientName, RecipientEMail: string): integer; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.DFM} 

uses 
    Mapi; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    //this will bring up an MS Outlook dialog. 
    //inside that dialog, if i choose a normal email recipient, it works. 
    //     if i choose a fax recipient, it fails silently. 
    //if i create the email from w/in outlook, it can go to *either* with success. 

    SendEmailUsingMAPI(
    'Subject', //subject of email 
    'Body', //body of email text 
    'c:\my_doc.pdf', //attachment file name 
    'My name', //sender email name 
    '[email protected]', //sender email address 
    '', //recipient email name 
    ''); //recipient email address 
end; 


function TForm1.SendEMailUsingMAPI(const Subject, Body, FileName, SenderName, 
    SenderEMail, RecipientName, RecipientEMail: string): Integer; 
var 
    Message: TMapiMessage; 
    lpSender, lpRecipient: TMapiRecipDesc; 
    FileAttach: TMapiFileDesc; 
    SM: TFNMapiSendMail; 
    MAPIModule: HModule; 
    FileType: TMapiFileTagExt; 
begin 
    FillChar(Message,SizeOf(Message),0); 

    if (Subject <> '') then begin 
    Message.lpszSubject := PChar(Subject); 
    end; 

    if (Body <> '') then begin 
    Message.lpszNoteText := PChar(Body); 
    end; 

    if (SenderEmail <> '') then 
    begin 
    lpSender.ulRecipClass := MAPI_ORIG; 
    if (SenderName = '') then begin 
     lpSender.lpszName := PChar(SenderEMail); 
    end 
    else begin 
     lpSender.lpszName := PChar(SenderName); 
    end; 
    lpSender.lpszAddress := PChar(SenderEmail); 
    lpSender.ulReserved := 0; 
    lpSender.ulEIDSize := 0; 
    lpSender.lpEntryID := nil; 
    Message.lpOriginator := @lpSender; 
    end; 

    if (RecipientEmail <> '') then begin 
    lpRecipient.ulRecipClass := MAPI_TO; 
    if (RecipientName = '') then begin 
     lpRecipient.lpszName := PChar(RecipientEMail); 
    end 
    else begin 
     lpRecipient.lpszName := PChar(RecipientName); 
    end; 
    lpRecipient.lpszAddress := PChar(RecipientEmail); 
    lpRecipient.ulReserved := 0; 
    lpRecipient.ulEIDSize := 0; 
    lpRecipient.lpEntryID := nil; 
    Message.nRecipCount := 1; 
    Message.lpRecips := @lpRecipient; 
    end 
    else begin 
    Message.lpRecips := nil; 
    end; 

    if (FileName = '') then begin 
    Message.nFileCount := 0; 
    Message.lpFiles := nil; 
    end 
    else begin 
    FillChar(FileAttach,SizeOf(FileAttach),0); 
    FileAttach.nPosition := Cardinal($FFFFFFFF); 
    FileAttach.lpszPathName := PChar(FileName); 

    FileType.ulReserved := 0; 
    FileType.cbEncoding := 0; 
    FileType.cbTag := 0; 
    FileType.lpTag := nil; 
    FileType.lpEncoding := nil; 

    FileAttach.lpFileType := @FileType; 
    Message.nFileCount := 1; 
    Message.lpFiles := @FileAttach; 
    end; 

    MAPIModule := LoadLibrary(PChar(MAPIDLL)); 

    if MAPIModule = 0 then begin 
    Result := -1; 
    end 
    else begin 
    try 
     @SM := GetProcAddress(MAPIModule,'MAPISendMail'); 
     if @SM <> nil then begin 
     Result := SM(0,Application.Handle,Message, 
      MAPI_DIALOG or MAPI_LOGON_UI,0); 
     end 
     else begin 
     Result := 1; 
     end; 
    finally 
     FreeLibrary(MAPIModule); 
    end; 
    end; 

    if Result <> 0 then begin 
    MessageDlg('Error sending mail ('+IntToStr(Result)+').',mtError,[mbOK],0); 
    end; 
end; 

end. 

Antwort

1

Könnte es die Fax-Adressen werden nicht zur Verfügung stehen in der 0 (temporär) Sitzung? Mit anderen Worten: Loggen Sie sich zuerst mit MAPILogon in eine Sitzung ein und stellen Sie dann die hSession in der MAPISendMail-Anrufhilfe bereit?

+0

Toller Vorschlag - Ich habe ein Beispiel dafür gefunden: http://www.swissdelficenter.ch/torry/showcode.php?id=1246 aber es gibt mir genau die gleichen Ergebnisse. – JosephStyons

1

Sie könnten versuchen, Outlook Transport Logging aktivieren, hoffentlich einige (beliebige) Fehlermeldung wird dort auftauchen. Stellen Sie sicher, dass Sie zuerst ein manuelles Fax (Arbeitssituation) protokollieren, um zu überprüfen, ob in diesem Protokoll tatsächlich etwas angezeigt wird.

Leider ist meine persönliche Erfolgsrate bei der Lösung von Problemen durch dieses Protokoll zilch, aber der Versuch, mehr Informationen zu bekommen, tut nie weh, oder?

+0

Ein anderer großartiger Vorschlag - das Vergleichen eines Protokolls einer erfolgreichen E-Mail mit einer fehlgeschlagenen zeigt jedoch absolut keine Unterschiede (außer in den Zeitstempeln natürlich). Dies ist ein gutes Werkzeug, und ich werde es für die Zukunft im Auge behalten. – JosephStyons

2

Ok, Ihr Update zeigt auf den Anhang, also werde ich eine weitere Vermutung einbringen: Versuchen Sie, den Dateityp des Anhangs explizit auf 'application/pdf' zu setzen (Ihr aktueller Code setzt das lpFileType Feld nicht) . Die Faxbehandlung hängt davon ab. Sie können die codierenden Teile von MapiFileTagExt (dem Typ, auf den lpFileType verweist) einfach leer lassen, einfach den Datensatz füllen und die Felder cbTag und lpTag setzen.

Wenn Sie Code benötigen (die mapi Strukturen etwas blendend manchmal sein kann) nur schreien, aber es wird einige Zeit dauern, mir einen Moment zu finden, sie geben up .. Und wie auch immer, wieder, ich bin nur Raten. Ich habe kein Fax-Setup in meiner häuslichen Umgebung, ansonsten würde ich ein paar Tests durchführen.

EDIT

Illustrieren Stück Code unten. Allerdings habe ich seitdem mit Outlook Spy überprüft, und mit keiner Methode, noch beim Anhängen einer Datei manuell, scheint die PR_ATTACH_MIME_TAG -Eigenschaft auf das gesendete Element festgelegt werden, nur für die resultierende eingehende Nachricht.

FillChar(FileAttach,SizeOf(FileAttach),0); 
    FileAttach.nPosition := Cardinal($FFFFFFFF); 
    FileAttach.lpszPathName := PChar(FileName); 
    // 
    MimeType := 'application/pdf'; 
    // 
    FileType.ulReserved := 0; 
    FileType.cbTag := Length(MimeType); 
    FileType.lpTag := PByte(MimeType); 
    FileType.cbEncoding := 0; 
    FileType.lpEncoding := nil; 
    // 
    FileAttach.lpFileType := @FileType; 
    Message.nFileCount := 1; 
    Message.lpFiles := @FileAttach; 

(Codeformatierung ist nicht besonders hilfreich).

+0

Danke nochmal. Ich habe meinen modifizierten Code gepostet - ich bin mir nicht sicher, ob ich das umgesetzt habe, was Sie vorschlagen. Der LpFiltype ist kein String-Typ - sollte ich es auf einen Zeiger auf eine Zeichenfolge festlegen, die "Anwendung/PDF" enthält? Der aktuelle Code gibt immer noch das gleiche Ergebnis. Übrigens geht es nicht nur mit pdf-Dateien, sondern auch wenn ich eine reine Textdatei anhefte. – JosephStyons