11

MailMessage (System.Net.mail.MailMessage) を作成し、.eml ではなく .msg 拡張子としてディスクに保存する義務があるアプリケーションを構築しています。

以下は、MailMessage を .msg ファイルとして保存するために使用している方法です。

   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);
        }
    }

しかし、保存された msg ファイルが開かず、以下のエラーが表示されます: 「ファイル xyz.msg を開けません。ファイル file が存在しない可能性があります。ファイルを開く権限がないか、別のプログラムによって開かれている可能性があります.... "

私の質問は: System.Net.mail.MailMessage を msg ファイルとして保存する方法は?

4

6 に答える 6

4

ここでライアンは、どんな努力もせずにそれを行うための簡単で素晴らしい方法を提案します。

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

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

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

 <configuration>
     <system.net>
         <mailSettings>
             <smtp deliveryMethod="SpecifiedPickupDirectory">
                 <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
             </smtp>
         </mailSettings>
     </system.net>
 </configuration>
于 2010-03-11T09:07:17.223 に答える
3

Outlook MSG ファイル形式について言及している場合は、Microsoft が公開している MSG 形式の仕様を確認してください。同様の質問に対する次の回答も役立つ場合があります。

于 2010-09-21T16:05:23.030 に答える
2

Outlookの.msgファイルを参照している場合、これを.NETでネイティブに実行することはできません。

Outlookの.msgファイルは複合ドキュメントであるため、その形式で保存し、適切なすべてのプロパティを正確な場所に配置する必要があります。

独自に作成するか、サードパーティを使用するか、Outlookの相互運用機能を使用する必要があります。

ごめん、

デイブ

于 2010-03-11T13:25:48.357 に答える
2

Outlook Interop ライブラリを使用するこの短い例を確認してください。C# で Outlook メッセージ ファイルを作成します。それはまさにあなたが求めていたものではありませんが、ある値から別の値に手動で値をコピーする方法があります。

于 2011-11-14T08:17:28.543 に答える
1

Microsoft サポート KB 記事: 情報:メッセージを MSG 複合ファイルに保存する

于 2011-11-14T07:59:25.777 に答える
0

Outlook によって表示されるエラー メッセージは、.msg拡張子が原因です。同じ方法を使用して MailMessage オブジェクトをディスクに保存していますが、ファイルは拡張子が.emlの Outlook でのみ開くことがわかりました。

于 2011-09-21T06:12:57.340 に答える