|
.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 記事ランキング
本日
月間