MAPI و التعليمات البرمجية المدارة التجارب ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/4508

  •  08-06-2019
  •  | 
  •  

سؤال

باستخدام MAPI وظائف من خلال التعليمات البرمجية المدارة غير معتمد رسميا.على ما يبدو ، MAPI يستخدم إدارة الذاكرة وتعطل والحروق في التعليمات البرمجية المدارة (انظر هنا و هنا)

كل ما أريد القيام به هو تشغيل عميل البريد الإلكتروني الافتراضي مع هذا الموضوع ، الجسم ، واحد أو أكثر من المرفقات.

إذا كنت تبحث في MAPISendDocuments ويبدو أن العمل.ولكن لم أكن قادرة على جمع الشجاعة في الواقع استخدام وظيفة في إنتاج التعليمات البرمجية.

وقد أي شخص يستخدم هذه الوظيفة كثيرا ؟ هل لديك أي قصص الرعب ؟

PS.لا, لن shellExecute Outlook.exe مع وسيطات سطر الأوامر المرفقات.

PPS.مرفق الدعم هو شرط , لذا Mailto:الحلول لا قطع عليه بالنسبة لي.

هل كانت مفيدة؟

المحلول

منفصلة مساعد EXE أن يأخذ سطر الأوامر params (أو الأنابيب إلى StandardInput) أن يفعل ما هو مطلوب وندعو أن من التطبيق الرئيسي.هذا يحافظ على MAPI الاشياء خارج التطبيق الرئيسي هو عملية الفضاء.حسنا, أنت لا تزال خلط MAPI .صافي ولكن في فترة قصيرة جدا-عاش العملية.والافتراض هو أن MAPI و CLR تبدأ تسبب مشاكل مع أطول العمليات قيد التشغيل.

نحن نستخدم ديمتري Streblechenko رائع الفداء كائنات بيانات مكتبة والذي يسمح لنا لكتابة مثل هذه "شيم" رمز في JScript و الاحتجاج ، والتي تحافظ على CLR MAPI العالمين في عمليات منفصلة ، ولكن في دعم الموضة.

@كريس فورنييه إعادة.كتابة DLL غير.هذا لن يعمل لأن المسألة خلط MAPI و التعليمات البرمجية المدارة في نفس العملية.

نصائح أخرى

MAPISendDocuments هو مستنكر و يمكن إزالتها.يجب عليك استخدام MAPISendMail بدلا من ذلك.انظر Simple MAPI

واصفا العملية.تبدأ في Mailto:البروتوكول (كما هو موضح أدناه) سوف تعطيك الوظائف الأساسية ولكن ليس المرفقات.

Process.Start("mailto:name@domain.com?subject=TestCode&Body=Test Text");

يمكنك أن تفعل هذا النهج مع مسارات مرفق ولكن هذا الخيار يعمل فقط مع النسخة القديمة من outlook مثل 98.أفترض أن هذا يرجع إلى إمكانية securty المخاطر.

إذا كان أي شخص لا تستخدم outlook.exe وسوف تعطي التحذيرات الأمنية في إطار outlook 2003 (، 2007 يعتمد على إعدادات).

يجب أن تكون قادرة على جعل DLL غير أن ينفذ العمليات التي تريد باستخدام MAPI ثم استدعاء DLL هذا من التعليمات البرمجية المدارة.لن أكتب على التوالي MAPI المجمع ، ولكن الشيء الذي يؤدي كل الوظائف تتطلب من MAPI الواردة في ذلك DLL غير.التي ربما تكون الطريقة الأكثر أمانا استخدام MAPI من التعليمات البرمجية المدارة.

هل يمكن أيضا استخدام توقعات الفداء, وهو مدعوم من التعليمات البرمجية المدارة;أنا لست متأكدا من الفور إذا كان لديه بسيطة MAPISendDocuments بديل ، ولكن ديمتري المفيد إذا كان لديك أسئلة.

أما عن "حوادث الحروق" ، وهنا اقتباس آخر من MS الدعم الرجل ، هنا

انها نوع من الشيء الذي سوف نعمل عليه.وأنها سوف تعمل بينما أنت تكتبه.ثم أنها سوف تعمل بينما أنت اختبار ذلك.سيكون العمل في حين أن العميل الخاص بك هو تقييم ذلك.ثم في أقرب وقت العميل تنشر ذلك بام!عند ذلك سوف تقرر أن تبدأ مشاكل.و مايكروسوفت لن تساعدك مع ذلك, منذ ان قلت لك لا تفعل ذلك في المقام الأول.:)

لقد فعلت هذا باستخدام MAPISendMail وظيفة العديد من الطبقات الداخلية إلى التفاف بعض MAPI الهياكل ذات الصلة.طالما هذا هو الاستخدام الوحيد الممكن على الرغم من عدم تافهة القيام به بأمان كما يتطلب اهتمام وثيق جدا إلى مختلف غير المدارة أنواع البيانات و تخصيص الذاكرة/deallocation و GC.في حين أنه لا يزال غير المعتمدة ، أنا باستخدام هذا في إنتاج البرمجية (على الرغم من أنه لم يتم شحنه حتى الآن).

عندما سألت مات Stehle عن هذا الرد الذي وصلني هو:

أنا حقا لا أعرف من وسيلة أفضل بكثير أن تفعل هذا و أي مشاكل مررت من هنا سيكون على الأرجح استنساخه في سيناريو معتمدة (أيVB6 أو غير مدارة C++).أعرف فقط أنه إذا كنت من أي وقت مضى واجهت السيناريو كان كان سبب المشكلة على وجه التحديد من خلال هذه الوظيفة يتم استدعاؤها من .صافي أننا لم يكن لديك أي توصية أخرى بالنسبة لك ثم لا استخدام .صافي.

ليس بالضبط نعمة على استخدامه ، ولكن أيضا لا أقول هناك أي خيارات أخرى فعلا فعل هذا من التعليمات البرمجية المدارة.

التعليمة البرمجية التالية لا يستخدم MAPI على هذا النحو, ولكنه فتح "تكوين البريد الإلكتروني" نافذة التعسفي مع المرفقات.

(في الواقع, انها تماما لم تختبر لكن بحثت عنه في تطبيق أعتقد أن عملت)

using Microsoft.Office;
using Microsoft.Office.Core;

...

Outlook.Application outlook = new Outlook.Application();
Outlook.MailItem mail = (Outlook.MailItem) outlook.CreateItem(Outlook.OlItemType.olMailItem);

mail.BodyFormat = Outlook.OlBodyFormat.olFormatRichText;
mail.HTMLBody = "stuff";
mail.Subject = "more stuff";
string file = File.ReadAllBytes(...);
mail.Attachments.Add(file, Outlook.OlAttachmentType.olByValue, 1, file)

mail.Display(false);

عن شخص من ذوي الخبرة مع MAPI يستغرق وقتا أقل كرنك المدونة أن تفعل بالضبط ما تريد من التعليمات البرمجية غير المدارة (قراءة:عادي C++) من كتابة هذا المقال قراءة الرد (لا أقصد الإهانة).

كنت محظوظا وظيفة تحتاج محدودة.كل ما عليك هو بسيط C++ المساعدة على اتخاذ params تحتاج على سطر الأوامر وإصدار حق مكالمات MAPI.ثم جميع هذه الأداة من التعليمات البرمجية المدارة الخاصة بك تماما كما كنت لتنفيذ أي عملية أخرى.

HTH

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top