Как открыть диалоговое окно создания / создания почты, используя почтовый клиент по умолчанию для пользователя? - PullRequest
6 голосов
/ 16 января 2009

Вариант использования прост. В определенный момент мне нужно показать пользователю его знакомое диалоговое окно создания электронной почты (Outlook или другое) с помощью

  • поля типа from, to, Тема уже заполнена определенными значениями, определенными для приложения.
  • К письму также будет прикреплено приложение.

Письмо не должно отправляться, если пользователь явно не одобряет его.

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

Управляемое приложение, C #, .net 3.0 +

Обновление # 1 : Да, похоже, что mailto удалена поддержка вложений (как угроза безопасности?). Я пытался

Вам необходимо включить подпись ShellExecute , как описано здесь . Все, что я получил от этого, было 5 SE_ERR_ACCESSDENIED и 2 только для некоторого разнообразия

string sMailToLink = @"mailto:some.address@gmail.com?subject=Hey&body= yeah yeah yeah";
IntPtr result = ShellExecute(IntPtr.Zero, "open", sMailToLink, "", "", ShowCommands.SW_SHOWNORMAL);
Debug.Assert(result.ToInt32() > 32, "Shell Execute failed with return code " + result.ToInt32());

Тот же MailtoLink отлично работает с Process.Start ... но до тех пор, пока вы не упомянете вложения .

System.Diagnostics.Process.Start(sMailToLink);

Другие варианты используют объектную модель Outlook для этого ... но мне сказали, что для этого необходимо добавить ссылки на сборки, основанные на точной версии установленного Outlook. Также это может взорваться, если пользователь не предпочитает MS для электронной почты.

Следующей опцией являются Mapi и что-то, называемое Mapi33 .. Статус все еще В ПРОЦЕССЕ. Уши все еще открыты для предложений.

Ответы [ 7 ]

10 голосов
/ 16 января 2009

Вы можете создать объект процесса и вызвать его «mailto: user@example.com? Subject = My + New + Subject». Однако это приведет к тому, что система будет воздействовать на mailto со своим обработчиком по умолчанию, в то время как вы можете устанавливать темы, и это не будет обрабатывать добавление вложения. Я свободно признаю, что я не совсем уверен, как бы вы заставили вложение без написания какого-либо почтового плагина.

Код процесса:

System.Diagnostics.Process.Start("mailto:user@example.com?subject=My+New+Subject");
2 голосов
/ 16 января 2009

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

См. Также: MAPI и опыт управляемого кода?

2 голосов
/ 16 января 2009

Это, вероятно, не самый эффективный или элегантный способ, но, думаю, ссылка "mailto:" сделает то, что вы хотите.

РЕДАКТИРОВАТЬ: Извините, исключено очень важное "не".

1 голос
/ 16 января 2009

Запуск процесса с mailto: arguments - самый простой подход . Тем не менее, он не позволяет ничего более или менее сложного.

Немного другой подход включает создание шаблона электронной почты и его подачу в Process.Start :

var client = new SmtpClient();

var folder = new RandomTempFolder();
client.DeliveryMethod = 
  SmtpDeliveryMethod.SpecifiedPickupDirectory;

client.PickupDirectoryLocation = folder.FullName;

var message = new MailMessage("to@no.net",
  "from@no.net", "Subject","Hi and bye");

// add attachments here, if needed
// need this to open email in Edit mode in OE
message.Headers.Add("X-Unsent", "1");

client.Send(message);

var files = folder.GetFiles();

Process.Start(files[0].FullName);

Сценарии для обработчика электронной почты по умолчанию:

  • Outlook Express открывается
  • Windows: Outlook - по умолчанию не обрабатывает, вместо этого вызывается Outlook Express
  • Windows: The Bat! - сообщение открывается для просмотра, нажмите Shift-F6 и Enter, чтобы отправить

Я также тестировал с Mono, и он работал более или менее.

Дополнительные сведения доступны в этом сообщении: Интеграция информации - самый простой подход для шаблонных писем

PS: в итоге я пошел по чуть более сложному сценарию:

  • Определенный интерфейс IEmailIntegraton
  • Код выше вошел в DefaultEmailIntegration
  • Добавлены реализации для OutlookEmailIntegration (автоматизация) и theBat! интеграция с электронной почтой (в формате шаблона).
  • Разрешено пользователям SmartClient выбирать свой сценарий из раскрывающегося списка (в качестве альтернативы это можно было бы реализовать как «Проверьте систему на наличие обработчика электронной почты по умолчанию и определитесь автоматически»)
1 голос
/ 16 января 2009

Может быть, вы использовали протокол mailto:

Почти все, что вы выделяете, может быть выполнено, но я совершенно уверен, что вы не можете делать вложения.

Документация Microsoft MailTo

0 голосов
/ 22 июля 2011

вы можете использовать хитрость, если вы собираетесь использовать Outlook [этот код основан на outlook 2010 [v14.0.0.]] Создать Outlook MailItem и передать файл (то есть скачать) если пользователь открывает файл (.msg), автоматически открывается диалоговое окно создания сообщения

вот код ...

    Microsoft.Office.Interop.Outlook.Application outapp = new Application();
    try
    {

        _NameSpace np = outapp.GetNamespace("MAPI");
        MailItem oMsg = (MailItem)outapp.CreateItem(OlItemType.olMailItem);
        oMsg.To = "a@b.com";
        oMsg.Subject = "Subject";

       //add detail

        oMsg.SaveAs("C:\\Doc.msg", OlSaveAsType.olMSGUnicode);//your path
        oMsg.Close(OlInspectorClose.olSave);
    }
    catch (System.Exception e)
    {
        status = false;
    }
    finally
    {
        outapp.Quit();
    }

затем передайте созданный вами файл, скажем "Doc.msg"

    string filename ="Doc.msg";//file name created previously
    path = "C:\\" + filename; //full path ; 
    Response.ContentType="application/outlook";
    Response.AppendHeader("Content-Disposition", "filename=\"" + filename + "\"");
    FileInfo fl = new FileInfo(path);
    Response.AddHeader("Content-Length", fl.Length.ToString());
    Response.TransmitFile(path,0,fl.Length);
    Response.End();
0 голосов
/ 16 января 2009

Вы предполагаете, что у них, конечно, будет установлен почтовый клиент.

Опция, которую я использовал в прошлом (в корпоративной среде, где у всех была установлена ​​хотя бы одна версия Outlook), заключалась в использовании взаимодействия Outlook - вам нужно указать только самую раннюю версию, которую вам нужно поддерживать.

Вы можете посмотреть на P / Invoking MAPISendDocuments (чего я бы лично старался избегать), или другой вариант - создать свою собственную "составную" форму и использовать объекты из System.Net.Mail пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...