Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
MAPI и опыт работы с управляемым кодом?
Использование функций MAPI из управляемого кода официально не поддерживается. По-видимому, MAPI использует свое собственное управление памятью, и он аварийно завершает работу и сгорает в управляемом коде (см. здесь и здесь )
Все, что я хочу сделать, это запустить почтовый клиент по умолчанию с темой, телом, AND одним или несколькими вложениями .
Итак, я изучил MAPISendDocuments , и это, кажется, работает. Но мне так и не удалось набраться смелости, чтобы действительно использовать эту функцию в производственном коде.
Кто-нибудь часто пользовался этой функцией? У вас есть какие-нибудь страшилки?
PS. Нет, я не буду shellExecute Outlook.exe с аргументами командной строки для вложений.
PPS. Поддержка вложений -это требование , поэтому Mailto: решения не сокращают его для меня.
Есть отдельный помощник EXE, который принимает параметры командной строки (или канал к своему StandardInput), который делает то, что требуется, и вызывает это из вашего основного приложения. Это позволяет сохранить материал MAPI вне пространства процесса вашего основного приложения. OK, вы все еще смешиваете MAPI и .NET, но в очень коротком процессе. Предполагается, что MAPI и CLR начинают вызывать проблемы с более длительными процессами.
Мы используем превосходную библиотеку объектов данных выкупа Дмитрия Стреблеченко, которая позволяет нам писать такой код "shim" в JScript и вызывать его, что сохраняет миры CLR и MAPI в отдельных процессах, но поддерживаемым способом.
@Chris Фурнье вновь. написание неуправляемого DLL. Это не сработает, поскольку проблема заключается в смешивании MAPI и управляемого кода в одном процессе .
MAPISendDocuments устарел и может быть удален. Вместо этого вы должны использовать MAPISendMail. Смотрите Простой MAPI
Вы должны иметь возможность создать неуправляемый DLL, который выполняет нужные операции с помощью MAPI, а затем вызвать этот DLL из управляемого кода. Я бы не стал писать прямую оболочку MAPI, но что-то, что выполняет все функции, которые вы требуете от MAPI, содержащегося в этом неуправляемом DLL. Вероятно, это был бы самый безопасный способ использовать MAPI из управляемого кода.
Вызов process.Start по протоколу Mailto: (как показано ниже) даст вам базовую функциональность, но не вложения.
Process.Start("mailto:name@domain.com?subject=TestCode&Body=Test Text");
Вы можете использовать этот подход с путями вложений, но этот параметр работает только с некоторыми старыми версиями outlook, такими как 98. Я предполагаю, что это связано с потенциальным риском безопасности.
Если кто-то использует outlook.exe, он будет выдавать предупреждения безопасности под outlook 2003 (и 2007 В зависимости от настроек).
Вы также можете использовать Outlook Redemption, который поддерживается управляемым кодом; я не сразу уверен, что он имеет простую замену MAPISendDocuments, но это полезно, если у вас есть вопросы.
Что касается "аварий и ожогов", вот еще одна цитата из парня поддержки MS, здесь
Это такая штука, которая в основном работает. Он будет работать, пока вы его пишете. Тогда он будет работать, пока вы его тестируете. Он будет работать, пока ваш клиент оценивает его. Затем, как только клиент развернет его-BAM! Вот тогда-то он и решит начать испытывать проблемы. И Microsoft не собирается помогать вам с этим, так как мы сказали вам не делать этого в первую очередь. :)
Я сделал это, используя функцию MAPISendMail и несколько внутренних классов, чтобы обернуть некоторые из других связанных структур MAPI. Пока это единственное применение, можно, хотя и не тривиально, сделать это безопасно, поскольку это требует очень пристального внимания к различным неуправляемым типам данных и выделению/освобождению памяти и GC. Хотя он все еще не поддерживается, я использую его в производственном коде (хотя он еще не отгружен).
Когда я спросил об этом Мэтта Штеля, ответ, который я получил, был таким::
Я действительно не знаю лучшего способа сделать это, и любые проблемы, с которыми вы столкнулись здесь, вероятно, будут воспроизводимы в поддерживаемом сценарии (т. е. VB6 или неуправляемый C++). Просто знайте, что если вы когда-либо сталкивались со сценарием, когда проблема была вызвана именно этой функцией, вызываемой из .NET, то у нас не было бы никаких других рекомендаций для вас, чтобы не использовать ее .NET.
Это не совсем благословение на его использование, но и не говорит о том, что есть какие-либо другие варианты, чтобы действительно сделать это из управляемого кода.
Следующий код не использует 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);
Для тех, кто имеет опыт работы с MAPI, им потребуется меньше времени, чтобы провернуть код, чтобы сделать именно то, что вы хотите от неуправляемого кода (читай: обычный C++), чем набрав этот пост и прочитав ответ (Без обид).
Вам повезло, что функциональность, которая вам нужна, ограничена. Все, что вам нужно, это простая утилита C++, чтобы взять нужные параметры в командной строке и выполнить правильные вызовы MAPI. Затем вы получаете всю эту утилиту из вашего управляемого кода так же, как и для выполнения любого другого процесса.
HTH