Сведения о вопросе

FELL

16:03, 1st July, 2020

Теги

.net   email   pinvoke   mapi    

MAPI и опыт работы с управляемым кодом?

Просмотров: 480   Ответов: 8

Использование функций MAPI из управляемого кода официально не поддерживается. По-видимому, MAPI использует свое собственное управление памятью, и он аварийно завершает работу и сгорает в управляемом коде (см. здесь и здесь )

Все, что я хочу сделать, это запустить почтовый клиент по умолчанию с темой, телом, AND одним или несколькими вложениями .

Итак, я изучил MAPISendDocuments , и это, кажется, работает. Но мне так и не удалось набраться смелости, чтобы действительно использовать эту функцию в производственном коде.

Кто-нибудь часто пользовался этой функцией? У вас есть какие-нибудь страшилки?

PS. Нет, я не буду shellExecute Outlook.exe с аргументами командной строки для вложений.

PPS. Поддержка вложений -это требование , поэтому Mailto: решения не сокращают его для меня.



  Сведения об ответе

lourence

18:03, 1st July, 2020

Есть отдельный помощник EXE, который принимает параметры командной строки (или канал к своему StandardInput), который делает то, что требуется, и вызывает это из вашего основного приложения. Это позволяет сохранить материал MAPI вне пространства процесса вашего основного приложения. OK, вы все еще смешиваете MAPI и .NET, но в очень коротком процессе. Предполагается, что MAPI и CLR начинают вызывать проблемы с более длительными процессами.

Мы используем превосходную библиотеку объектов данных выкупа Дмитрия Стреблеченко, которая позволяет нам писать такой код "shim" в JScript и вызывать его, что сохраняет миры CLR и MAPI в отдельных процессах, но поддерживаемым способом.

@Chris Фурнье вновь. написание неуправляемого DLL. Это не сработает, поскольку проблема заключается в смешивании MAPI и управляемого кода в одном процессе .


  Сведения об ответе

fo_I_K

18:03, 1st July, 2020

MAPISendDocuments устарел и может быть удален. Вместо этого вы должны использовать MAPISendMail. Смотрите Простой MAPI


  Сведения об ответе

$DOLLAR

18:03, 1st July, 2020

Вы должны иметь возможность создать неуправляемый DLL, который выполняет нужные операции с помощью MAPI, а затем вызвать этот DLL из управляемого кода. Я бы не стал писать прямую оболочку MAPI, но что-то, что выполняет все функции, которые вы требуете от MAPI, содержащегося в этом неуправляемом DLL. Вероятно, это был бы самый безопасный способ использовать MAPI из управляемого кода.


  Сведения об ответе

ASER

18:03, 1st July, 2020

Вызов process.Start по протоколу Mailto: (как показано ниже) даст вам базовую функциональность, но не вложения.

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

Вы можете использовать этот подход с путями вложений, но этот параметр работает только с некоторыми старыми версиями outlook, такими как 98. Я предполагаю, что это связано с потенциальным риском безопасности.

Если кто-то использует outlook.exe, он будет выдавать предупреждения безопасности под outlook 2003 (и 2007 В зависимости от настроек).


  Сведения об ответе

PIRLO

18:03, 1st July, 2020

Вы также можете использовать Outlook Redemption, который поддерживается управляемым кодом; я не сразу уверен, что он имеет простую замену MAPISendDocuments, но это полезно, если у вас есть вопросы.

Что касается "аварий и ожогов", вот еще одна цитата из парня поддержки MS, здесь

Это такая штука, которая в основном работает. Он будет работать, пока вы его пишете. Тогда он будет работать, пока вы его тестируете. Он будет работать, пока ваш клиент оценивает его. Затем, как только клиент развернет его-BAM! Вот тогда-то он и решит начать испытывать проблемы. И Microsoft не собирается помогать вам с этим, так как мы сказали вам не делать этого в первую очередь. :)


  Сведения об ответе

SSESION

18:03, 1st July, 2020

Я сделал это, используя функцию MAPISendMail и несколько внутренних классов, чтобы обернуть некоторые из других связанных структур MAPI. Пока это единственное применение, можно, хотя и не тривиально, сделать это безопасно, поскольку это требует очень пристального внимания к различным неуправляемым типам данных и выделению/освобождению памяти и GC. Хотя он все еще не поддерживается, я использую его в производственном коде (хотя он еще не отгружен).

Когда я спросил об этом Мэтта Штеля, ответ, который я получил, был таким::

Я действительно не знаю лучшего способа сделать это, и любые проблемы, с которыми вы столкнулись здесь, вероятно, будут воспроизводимы в поддерживаемом сценарии (т. е. VB6 или неуправляемый C++). Просто знайте, что если вы когда-либо сталкивались со сценарием, когда проблема была вызвана именно этой функцией, вызываемой из .NET, то у нас не было бы никаких других рекомендаций для вас, чтобы не использовать ее .NET.

Это не совсем благословение на его использование, но и не говорит о том, что есть какие-либо другие варианты, чтобы действительно сделать это из управляемого кода.


  Сведения об ответе

SILA

18:03, 1st July, 2020

Следующий код не использует MAPI как таковой, но он открывает окно "Compose Mail" с произвольными вложениями.

(на самом деле, это совершенно непроверено, но я откопал его в приложении, которое, как мне кажется, сработало)

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);


  Сведения об ответе

SILA

18:03, 1st July, 2020

Для тех, кто имеет опыт работы с MAPI, им потребуется меньше времени, чтобы провернуть код, чтобы сделать именно то, что вы хотите от неуправляемого кода (читай: обычный C++), чем набрав этот пост и прочитав ответ (Без обид).

Вам повезло, что функциональность, которая вам нужна, ограничена. Все, что вам нужно, это простая утилита C++, чтобы взять нужные параметры в командной строке и выполнить правильные вызовы MAPI. Затем вы получаете всю эту утилиту из вашего управляемого кода так же, как и для выполнения любого другого процесса.

HTH


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться