Come si salva l'oggetto MailMessage sul disco? L'oggetto MailMessage non espone alcun metodo Save ().
Non ho problemi se salva in qualsiasi formato, * .eml o * .msg. Qualche idea su come farlo?
Come si salva l'oggetto MailMessage sul disco? L'oggetto MailMessage non espone alcun metodo Save ().
Non ho problemi se salva in qualsiasi formato, * .eml o * .msg. Qualche idea su come farlo?
Risposte:
Per semplicità, citerò solo una spiegazione da un elemento Connect :
Puoi effettivamente configurare SmtpClient per inviare e-mail al file system invece che alla rete. Puoi farlo a livello di codice utilizzando il codice seguente:
SmtpClient client = new SmtpClient("mysmtphost"); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = @"C:\somedirectory"; client.Send(message);
Puoi anche impostarlo nel file di configurazione dell'applicazione 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, dovresti vedere i file di posta elettronica aggiunti alla directory specificata. È quindi possibile fare in modo che un processo separato invii i messaggi di posta elettronica in modalità batch.
Dovresti essere in grado di utilizzare il costruttore vuoto invece di quello elencato, poiché non lo invierà comunque.
Ecco un metodo di estensione per convertire un MailMessage in un flusso contenente i dati EML. È ovviamente un po 'un trucco 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);
}
}
}
È quindi possibile prendere il flusso restituito e fare ciò che si desidera, incluso il salvataggio in un'altra posizione su disco o l'archiviazione in un campo del database o persino l'invio di e-mail come allegato.
Per un motivo o per l'altro il client.send non è riuscito (subito dopo un invio effettivo utilizzando quel metodo), quindi ho collegato un buon flusso CDO e ADODB. Ho anche dovuto caricare CDO.message con template.eml prima di impostare i valori .Message. Ma funziona.
Poiché quello sopra è 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)
prova questo
si prega di utilizzare questi 2 riferimenti (utilizzando MailBee;) (utilizzando MailBee.Mime;)
public static string load(string to,string from,string cc,string bcc,string subject,string body, List<string> reportList,string path, bool HtmlbodyType)
{
try
{
MailBee.Mime.MailMessage msg = new MailBee.Mime.MailMessage();
msg.From.AsString = from;
msg.Subject = subject;
if (HtmlbodyType == true)
{
msg.BodyHtmlText = body;
}
else
{
msg.BodyPlainText = body;
}
string[] receptionEmail = to.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
string[] ccEmail = cc.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
string[] bccEmail = bcc.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
string message = "";
foreach (string To in receptionEmail)
{
msg.To.Add(To);
}
foreach (string CC in ccEmail)
{
msg.Cc.Add(CC);
}
foreach (string Bcc in bccEmail)
{
msg.Bcc.Add(Bcc);
}
for (int x = 0; x < reportList.Count; x++)
{
string fileName = reportList[x];
msg.Attachments.Add(fileName);
}
msg.SaveMessage(path);
return "Success";
}
catch (Exception ex)
{
return ex.Message;
}
}