С# MailTo с вложением?

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

public void SendSupportEmail(string emailAddress, string subject, string body)
{
   Process.Start("mailto:" + emailAddress + "?subject=" + subject + "&body=" 
                + body);
}

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

что-то типа:

public void SendSupportEmail(string emailAddress, string subject, string body)
{
   Process.Start("mailto:" + emailAddress + "?subject=" + subject + "&body=" 
      + body + "&Attach="
      + @"C:\Documents and Settings\Administrator\Desktop\stuff.txt");
}

Однако это, похоже, не работает. Кто-нибудь знает способ, который позволит этому работать!?

Помогите очень признателен.

С Уважением.


person Goober    schedule 28.07.2009    source источник
comment
Дубликат: stackoverflow.com/q/20328598/5389585   -  person sondra.kinsey    schedule 05.03.2021


Ответы (5)


mailto: официально не поддерживает вложения. Я слышал, что Outlook 2003 будет работать с таким синтаксисом:

<a href='mailto:[email protected]?Subject=SubjTxt&Body=Bod_Txt&Attachment=""C:\file.txt"" '>

Лучший способ справиться с этим — отправить почту на сервер с помощью System.Net.Mail.Attachment.

    public static void CreateMessageWithAttachment(string server)
    {
        // Specify the file to be attached and sent.
        // This example assumes that a file named Data.xls exists in the
        // current working directory.
        string file = "data.xls";
        // Create a message and set up the recipients.
        MailMessage message = new MailMessage(
           "[email protected]",
           "[email protected]",
           "Quarterly data report.",
           "See the attached spreadsheet.");

        // Create  the file attachment for this e-mail message.
        Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
        // Add time stamp information for the file.
        ContentDisposition disposition = data.ContentDisposition;
        disposition.CreationDate = System.IO.File.GetCreationTime(file);
        disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
        disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
        // Add the file attachment to this e-mail message.
        message.Attachments.Add(data);

        //Send the message.
        SmtpClient client = new SmtpClient(server);
        // Add credentials if the SMTP server requires them.
        client.Credentials = CredentialCache.DefaultNetworkCredentials;

        try {
          client.Send(message);
        }
        catch (Exception ex) {
          Console.WriteLine("Exception caught in CreateMessageWithAttachment(): {0}", 
                ex.ToString() );              
        }
        data.Dispose();
    }
person Jon Galloway    schedule 28.07.2009

Если вы хотите получить доступ к почтовому клиенту по умолчанию, вы можете использовать MAPI32.dll (работает только в ОС Windows). Взгляните на следующую обертку:

http://www.codeproject.com/KB/IP/SendFileToNET.aspx

Код выглядит так:

MAPI mapi = new MAPI();
mapi.AddAttachment("c:\\temp\\file1.txt");
mapi.AddAttachment("c:\\temp\\file2.txt");
mapi.AddRecipientTo("[email protected]");
mapi.AddRecipientTo("[email protected]");
mapi.SendMailPopup("testing", "body text");

// Or if you want try and do a direct send without displaying the mail dialog
// mapi.SendMailDirect("testing", "body text");
person Alex    schedule 29.08.2009
comment
Этот код полезен для отправки вложений почтовому клиенту по умолчанию. Не все используют Outlook, поэтому этот код великолепен! - person Brent; 06.03.2010
comment
Это вызывает исключение AccessViolationException, когда я прикрепляю файл. - person Sinaesthetic; 27.12.2015
comment
Хорошая ссылка! Должен быть стандартный способ сделать это. - person LueTm; 23.01.2017
comment
Если ваш почтовый клиент уже запущен, вам необходимо убедиться, что ваш почтовый клиент и ваша программа работают с одинаковыми привилегиями. Например, если Outlook работает от имени администратора, ваше приложение, использующее этот класс MAPI, также необходимо запускать от имени администратора. В противном случае вы можете получить MAPISendMail fails and returns error code 2 - person Daniel Bonetti; 07.07.2017

Нужно ли этому приложению использовать Outlook? Есть ли причина не использовать пространство имен System.Net.Mail?

Если вам действительно нужно использовать Outlook (и я бы не рекомендовал его, потому что тогда вы основываете свое приложение на сторонних зависимостях, которые, вероятно, изменятся), вам нужно будет изучить пространства имен Microsoft.Office.

Я бы начал здесь: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.aspx

person David    schedule 28.07.2009

Попробуй это

var proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = string.Format("\"{0}\"", Process.GetProcessesByName("OUTLOOK")[0].Modules[0].FileName);
proc.StartInfo.Arguments = string.Format(" /c ipm.note /m {0} /a \"{1}\"", "[email protected]", @"c:\attachments\file.txt");
proc.Start();
person kernowcode    schedule 27.08.2014

Официально да, протокол mailTo не поддерживает вложения. Но Уилливиг очень хорошо объяснил здесь, что есть способ сделать это - Открыть почтовый клиент по умолчанию вместе с вложением

person Mahesh    schedule 09.09.2015
comment
Это не так просто, как описано в этом посте, посмотрите последний комментарий под ним, опубликованный @ A. Blodgett 7 мая 2019, в 3:52. - person Marcin; 12.02.2020