ここで説明した手順を使用して、eml を作成し、ディレクトリに保存しています。これらの eml ファイルを送信する方法を知りたいですか? SMTPClient クラスのオブジェクトを使用しようとしましたが、MailMessage オブジェクトをパラメーターとして取り、これらの保存された eml ファイルを使用して MailMessage タイプのオブジェクトを作成する方法が見つかりませんでした。
7 に答える
EML ファイルを正しくロードすることは、見た目ほど簡単ではありません。数日で 95% のケースで動作する実装を作成できます。残りの 5% には、少なくとも数か月かかるでしょう ;-)。私は開発に携わったので知っています。
次の困難を考慮してください。
- ユニコードメール
- 右から左へ記述する言語
- 一般的なメール クライアントとサーバーでよく知られているエラーによって引き起こされた、不正な形式の EML ファイルの修正
- S/MIME (暗号化および署名された電子メール メッセージ) の処理
- 添付ファイルをエンコードするいくつかの方法を正しく処理する
- HTML メールに埋め込まれたインライン画像とスタイルシートの処理
- Mike Crispin (Mime および IMAP RFC の共著者) からのMIME 拷問メッセージを正しく解析することを確認する
- 不正なメッセージがバッファ オーバーランや他のアプリケーションのクラッシュを引き起こさないことを確認する
- 階層メッセージの処理 (メッセージが添付されたメッセージ)
- 非常に大きなメールを正しく処理することを確認する
このようなパーサーの成熟には何年もかかり、ユーザーへの継続的なフィードバックが必要です。現在、そのようなパーサーは .NET Framework に含まれていません。それが変わるまでは、確立されたベンダーからサードパーティの MIME パーサーを入手することをお勧めします。
次のコードはRebex Secure Mail コンポーネントを使用していますが、同様のタスクは他のベンダーのコンポーネントでも簡単に複製できると確信しています。
コードはMail Message tutorialに基づいています。
// create an instance of MailMessage
MailMessage message = new MailMessage();
// load the message from a local disk file
message.Load("c:\\message.eml");
// send message
Smtp.Send(message, "smtp.example.org");
EMLReaderを使用して、.eml ファイルからデータを取得します。From、To、Subject、Body などのMailMessageオブジェクトを作成するために必要なすべてのデータが含まれています。
FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite);
EMLReader reader = new EMLReader(fs);
fs.Close();
MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body);
あなたが Microsoft ショップであり、とにかく Exchange サーバーを持っている場合は、ここで提案されている他のすべてよりもはるかに簡単な別のソリューションがあります。
各 Exchange サーバーには、すぐに使用できる構成のピックアップ ディレクトリがあります。
デフォルトでは、です%ExchangeInstallPath%TransportRoles\Pickup。
ファイルをそのディレクトリにコピーするだけ.emlで、Exchange が自動的にメールを送信します。
詳細については、次の TechNet 記事を参照してください:
ピックアップ ディレクトリと再生ディレクトリ
私がしたことをしなさい...あきらめなさい。
MailMessageオブジェクトの作成が焦点のようですが、ここでも同様の質問があります... すでに文字列として送信している場合、メールを送信するにはどうすればよいですか?
これを行う最も簡単な方法は、rawソケットを使用して、.emlファイルの内容全体をそのままメールサーバーにダンプし、メールサーバーにfrom、subject、ectなどの難しいものを認識させることです。そのエンジンを使用して電子メールを解析することによって。
唯一の問題...RFC821 ...そのような苦痛、私はこれを行うためのクリーンな方法を見つけ出し、すでにメールボックスにあるメールをすばやく読むことも試みています。
編集:
私はきれいな解決策を見つけて、私のスレッドでそれをカバーしました:)
Exchange を使用した前の回答と同じ方法で、Windows Server の組み込み SMTP サーバーを使用してこれを行うことができます。
.eml ファイルを にドロップするC:\inetpub\mailroot\Pickupと、生のメッセージが送信されます (ローカルまたはリモート)。
先頭に行を挿入するだけで、メッセージを転送できます。
To: email@address.com
必要に応じて、メール ヘッダーをさらに操作できます。