web-dev-qa-db-fra.com

Comment puis-je enregistrer un e-mail au lieu de l'envoyer lors de l'utilisation de SmtpClient?

J'utilise SmtpClient pour envoyer un e-mail avec une pièce jointe. Cependant, pour un certain lot, nous devons en quelque sorte enregistrer le MailMessage au lieu de les envoyer. Nous pensons/espérons ensuite télécharger manuellement les messages dans le dossier des brouillons des utilisateurs.

Est-il possible de sauvegarder ces messages avec la pièce jointe intacte (impossible, j'aurais pensé). Ou bien télécharger les messages dans un dossier dans le compte des utilisateurs?

Si quelqu'un a une expérience de cela, j'apprécierais beaucoup un peu d'aide ou un pointeur.

44
user17510

Lors des tests dans ASP.NET, nous enregistrons nos e-mails dans un dossier plutôt que de les envoyer via un serveur de messagerie. Vous pourriez peut-être changer votreweb.config des paramètres comme celui-ci pour votre lot?

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
    </smtp>
  </mailSettings>
</system.net>

Informations supplémentaires:

73
Leah

Ainsi que les informations SpecifiedPickupDirectory des autres réponses, si vous voulez vous assurer que vos e-mails sont envoyés dans un dossier relatif à la racine du site - pratique dans les tests sur les serveurs de build dont vous ne connaissez pas les chemins - vous pouvez ajouter une vérification rapide dans votre code d'envoi d'email:

    SmtpClient client = new SmtpClient();
    ...

    // Add "~" support for pickupdirectories.
    if (client.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory && client.PickupDirectoryLocation.StartsWith("~"))
    {
        string root = AppDomain.CurrentDomain.BaseDirectory;
        string pickupRoot = client.PickupDirectoryLocation.Replace("~/", root);
        pickupRoot = pickupRoot.Replace("/",@"\");
        client.PickupDirectoryLocation = pickupRoot;
    }

Et vos tests ressembleront à ceci (assurez-vous d'utiliser App_Data pour que IIS puisse écrire dans le dossier):

    // Arrange - get SitePath from AppDomain.Current.BaseDirectory + ..\
    string pickupPath = Path.Combine(SitePath, "App_Data", "TempSmtp");
    if (!Directory.Exists(pickupPath))
        Directory.CreateDirectory(pickupPath);

    foreach (string file in Directory.GetFiles(pickupPath, "*.eml"))
    {
        File.Delete(file);
    }

    // Act (send some emails)

    // Assert
    Assert.That(Directory.GetFiles(pickupPath, "*.eml").Count(), Is.EqualTo(1));
12
Chris S

Cela peut aider - Ajout de la fonctionnalité Save () à Microsoft.Net.Mail.MailMessage
L'idée principale, faire une extension de MailMessage, c'est par réflexion faire une méthode de sauvegarde.

7
Avram

Vous pouvez configurer cela avec le system.net réglage dans votre web.config/app.config fichier.

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network Host="mail.mydomain.com" port="25" />
    </smtp>
    <!-- Use this setting for development
    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp" />
    </smtp>
    -->
  </mailSettings>
</system.net>

En outre, voici un lien avec des informations sur migration depuis System.Web.Mail à System.Net.Mail .

6
dotjoe

Un bogue doit également être ajouté comme solution de contournement dans certaines versions du cadre. La version terminée ressemble donc à:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
        <network Host="localhost" />
    </smtp>
  </mailSettings>
</system.net>
1
devjin