c# - mvc - ¿Cómo puedo guardar un correo electrónico en lugar de enviarlo al usar SmtpClient?
enviar correo mvc c# (5)
Estoy usando SmtpClient para enviar un correo electrónico con un archivo adjunto. Sin embargo, para un determinado lote, de alguna manera debemos guardar MailMessage en lugar de enviarlos. Entonces estamos pensando / esperando subir los mensajes manualmente a la carpeta de borradores de los usuarios.
¿Es posible guardar estos mensajes con el archivo adjunto intacto (imposible, habría pensado). ¿O, alternativamente, cargue los mensajes en una carpeta de la cuenta de los usuarios?
Si alguien tiene alguna experiencia en esto, agradecería un poco de ayuda o un puntero.
Además de la información del SpecifiedPickupDirectory
de las otras respuestas, si desea asegurarse de que sus correos electrónicos se envíen a una carpeta relacionada con la raíz del sitio (útil para probar en servidores de compilación donde no conoce las rutas), puede agregar una verificación rápida en su código de envío de correo electrónico:
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;
}
Y sus pruebas se verán más o menos así (asegúrese de usar App_Data para que IIS pueda escribir en la carpeta):
// 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));
Esto puede ayudar - Agregar la funcionalidad Save () a Microsoft.Net.Mail.MailMessage
La ideia principal, hacer una extensión a MailMessage, que por reflexión hace un método de guardar.
Puede configurar esto con la configuración de system.net
en su web.config
/ app.config
.
<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>
Además, aquí hay un enlace con información sobre la migración de System.Web.Mail
a System.Net.Mail
.
También es necesario agregar un error como solución alternativa en algunas versiones del marco. Entonces la versión completa se ve así:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:/Temp/mail/"/>
<network host="localhost" />
</smtp>
</mailSettings>
</system.net>
Al probar en ASP.NET, guardamos nuestros correos electrónicos en una carpeta en lugar de enviarlos a través de un servidor de correo electrónico. ¿Tal vez podría cambiar la configuración de su web.config
como esta para su lote?
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:/Temp/mail/"/>
</smtp>
</mailSettings>
</system.net>
Información adicional: