.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点だ。

  1. フォームのポスト先がsendmail.aspxであること
  2. 規定のフォーム要素として、_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クラスを経由して電子メールとして送信される。End of Article

カテゴリ:Webフォーム 処理対象:メール
使用キーワード:<httpHandlers>要素
関連TIPS:[ASP.NET]アプリケーションにログ参照のユーティリティを追加するには?
関連TIPS:[ASP.NET]特定の拡張子に対するアクセスを制限するには?
関連TIPS:[ASP.NET].htmlや.pdfファイルをフォーム認証やロギングの対象にするには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]アプリケーションにログ参照のユーティリティを追加するには?
[ASP.NET]ASP.NETアプリケーションに独自の拡張子を追加するには?
[ASP.NET]特定の拡張子に対するアクセスを制限するには?
[ASP.NET]動的にJPEG画像を作成するには?
電子メールを送信するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間