web-dev-qa-db-ja.com

SmtpClientを使用する場合、送信する代わりにメールを保存するにはどうすればよいですか?

SmtpClientを使用して、添付ファイル付きのメールを送信しています。ただし、特定のバッチでは、MailMessageを送信するのではなく、何らかの方法で保存する必要があります。次に、メッセージをユーザーの下書きフォルダに手動でアップロードすることを考えています。

添付ファイルをそのままにしてこれらのメッセージを保存することは可能ですか(不可能だと思いました)。または、ユーザーアカウントのフォルダーにメッセージをアップロードしますか?

誰かがこれの経験を持っているなら、私は少しの助けやポインタをいただければ幸いです。

44
user17510

ASP.NETでテストするときは、電子メールをフォルダーに保存するのではなく、電子メールサーバー経由で送信します。多分あなたはあなたのweb.configバッチ用にこのような設定をしますか?

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
    </smtp>
  </mailSettings>
</system.net>

追加情報:

73
Leah

他の回答のSpecifiedPickupDirectory情報と同様に、メールがサイトルートからの相対フォルダに送信されるようにしたい場合-パスがわからないビルドサーバーでのテストに便利です-メール送信コードに簡単なチェックを追加できます:

    SmtpClient client = new SmtpClient();
    ...

    // Add "~" support for pickupdirectories.
    if (client.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory && client.PickupDirectoryLocation.StartsWith("~"))
    {
        string root = AppDomain.CurrentDomain.BaseDirectory;
        string pickupRoot = client.PickupDirectoryLocation.Replace("~/", root);
        pickupRoot = pickupRoot.Replace("/",@"\");
        client.PickupDirectoryLocation = pickupRoot;
    }

テストは次のようになります(App_Dataを使用して、IISがフォルダーに書き込むことができるようにしてください)。

    // Arrange - get SitePath from AppDomain.Current.BaseDirectory + ..\
    string pickupPath = Path.Combine(SitePath, "App_Data", "TempSmtp");
    if (!Directory.Exists(pickupPath))
        Directory.CreateDirectory(pickupPath);

    foreach (string file in Directory.GetFiles(pickupPath, "*.eml"))
    {
        File.Delete(file);
    }

    // Act (send some emails)

    // Assert
    Assert.That(Directory.GetFiles(pickupPath, "*.eml").Count(), Is.EqualTo(1));
12
Chris S

これは役立ちます- Microsoft(Net.Mail.MailMessageへのSave()機能の追加
主なアイデアは、リフレクションによって保存メソッドを作成することにより、MailMessageの拡張を作成することです。

7
Avram

これは、system.net/web.configファイルのapp.config設定で構成できます。

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network Host="mail.mydomain.com" port="25" />
    </smtp>
    <!-- Use this setting for development
    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp" />
    </smtp>
    -->
  </mailSettings>
</system.net>

また、これは System.Web.MailからSystem.Net.Mailへの移行 に関する情報のリンクです。

6
dotjoe

バグには、フレームワークの一部のバージョンでの回避策としての追加も必要です。したがって、完成したバージョンは次のようになります。

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
        <network Host="localhost" />
    </smtp>
  </mailSettings>
</system.net>
1
devjin