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

голоса
10

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

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

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

Кто-использовал эту функцию много? Есть ли у вас какие-нибудь истории ужасов?

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

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

Задан 07/08/2008 в 08:56
источник пользователем
На других языках...                            


8 ответов

голоса
7

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

Мы используем превосходное Дмитрия Streblechenko в Redemption Data Objects библиотеки , которая позволяет нам написать такой «прокладку» код в JScript и ссылаться на то, которое держит миры CLR и MAPI в отдельных процессах, но в поддерживаемой моде.

@ Крис Fournier повторно. писать неуправляемый DLL. Это не будет работать , потому что проблема смешивания MAPI и управляемого кода в том же процессе .

Ответил 01/09/2008 в 21:26
источник пользователем

голоса
2

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

Ответил 12/10/2009 в 15:51
источник пользователем

голоса
1

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

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

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

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

Ответил 31/08/2008 в 01:43
источник пользователем

голоса
1

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

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

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

Ответил 27/08/2008 в 16:26
источник пользователем

голоса
1

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

Ответил 20/08/2008 в 21:01
источник пользователем

голоса
1

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

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

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

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

Ответил 07/08/2008 в 12:16
источник пользователем

голоса
0

Следующий код не использует интерфейс 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);
Ответил 10/12/2010 в 12:58
источник пользователем

голоса
-3

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

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

НТН

Ответил 04/04/2009 в 06:46
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more