web-dev-qa-db-fra.com

C # MailTo avec pièce jointe?

J'utilise actuellement la méthode ci-dessous pour ouvrir le compte de messagerie Outlook des utilisateurs et remplir un courrier électronique avec le contenu pertinent pour l'envoi:

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

Je souhaite cependant pouvoir renseigner l'e-mail avec un fichier joint.

quelque chose comme:

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

Cependant, cela ne semble pas fonctionner ... Quelqu'un sait-il comment le faire fonctionner?!

Aide grandement apprécié.

Cordialement.

26
Goober

mailto: ne supporte pas officiellement les pièces jointes. J'ai entendu dire qu'Outlook 2003 fonctionnerait avec cette syntaxe:

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

Une meilleure solution consiste à envoyer le courrier sur le serveur à l’aide de 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();
    }
10
Jon Galloway

Si vous souhaitez accéder au client de messagerie par défaut, vous pouvez utiliser MAPI32.dll (fonctionne sous Windows uniquement) . Regardez le wrapper suivant:

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

Le code ressemble à ceci:

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");
50
Alex

Cette application a-t-elle vraiment besoin d'utiliser Outlook? Existe-t-il une raison pour ne pas utiliser l'espace de noms System.Net.Mail?

Si vous avez vraiment besoin d'utiliser Outlook (et je ne le recommanderais pas car vous basez votre application sur des dépendances tierces susceptibles de changer), vous devrez vous pencher sur les espaces de noms Microsoft.Office.

Je commencerais ici: http://msdn.Microsoft.com/en-us/library/Microsoft.office.interop.Outlook.aspx

4
David

Essaye ça

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();
2
kernowcode

Officiellement oui, le protocole mailTo ne prend pas en charge les pièces jointes. Mais Williwyg a très bien expliqué ici qu’il existe un moyen de le faire - Ouvrir le client de messagerie par défaut avec une pièce jointe

0
Mahesh