|   | 
| 
 .NET TIPS 
[ASP.NET]ユーザーから入力されたデータを任意のあて先にメールするには?
山田 祥寛 
2004/10/15 | 
  | 
 
 | 
   「TIPS:[ASP.NET]アプリケーションにログ参照のユーティリティを追加するには?」では、HTTPハンドラ・クラスを利用して、アプリケーション共通のログ情報を参照するユーティリティ機能を追加した。HTTPハンドラ・クラスを利用することで、アプリケーション内で共通して利用する機能を、1つのクラスに集約できることがお分かりいただけたと思う。
 本稿では、このようなHTTPハンドラ・クラスの機能を利用して、メール送信の機能を実現してみよう。本稿で紹介するMailHandlerクラスを利用すれば、あらかじめ指定されたページにアクセスするだけで、ユーザーから送信されたリクエスト・データを自動的に整形し、任意のあて先にメールを送信できるようになる。
 それではさっそく、具体的なサンプルを眺めていくことにしよう。
1. HTTPハンドラ・クラスを定義する
 HTTPハンドラ・クラスMailHandlerのソース・コードは以下のとおり。
using System; 
using System.IO; 
using System.Text; 
using System.Web; 
using System.Web.Mail; 
 
namespace Wings { 
  public class MailHandler : IHttpHandler { 
    public bool IsReusable { 
      get { 
        return true; 
      } 
    } 
    public void ProcessRequest(HttpContext context) { 
      HttpResponse Response=context.Response; 
      HttpRequest Request=context.Request; 
      // リクエスト・データを基に、メール本文を組み立てる 
      StringBuilder objSb=new StringBuilder(); 
      objSb.Append("■■ASP.NET メール送信サービス■■\r\n"); 
      objSb.Append("---------------------------------------\r\n"); 
      // フォームから入力されたすべてのキーについて 
      // 「[キー名] 値」の形式で出力 
      // ただし、ビューステートを表すキー“_VIEWSTATE”は除外する 
      String[] aryKey=Request.Form.AllKeys; 
      for(int i=0;i<aryKey.GetUpperBound(0);i++){ 
        if(aryKey[i]!="_VIEWSTATE"){ 
          objSb.Append("[" + aryKey[i] + "] " +  
            Request.Form[aryKey[i]] + "\r\n"); 
        } 
      } 
      objSb.Append("---------------------------------------\r\n"); 
      objSb.Append("                Presented By ASP.NET1.1\r\n"); 
      // 送信メールの情報を設定 
      // (上から送信元、送り先、件名、本文、本文形式) 
      MailMessage objMail=new MailMessage(); 
      objMail.From=Request.Form["_name"] + "<" +  
        Request.Form["_email"] + ">"; 
      objMail.To=Request.Form["_to"]; 
      objMail.Subject=Request.Form["_subject"]; 
      objMail.Body=objSb.ToString(); 
      objMail.BodyFormat=MailFormat.Text; 
      // 指定されたSMTPサーバを介してメールを送信 
      SmtpMail.SmtpServer="smtp.xxxxx.ne.jp"; 
      SmtpMail.Send(objMail); 
      // リンク元のページにリダイレクト 
      Response.Redirect(Request.UrlReferrer.ToString()); 
    } 
  } 
}
 | 
 
 
 | 
 
| HTTPハンドラ・クラスMailHandlerのソース・コード(C#:MailHandler.cs) | 
 
Imports Microsoft.VisualBasic 
Imports System 
Imports System.IO 
Imports System.Text 
Imports System.Web 
Imports System.Web.Mail 
 
Namespace Wings 
  Public Class MailHandler : Implements IHttpHandler 
    Public ReadOnly Property IsReusable As Boolean Implements IHttpHandler.IsReusable 
      Get 
        Return True 
      End Get 
    End Property 
    Sub ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest 
      Dim Response As HttpResponse=context.Response 
      Dim Request As HttpRequest=context.Request 
      ' リクエスト・データを基に、メール本文を組み立てる 
      Dim objSb As StringBuilder=New StringBuilder 
      objSb.Append("■■ASP.NET メール送信サービス■■") 
      objSb.Append(Chr(13) & Chr(10)) 
      objSb.Append("-----------------------------------------") 
      objSb.Append(Chr(13) & Chr(10)) 
      ' フォームから入力されたすべてのキーについて 
      ' 「[キー名] 値」の形式で出力 
      ' ただし、ビューステートを表すキー“_VIEWSTATE”は除外する 
      Dim aryKey As String()=Request.Form.AllKeys 
      For i As Integer=0 To aryKey.GetUpperBound(0) 
        If aryKey(i)<>"_VIEWSTATE" Then 
          objSb.Append("[" & aryKey(i) & "] " & _ 
            Request.Form(aryKey(i)) & Chr(13) & Chr(10)) 
        End If 
      Next 
      objSb.Append("-----------------------------------------") 
      objSb.Append(Chr(13) & Chr(10)) 
      objSb.Append("                  Presented By ASP.NET1.1") 
      ' 送信メールの情報を設定 
      ' (上から送信元、送り先、件名、本文、本文形式) 
      Dim objMail As New MailMessage() 
      objMail.From=Request.Form("_name") & "<" & _ 
        Request.Form("_email") & ">" 
      objMail.To=Request.Form("_to") 
      objMail.Subject=Request.Form("_subject") 
      objMail.Body=objSb.ToString() 
      objMail.BodyFormat=MailFormat.Text 
      ' 指定されたSMTPサーバを介してメールを送信 
      SmtpMail.SmtpServer="smtp.xxxxx.ne.jp" 
      SmtpMail.Send(objMail) 
      ' リンク元のページにリダイレクト 
      Response.Redirect(Request.UrlReferrer.ToString()) 
    End Sub 
  End Class 
End Namespace
 | 
 
 
 | 
 
| HTTPハンドラ・クラスMailHandlerのソース・コード(VB.NET:MailHandler.vb) | 
 なお実際の利用に当たっては、コード内でSMTPサーバを指定している部分(SmtpMail.SmtpServerプロパティ)を各環境に応じて書き換えなければならない。
 HTTPハンドラ・クラスは、使用に先立ってコマンドラインからコンパイルを行う必要がある。コンパイルの構文は以下のとおり。
 
// C# 
> csc /t:library MailHandler.cs
 | 
 
' VB.NET 
> vbc /t:library /r:System.dll /r:System.Web.dll MailHandler.vb
 | 
2. HTTPハンドラ・クラスを登録する
 アプリケーション上で上記のHTTPハンドラ・クラスを有効にするには、その設定をあらかじめ構成ファイル(web.config)に追加登録しておく必要がある。
<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
  <system.web> 
    ……中略…… 
    <httpHandlers> 
      <add verb="POST" path="sendmail.aspx" 
        type="Wings.MailHandler,MailHandler" /> 
    </httpHandlers> 
  </system.web> 
</configuration>
 | 
 
 
 | 
 
| HTTPハンドラ・クラスを登録した構成ファイル(web.config) | 
| <httpHandlers>要素配下で利用可能な要素/属性については、「TIPS:[ASP.NET]特定の拡張子に対するアクセスを制限するには?」で詳説しているので、そちらを参照していただきたい。 | 
 以上によって、POST形式でsendmail.aspxが呼び出されると、このWings.MailHandlerクラスが実行されるようになる。
 なお、本稿では拡張子をIIS上に登録する手間を省くために、あえて拡張子を「.aspx」にしているが、(例えば)「.email」のような任意の拡張子を指定することもできる。ただし、ASP.NETがデフォルトで認識できない拡張子を利用するには、まずIIS上で拡張子マッピングを行う必要があるので注意すること(拡張子のマッピングに関する詳細は、「TIPS:[ASP.NET].htmlや.pdfファイルをフォーム認証やロギングの対象にするには?」を参照)。
3. メール送信用のフォームを作成する
 以上でHTTPハンドラ・クラスの設定は完了だ。それではさっそく、sendmail.aspx(MailHandlerクラス)を利用してメール送信を行うためのWebフォームを用意してみよう。MailHandlerクラスを利用する際に注意すべきは、以下の2点だ。
- フォームのポスト先がsendmail.aspxであること
 
- 規定のフォーム要素として、_to(あて先)、_subject(件名)、_email(送付元アドレス)、_name(送信者名)が指定されていること
 
<html> 
<head> 
<title>メール送信サンプル</title> 
</head> 
<body> 
<form method="POST" action="sendmail.aspx"> 
<input type="hidden" name="_to" value="namidon@mbh.nifty.com" /> 
<input type="hidden" name="_subject" value="アンケートフォーム" /> 
<table border="0"> 
<tr> 
  <th align="right">名前:</th> 
  <td><input type="text" name="_name" size="20" /></td> 
</tr><tr> 
  <th align="right">E-Mailアドレス:</th> 
  <td><input type="text" name="_email" size="20" /></td> 
</tr><tr> 
  <th align="right">年齢:</th> 
  <td><input type="text" name="old" size="4" />歳</td> 
</tr><tr> 
  <th align="right">住所:</th> 
  <td><input type="text" name="address" size="50" /></td> 
</tr><tr> 
  <td rowspan="2"><input type="submit" value="送信" /></td> 
</tr> 
</table> 
</form> 
</body> 
</html>
 | 
 
 
 | 
 
| MailHandlerクラスを利用してメール送信を行うためのWebフォーム(mail.aspx) | 
 mail.aspxで必要な情報を入力し、送信を実行する。
 
  | 
 
| mail.aspxからのメール送信 | 
 
| 任意のWebフォーム(この例ではmail.aspx)で必要な情報を入力し、送信を実行すると、sendmail.aspxが実行され、メールが送信される。 | 
 すると、あらかじめMailHandlerクラスで指定したE-Mailアドレスに対して、以下のようなメールが送信されるはずだ。
 
  | 
 
| MailHandlerクラス経由で送信された電子メール | 
 このように、sendmail.aspxに送られたデータは、MailHandlerクラスを経由して電子メールとして送信される。
 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間