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.
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:
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));
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.
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
.
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>