サーバーがないときの SMTP 利用箇所のテスト方法
アプリケーションからメールを送信したい、という要求はよくあることです。
ところが、開発時から使えるメールサーバーがちゃんと用意されることはあまりないことです(苦笑)。
こうなると開発は非効率になってしまいますので、そこでどうするか、ということが今回のテーマです。
ひと言で言えば、.NET Framework にはファイルシステムにメールをドロップする仕組みがありますよ、ということです。
新しい仕組みではないので、「あああれか」とピンと来た方も多いかもです。
テスト用にファイルシステムにメッセージを送るというのは、例えば Django 等にもありますね。
ファイルシステムにメールをドロップ
いきなり方法を書くと、設定ファイル、すなわち ASP.NET なら Web.config、EXE 形式なら <EXE名>.config に mailSettings を設定し、 deliveryMethod に SpecifiedPickupDirectory を指定します。
<?xml version="1.0"?>
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory" from="donotreply@example.com">
<specifiedPickupDirectory pickupDirectoryLocation="C:\Temp\SMTP"/>
</smtp>
</mailSettings>
</system.net>
</configuration>
こんな風に設定すると、System.Net.Mail.SmtpClient がメールを送るときに pickupDirectoryLocation で指定したディレクトリにメッセージを作成します。
pickupDirectoryLocation の動作確認
それでは ASP.NET で動作確認します。次のような画面があって、ボタンを押すとメッセージが作成される、というようなコードを書いてみましょう。
まず ASPX ページ Default.aspx はごくシンプルにこんな感じ・・・
<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Send mail" />
</div>
</form>
</body>
</html>
Visual Studio 2010 SP1 から HTML5 のバリデーションオプションが追加された、というらしいので DOCTYPE だけそれっぽく・・・(笑)
コード Default.aspx.cs は次の通り。すべてハードコードで、単純さアップです。
using System;
using System.Net.Mail;
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
MailMessage message = new MailMessage(
new MailAddress("from@example.com"),
new MailAddress("dadosan@keicode.com"));
message.Subject= "Hello, this is a mail subject";
message.Body = "Hello, this is a mail body.";
SmtpClient smtpClient = new SmtpClient();
smtpClient.Send(message);
}
}
これだけで準備完了です。実行してボタンを押すと、押した回数だけ pickupDirectoryLocation で指定したディレクトリにメッセージが作成されます。
ディレクトリが存在しないと DirectoryNotFoundException がでます。
テスト目的ということでこれがあるなら、 SMTP サーバーを利用しているときには出ないであろう「ディレクトリがありません」なんて例外を出すより、送達不可という意味の例外を出してくれたほうがうれしいんですけどね。
ちなみに、メッセージは次のようなメールメッセージができます。
とりあえずハイライトした箇所あたりをみれば、送り元、送り先、件名、メッセージ等が設定されていることはわかるでしょう。
ただしエンコーディングによって、読める読めないがあるのでそこは注意して確認してください。正常動作しているのに、 早とちりして文字化けしている!なんて大騒ぎしないようにしてくださいね(笑)