77


32

MailMessageオブジェクトをディスクに保存する方法 MailMessageオブジェクトは、Save()メソッドを公開していません。

  • .emlまたは* .msgの形式で保存しても問題ありません。 これを行う方法がありますか?

4 Answer


113


簡単にするために、私はhttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=94725 [Connect item]からの説明を引用します。

_ _ 実際には、ネットワークではなくファイルシステムに電子メールを送信するようにSmtpClientを構成できます。 次のコードを使用してプログラム的にこれを行うことができます。

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

次のようにアプリケーション構成ファイルでこれを設定することもできます。 _ _


_ 電子メールを送信すると、指定したディレクトリに電子メールファイルが追加されます。 その後、個別のプロセスに電子メールメッセージをバッチモードで送信させることができます。 _

それはとにかくそれを送信しないので、あなたはリストされたものの代わりに空のコンストラクタを使うことができるはずです。


24


これがMailMessageをEMLデータを含むストリームに変換するための拡張メソッドです。 ファイルシステムを使用しているので、明らかにちょっとしたハックですが、うまくいきます。

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

///
/// Converts a MailMessage to an EML file stream.
///
///
///
ToEMLStream public static void ToEMLStream(この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");

//この.emlファイルだけを保持する一時フォルダを作成して、簡単に見つけられるようにします。 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には1 emlファイルを含める必要があります

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

//(var fs = new FileStream(filePath、FileMode.Open)){{fs.CopyTo(str);}を使用してコンテンツをストリームアウトします。 }

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

その後、ディスク上の別の場所に保存したり、データベースフィールドに保存したり、添付ファイルとして電子メールで送信したりすることも含めて、返されたストリームを受け取り、必要に応じて実行できます。


2


  • Mailkit *を使用している場合 以下のコードを書くだけ

string fileName = "あなたのファイル名のフルパス"; MimeKit.MimeMessage message = CreateMyMessage(); message.WriteTo(fileName);


0


何らかの理由でclient.sendが失敗した(そのメソッドを使った実際の送信の直後)ので、良いCDOとADODBストリームを接続しました。 また、CDO.messageをtemplate.emlと一緒にロードしなければなりません。 .Message values. But it works.

上記のものはCなので、こちらはVBのものです

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

Smtp.Host = "------" Smtp.Port = "2525" Smtp.Credentials =新しいNetworkCredential(------)

Smtp.Send(MyMessage) '実際の送信

CDO.MessageとしてのoldCDO = MyLoadEmlFromFile( "template.eml") 'を件名から空白にしてください。 最初の行を空白のままにします。oldCDO.To = mToAddress oldCDO.From = mEmailAddress oldCDO.Subject = mSubject oldCDO.TextBody = mBody oldCDO.HTMLBody = mBody oldCDO.GetStream.Flush()