2


1

私は この方法を使用して、Delphiアプリケーション内からPDF形式の添付ファイル付きのMAPI Eメールを送信します。

それは既に添付されたpdf文書と空白の受信者でMS Outlookの「新しいメッセージ」ウィンドウを表示します。

通常のEメール連絡先を入力すると、それはうまくいきます。

ただし、ファックス受信者を選択した場合、それは私の[送信済みアイテム]フォルダに表示されますが、配信は自動的に失敗します(エラーなし、MS Outlookの "配信失敗"メッセージ、およびメッセージの配信なし)。

「ファックス受信者」は、ファックス番号以外は何も設定されていないMS Outlookに設定されています。 電子メールやその他何もない。 これらの「ファックス」をOutlookの受信トレイにルーティングするには、 faxcore serverを使用します。

http://www.uwex.uwc.edu/outlook/tips/images/ContactDialogBox.jpg[この画像を見て]あなたがこの連絡先を記入した唯一のフィールドは、 "Business Fax"のラベルが付いたものです。

私が手動で(すなわち、私のアプリケーションの外で)標準のMS Outlook電子メールを作成し、まったく同じファックス受信者を選び、そして手動でまったく同じPDFを添付するならば、それはうまくいきます。

そのため、MAPIを使用してファックス番号に送信しようとすると、失敗することがあります。 http://www.pcreview.co.uk/forums/thread-1827626.php[この投稿は似ているようですが、 "メッセージを配信できません"というエラーが表示されるのですが、私はしません。

誰かが私にこれについていくつかのポインタを与えることができますか?

ありがとう

更新: Eメールの作成にMAPIを使用していて、添付ファイルを手動で削除した場合、*うまく機能します。 それで、見通しの中から、私はファックス受信者に添付ファイルを電子メールで送ることができます、しかしMAPIを使うことは失敗します。

完全なソースコードは次のとおりです。

ユニットメイン。

インタフェース

Windows、メッセージ、SysUtils、クラス、グラフィック、コントロール、フォーム、ダイアログ、StdCtrlsを使用します。

タイプTForm1 = class(TForm)Button1:TButton。手順ボタン1クリック(送信者:TObject);プライベート関数SendEMailUsingMAPI(const件名、本文、ファイル名、送信者名、送信者電子メール、受信者名、受信者電子メール:文字列):整数public {公開宣言} end;

var Form1:TForm1;

実装

{$ R * .DFM}

Mapiを使います。

手順TForm1.Button1Click(送信者:TObject); // //これでMS Outlookのダイアログが表示されます。 //そのダイアログ内で、通常の電子メール受信者を選択した場合は正常に機能します。 //ファックス受信者を選択した場合、それは黙って失敗します。 //見通しでw /からメールを作成した場合、成功して*どちらか*に移動できます。

SendEmailUsingMAPI( 'Subject'、// Eメールの件名 'Body'、// Eメール本文の本文 'c:\ my_doc.pdf'、//添付ファイル名 '私の名前'、//送信者Eメール名 'myemail @ mydomain。 com '、//送信者のメールアドレス' '、//受信者のメールアドレス' '); //受信者のメールアドレスが終了しました。

function TForm1.SendEMailUsingMAPI(const Subject、Body、FileName、SenderName、SenderEMail、RecipientName、RecipientEMail:string):整数。 varメッセージ:TMapiMessage; lpSender、lpRecipient:TMapiRecipDesc; FileAttach:TMapiFileDesc; SM:TFNMapiSendMail; MAPIModule:HModule。 FileType:TMapiFileTagExt; FillChar(Message、SizeOf(Message)、0)を開始します。

if(Subject <> '')それからMessage.lpszSubject:= PChar(Subject);を開始します。終わり;

if(Body <> '')次にMessage.lpszNoteTextを開始します。= PChar(Body);終わり;

(SenderEmail <> '')の場合、lpSender.ulRecipClass:= MAPI_ORIGを開始します。 (SenderName = '')の場合は、lpSender.lpszName:= PChar(SenderEMail)を開始します。それ以外の場合は終了lpSender.lpszName:= PChar(SenderName);終わり; lpSender.lpszAddress:= PChar(SenderEmail); lpSender.ulReserved:= 0; lpSender.ulEIDSize:= 0; lpSender.lpEntryID:= nil; Message.lpOriginator:= @lpSender;終わり;

(RecipientEmail <> '')の場合、lpRecipient.ulRecipClass:= MAPI_TOを開始します。 (RecipientName = '')の場合、lpRecipient.lpszName:= PChar(RecipientEMail);のように入力します。それ以外の場合は終了lpRecipient.lpszName:= PChar(RecipientName);終わり; lpRecipient.lpszAddress:= PChar(RecipientEmail); lpRecipient.ulReserved:= 0; lpRecipient.ulEIDSize:= 0; lpRecipient.lpEntryID:= nil; Message.nRecipCount:= 1; Message.lpRecips:= @lpRecipient;それ以外は終了Message.lpRecips:= nil;終わり;

if(FileName = '')でMessage.nFileCount:= 0を開始します。 Message.lpFiles:= nil; 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;終わり;

MAPIModule:= LoadLibrary(PChar(MAPIDLL));

MAPIModule = 0の場合、開始結果:= -1。それ以外の場合は、@ SM:= GetProcAddress(MAPIModule、 'MAPISendMail');を試してください。 @SM <> nilの場合は、結果が開始されます。それ以外の場合は終了開始:= 1;終わり;最後にFreeLibrary(MAPIModule);終わり;終わり;

結果<> 0の場合、MessageDlg( 'メール送信エラー(' IntToStr(Result) ')。'、mtError、[mbOK]、0);終わり;終わり;

終わり。

3 Answer


2


OK、あなたのアップデートは添付ファイルを指しているので、私は別の推測をするつもりです:明示的に 'application / pdf’に添付ファイルのファイルタイプを設定してみてください(あなたの現在のコードはlpFileTypeフィールドを設定しません) ファックス処理はそれに依存するかもしれません。 MapiFileTagExt(lpFileTypeが指すタイプ)のエンコード部分を空白のままにして、単にレコードをFillCharしてcbTagフィールドとlpTagフィールドを設定するだけです。

あなたがコードを必要とするなら(mapi構造は時々ちょっと眩しいかもしれません)ただ叫んでください、しかしそれをタイプアップする瞬間を見つけるために私にはしばらく時間がかかります.. とにかく、もう一度、私はただ推測しています。 私は私の家の環境ではファックスの設定をしていません、そうでなければ私はいくつかの適切なテストをしたいと思います。

編集

以下のコードを説明します。 しかし、私はそれ以来Outlook Spyで、そしてどの方法でも、そして手動でファイルを添付するときにも、PR_ATTACH_MIME_TAGプロパティは送信されたアイテムに設定されているように見えます。

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;

(code-formatterは特に役に立ちません)。


1


ファックスアドレスが0(一時)セッションで使用できないのでしょうか。 つまり、最初にMAPILogonを使用してセッションにログインし、次にMAPISendMail呼び出しでhSessionを提供することでヘルプが得られますか。


1


あなたは Outlook Transport Loggingを有効にすることを試みることができます、うまくいけばいくつかの(どんな)エラーメッセージもそこに現れるでしょう。 関連する何かが実際にこのログに表示されるかどうかを確認するために、最初に手動のファックス(作業状況)を記録するようにしてください。

残念ながら、このログを通して問題を解決する上での私の個人的な成功率はわずかですが、もっと多くの情報を得ようとしても、決して害はありませんよね。