2009-01-16 7 views
5

Le cas d'utilisation est simple. À un certain moment, je dois être en mesure de montrer à l'utilisateur son dialogue familier Compose de messagerie (Outlook ou autre) avecComment ouvrir la boîte de dialogue de composition/création de courrier à l'aide du client de messagerie par défaut de l'utilisateur?

  • champs comme de, à, sujet déjà rempli avec certaines applications valeurs déterminées.
  • L'email aurait également une pièce jointe avec elle.

Le courrier ne doit pas être envoyé à moins que l'utilisateur ne l'accepte explicitement.

Je l'ai fait une fois dans les anciens jours 'VB6 .. ne peut pas comprendre comment maintenant .. Je me souviens juste que c'était assez facile.

app Managed, C#, .net 3.0+

Mise à jour # 1: Ouais semble que mailto support enlevé pour les pièces jointes (comme un risque de sécurité?). J'ai essayé

Vous devez inclure la signature ShellExecute as described here. Tout ce que je suis arrivé de c'était un 5 SE_ERR_ACCESSDENIED et 2 seulement pour une variété

string sMailToLink = @"mailto:[email protected]?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()); 

Le même MailtoLink fonctionne parfaitement avec Process.Start ... mais aussi longtemps que tu ne mentionne les pièces jointes.

System.Diagnostics.Process.Start(sMailToLink); 

Les autres options utilisent le modèle d'objet Outlook pour le faire .. mais on m'a dit que cela vous oblige à ajouter des références d'assemblage à base de la version exacte d'Outlook installée. Aussi, cela exploserait si l'utilisateur ne préfère pas MS pour le courrier électronique.

Les options suivantes sont Mapi et quelque chose appelé Mapi33 .. Statut toujours EN COURS. Les oreilles restent ouvertes aux suggestions.

Répondre

2

Il est probablement pas le le moyen le plus efficace ou élégant, mais bombarder un "mailto:" lien fera ce que vous voulez, je pense.

EDIT: Désolé, a omis un très important "non".

+0

ouais trouvé ce via googler. Cependant ShellExecute ne veut pas me parler maintenant. :) – Gishu

1

Se pourrait-il que vous utilisiez le protocole mailto:?

Presque tout ce que vous mettez en évidence peut être fait, mais je suis tout à fait sûr, que vous ne pouvez pas faire des pièces jointes.

Microsoft MailTo Documentation

+0

ouais ça ressemble. un peu OT ... w.r.t à cet exemple, d'une certaine manière, c'était beaucoup plus facile dans VB6 que dans .net. – Gishu

10

Vous pouvez créer un objet de processus et l'ont appeler "mailto: [email protected] subject = Ma + Nouveau + Sujet". Cela entraînera le système à agir sur le mailto avec son gestionnaire par défaut, cependant, alors que vous pouvez définir des sujets et que cela ne gérera pas l'ajout d'une pièce jointe. J'admets volontiers que je ne suis pas tout à fait sûr de la façon dont vous feriez pour forcer une pièce jointe sans écrire un plugin mail.

Le code de processus est:

System.Diagnostics.Process.Start("mailto:[email protected]?subject=My+New+Subject"); 
+0

thx mais pas de pièce jointe :( – Gishu

2

Depuis mailto ne prend pas en charge les pièces jointes, et depuis MAPI n'est pas prise en charge dans le code managé, votre meilleur pari est d'écrire (ou avoir écrire quelqu'un) un petit non géré programme pour appeler les fonctions MAPI que vous pouvez appeler avec des arguments de ligne de commande. Dommage que .NET n'ait pas d'alternative plus propre.

Voir aussi: MAPI and managed code experiences?

+0

Ouais je pensais la même chose .. je veux dire le cadre .net tout puissant ne peut pas obtenir une boîte de dialogue Envoyer un e-mail.Peut-il être difficile? :) C'était il ya une heure. – Gishu

0

Vous faites l'hypothèse qu'ils auront un client de messagerie installé, bien sûr. L'option que j'ai prise par le passé (dans un environnement d'entreprise où tout le monde a installé au moins une version d'Outlook) consistait à utiliser l'interopérabilité Outlook - il suffit de faire référence à la première version que vous devez prendre en charge.

Vous pouvez regarder P/Appel MAPISendDocuments (que j'essayerais d'éviter, personnellement), ou l'autre option serait de créer votre propre formulaire "composer" et utiliser les objets de l'espace de noms System.Net.Mail.

+0

Faire rouler sa propre forme de composition est la première étape sur une route très longue et délicate. Pourrait être OK pour une application Web, mais sur le bureau, les demandes seront légitimement faites pour beaucoup de choses. Plusieurs adresses mail, prise en charge du carnet d'adresses, copies de messages dans les boîtes d'envoi, gestion des comptes, et je n'ai plus de caractères. – Ishmaeel

0

Démarrage du processus avec mailto: arguments est l'approche la plus simple. Pourtant, cela ne permet rien de plus ou de moins complexe.

approche légèrement différente implique création modèle de courrier électronique et l'alimentation à l'Process.Start:

var client = new SmtpClient(); 

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

client.PickupDirectoryLocation = folder.FullName; 

var message = new MailMessage("[email protected]", 
    "[email protected]", "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); 

Scénarios pour le gestionnaire de messagerie par défaut:

  • express Outlook ouvre
  • de Windows : Outlook - ne gère pas par défaut, Outlook Express est appelé à la place
  • Windows: La Bat! - message est ouvert pour la visualisation, appuyez sur Maj-F6 et Entrée pour envoyer

J'ai également testé avec Mono et cela a fonctionné plus ou moins.

Des détails supplémentaires sont disponibles dans ce post: Information integration - simplest approach for templated emails

PS: à la fin je suis allé pour le scénario un peu plus complexe:

  • interface définie IEmailIntegraton
  • code ci-dessus est entré dans le DefaultEmailIntegration
  • Implémentations ajoutées pour OutlookEmailIntegration (automation) et theBat! intégration d'email (en utilisant leur format de modèle).
  • a permis aux utilisateurs du SmartClient pour sélectionner leur scénario à partir de la liste déroulante (encore ce aurait pu être mis en œuvre comme « Vérifier le système pour le gestionnaire de messagerie par défaut et décider automatiquement »)
-1

vous pouvez utiliser Astuce si vous avez l'intention d'utiliser Outlook [ce code est basé sur Outlook 2010 [v14.0.0.]] Créer Outlook MailItem et transmettre le fichier (par exemple télécharger) si l'utilisateur ouvre le fichier (.msg) la boîte de dialogue de message Compose ouvre automatiquement

voici le code ...

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

     _NameSpace np = outapp.GetNamespace("MAPI"); 
     MailItem oMsg = (MailItem)outapp.CreateItem(OlItemType.olMailItem); 
     oMsg.To = "[email protected]"; 
     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(); 
    } 

puis transmettre le fichier que vous avez créé dites "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(); 
Questions connexes