2010-03-11 96 views
11

Estoy creando una aplicación en la que estoy obligado a crear un MailMessage (System.Net.mail.MailMessage) y guardarlo en el disco como extensión .msg no .emlguardar System.Net.mail.MailMessage como archivo .msg

a continuación se muestra el método que estoy usando para guardar un archivo .msg MailMessage como:

public static void Save(MailMessage Message, string FileName) 
    { 
     Assembly assembly = typeof(SmtpClient).Assembly; 
     Type _mailWriterType = 
      assembly.GetType("System.Net.Mail.MailWriter"); 

     using (FileStream _fileStream = 
       new FileStream(FileName, FileMode.Create)) 
     { 
      // Get reflection info for MailWriter contructor 
      ConstructorInfo _mailWriterContructor = 
       _mailWriterType.GetConstructor(
        BindingFlags.Instance | BindingFlags.NonPublic, 
        null, 
        new Type[] { typeof(Stream) }, 
        null); 

      // Construct MailWriter object with our FileStream 
      object _mailWriter = 
       _mailWriterContructor.Invoke(new object[] { _fileStream }); 

      // Get reflection info for Send() method on MailMessage 
      MethodInfo _sendMethod = 
       typeof(MailMessage).GetMethod(
        "Send", 
        BindingFlags.Instance | BindingFlags.NonPublic); 

      // Call method passing in MailWriter 
      _sendMethod.Invoke(
       Message, 
       BindingFlags.Instance | BindingFlags.NonPublic, 
       null, 
       new object[] { _mailWriter, true }, 
       null); 

      // Finally get reflection info for Close() method on our MailWriter 
      MethodInfo _closeMethod = 
       _mailWriter.GetType().GetMethod(
        "Close", 
        BindingFlags.Instance | BindingFlags.NonPublic); 

      // Call close method 
      _closeMethod.Invoke(
       _mailWriter, 
       BindingFlags.Instance | BindingFlags.NonPublic, 
       null, 
       new object[] { }, 
       null); 
     } 
    } 

embargo, el archivo guardado msg no se abre y por debajo está el error: "no se puede abrir archivo XYZ .msg.El archivo de archivo puede no existir, puede que no tenga permiso para abrirlo o puede abrirlo otro programa ... "

Mi pregunta es: ¿Cómo guardar System.Net.mail.MailMessage como archivo msg?

Respuesta

4

Here Ryan sugiere una forma fácil y excelente de hacerlo sin ningún esfuerzo.

You can actually configure the SmtpClient to send emails to the file system instead of the network. You can do this programmatically using the following code:

SmtpClient client = new SmtpClient("mysmtphost"); 
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
client.PickupDirectoryLocation = @"C:\somedirectory"; 
client.Send(message); 

También puede configurar esta opción en el archivo de configuración de la aplicación de esta manera:

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="SpecifiedPickupDirectory"> 
       <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 
+2

Sí, es cierto, pero el MailMessage se guarda como archivo .eml. Quiero que se guarde como archivo .msg – Gaby

+1

¿Por qué invalidar esto? No es "la" respuesta, pero es una buena sugerencia ... –

+0

Gaby, ¿tiene alguna respuesta? – zipi

2

Si se refiere a archivos de Outlook .msg, esto no se puede hacer de forma nativa en .NET .

El archivo .msg de Outlook es un documento compuesto, por lo tanto, deberá guardarlo en ese formato y asegurarse de poner todas las propiedades adecuadas en sus ubicaciones exactas.

Debe escribir su propia cuenta, usar una de terceros o una posible interoperabilidad de Outlook.

Lo sentimos,

de Dave

0

El mensaje de error dado por Outlook se debe a la extensión .msg. Estoy utilizando el mismo método para guardar objetos de MailMessage en el disco y he descubierto que el archivo solo se abrirá en Outlook con una extensión de .eml.

2

Comprobar este breve ejemplo que utiliza la biblioteca de Outlook interoperabilidad Creating an Outlook Message File with C#. No es exactamente lo que ha estado pidiendo, pero hay una manera de copiar los valores de de uno a otro, de forma manual.

+2

Outlook Interop es útil para el cliente -la configuración del lado donde está instalado Office, pero casi inutilizable en los escenarios del lado del servidor. – saille

Cuestiones relacionadas