Domanda

Come si salva oggetto MailMessage al disco? L'oggetto MailMessage non espone alcun metodo Save ().

Non ho un problema se si salva in qualsiasi formato, * .eml o * .msg. Qualsiasi idea di come fare questo?

È stato utile?

Soluzione

Per semplicità, mi limiterò a citare un chiarimento da un Connect :

  

Si può effettivamente configurare la   SMTPClient per inviare messaggi di posta elettronica al file   sistema invece della rete. Puoi   fare questo a livello di codice utilizzando il   seguente codice:

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

È anche possibile impostare questa funzione nella vostra   file di configurazione dell'applicazione come   in questo modo:

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

Dopo aver inviato l'e-mail, si dovrebbe   vedono file di posta elettronica vengono aggiunti alla   directory specificata. È quindi possibile   avere un processo separato inviare la   messaggi di posta elettronica in modalità batch.

Si dovrebbe essere in grado di utilizzare il costruttore vuoto al posto di quello indicato, in quanto non sarà l'invio comunque.

Altri suggerimenti

Ecco un metodo di estensione per convertire un MailMessage a un flusso contenente i dati EML. Il suo, ovviamente, un po 'di hack in quanto utilizza il file system, ma funziona.

public static void SaveMailMessage(this MailMessage msg, string filePath)
{
    using (var fs = new FileStream(filePath, FileMode.Create))
    {
        msg.ToEMLStream(fs);
    }
}

/// <summary>
/// Converts a MailMessage to an EML file stream.
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public static void ToEMLStream(this MailMessage msg, Stream str)
{
    using (var client = new SmtpClient())
    {
        var id = Guid.NewGuid();

        var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name);

        tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp");

        // create a temp folder to hold just this .eml file so that we can find it easily.
        tempFolder = Path.Combine(tempFolder, id.ToString());

        if (!Directory.Exists(tempFolder))
        {
            Directory.CreateDirectory(tempFolder);
        }

        client.UseDefaultCredentials = true;
        client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
        client.PickupDirectoryLocation = tempFolder;
        client.Send(msg);

        // tempFolder should contain 1 eml file

        var filePath = Directory.GetFiles(tempFolder).Single();

        // stream out the contents
        using (var fs = new FileStream(filePath, FileMode.Open))
        {
            fs.CopyTo(str);
        }

        if (Directory.Exists(tempFolder))
        {
            Directory.Delete(tempFolder, true);
        }
    }
}

Si può quindi prendere il flusso questo è restituiti e fare quello che vuoi con esso, tra cui il salvataggio in un'altra posizione sul disco o la memorizzazione in un campo di database, o anche via email come allegato.

Se si utilizza Mailkit . Basta scrivere il codice in basso

string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo(fileName);

Per un motivo o per l'altro il client.send riuscita (a destra dopo un invio vero e proprio utilizzando tale metodo) così ho inserito in buona 'CDO ole e flusso ADODB. Ho anche dovuto caricare CDO.Message con un template.eml prima di impostare i valori .message. Ma funziona.

Da quanto sopra si è C ecco uno per VB

    MyMessage.From = New Net.Mail.MailAddress(mEmailAddress)
    MyMessage.To.Add(mToAddress)
    MyMessage.Subject = mSubject
    MyMessage.Body = mBody

    Smtp.Host = "------"
    Smtp.Port = "2525"
    Smtp.Credentials = New NetworkCredential(------)

    Smtp.Send(MyMessage)        ' Actual Send

    Dim oldCDO As CDO.Message
    oldCDO = MyLoadEmlFromFile("template.eml")  ' just put from, to, subject blank. leave first line blank
    oldCDO.To = mToAddress
    oldCDO.From = mEmailAddress
    oldCDO.Subject = mSubject
    oldCDO.TextBody = mBody
    oldCDO.HTMLBody = mBody
    oldCDO.GetStream.Flush()
    oldCDO.GetStream.SaveToFile(yourPath)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top