AirH" PHONE 対応のTips

Menu

メール系, web系, EZweb対応, J-Sky対応,

AirH" PHONE Eメール対応

DDIポケットAirH" PHONEによるメール送受信に対応する為、POP3(APOP)とPOP brefore SMTPの接続をサポートする。
2003/04/03

POP3接続

AirH" PHONEのプロバイダprin.ne.jpに対する接続許可を追加する。

ドメイン(ホスト)名で制御する場合はtcpserverのオプションに-Hが無い事を確認すべし。

pop3.rules
127.:allow,ALLOWPLAIN=""
192.168.199.:allow
=.infoweb.ne.jp:allow # @nifty用
=.prin.ne.jp:allow # AirH" PHONE用
:deny

relay-ctrlのbuild & install

バイナリは/usr/loca/bin/にインストールされる。

[root@portage root]# cd software/relay-ctrl-3.1.1/
[root@portage root]# make
[root@portage root]# ./installer
[root@portage root]# mkdir /var/spool/relay-ctrl
[root@portage root]# mkdir /var/spool/relay-ctrl/allow
[root@portage root]# chmod 700 /var/spool/relay-ctrl
[root@portage root]# chmod 777 /var/spool/relay-ctrl/allow

POP before SMTP用の環境変数は/etc/relay-ctrl/に実体を置いて、/service/pop3d/env//service/smtpd/env/にシンボリックリンクする。

/etc/relay-ctrl/
[root@portage root]# mkdir /etc/relay-ctrl
[root@portage root]# cd /etc/relay-ctrl/
[root@portage relay-ctrl]# echo "/var/spool/relay-ctrl/allow" > RELAY_CTRL_DIR
[root@portage relay-ctrl]# echo "300" > RELAY_CTRL_EXPIRY #有効期限300秒(5分)
[root@portage relay-ctrl]# cd /service/pop3d/env
[root@portage env]# ln -s /etc/relay-ctrl/RELAY_CTRL_DIR RELAY_CTRL_DIR
[root@portage env]# ln -s /etc/relay-ctrl/RELAY_CTRL_EXPIRY RELAY_CTRL_EXPIRY
[root@portage env]# cd /service/smtpd/env
[root@portage env]# ln -s /etc/relay-ctrl/RELAY_CTRL_DIR RELAY_CTRL_DIR
[root@portage env]# ln -s /etc/relay-ctrl/RELAY_CTRL_EXPIRY RELAY_CTRL_EXPIRY

有効期限切れのアドレスキャッシュを削除するcron

crontab -e
*/10 * * * * /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age

起動スクリプト

pop3d,smtpdの起動スクリプトにrelay-ctrlを追加する。

/service/pop3d/run
#!/bin/sh
#  /service/pop3d/run   SMTP-Auth 対応  powerd by qmail-vida
#    Set environment variables IP and HOST.
#    If it is virtual domain, set DOMAINOWNER.
#    If it is necessary, set ALLOWPLAIN, too.
#    If it is not necessay, remove 'recordio' line.
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
exec 2>&1
exec envdir ./env sh -c '
  exec softlimit -d6000000 \
  tcpserver -g nofiles -u sslwrap \
            -vhR -l"$HOST" -c40 -- "$IP" pop3s \
            "$SSLPATH"/bin/sslwrap -port 110 \
            -key "$SSLPATH"/private/serverkey.pem \
            -cert "$SSLPATH"/certs/mail.crt   &

  exec softlimit -d6000000 \
  relay-ctrl-chdir \
  tcpserver -x /etc/tcpserver/pop3.cdb \
            -vhR -l "$HOST" -c40 -- "$IP" pop3 \
  qmail-popup "$HOST" \
  checkpassword \
  relay-ctrl-allow \
  qmail-pop3d Maildir
'
/service/smtpd/run
#!/bin/sh
#  /service/smtpd/run SMTP-Auth 対応    powerd by qmail-vida
#    -x /etc/tcpserver/smtp_auth.cdbでlocalhostをSMTP-Auth対象外とする
#    Set environment variables IP and HOST.
#    If it is virtual domain, set DOMAINOWNER.
#    If it is necessary, set ALLOWPLAIN, FORCEAUTH and TEMPRELAYCLIENT, too.
#    If it is not necessary, remove 'recordio' line.
#  recordio fixcrio \
PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin:
exec 2>&1
exec envdir ./env sh -c '
  exec softlimit -d6000000 \
  tcpserver -g nofiles -u sslwrap \
            -vhR -l"$HOST" -c40 -- "$IP" smtps \
            "$SSLPATH"/bin/sslwrap -port 25 \
            -key "$SSLPATH"/private/serverkey.pem \
            -cert "$SSLPATH"/certs/mail.crt   &

  exec softlimit -d6000000 \
  relay-ctrl-chdir \
  tcpserver -x /etc/tcpserver/smtp_auth.cdb \
            -vhR -l"$HOST" -c40 -- "$IP" smtp \
  rblsmtpd -r relays.ordb.org \
  qmail-smtpup "$HOST" \
  checkpassword \
  relay-ctrl-check \
  qmail-smtpd
'

制限

2003.4.3現在、SSLWrap(POP3S)経由での認証では Source IP が 127.0.0.1 になってしまうので、POP before SMTPによるRELAY送信が許可されない。つまりPOP3Sで受信する時はSMTP-Authでなければ送信できないので、SMTP-Authによる送信ができない環境ではPOP3/APOPで受信しなければならない。

参照
relay-ctrlhttp://untroubled.org/relay-ctrl/
POP Before SMTPの導入-Qmail編http://www.itmedia.co.jp/help/howto/security/special11/

AirH" PHONE webアクセス対応

携帯端末によるトップページに対するアクセスを、ブラウザ環境変数のUSER_AGENTで識別して適宜リダイレクトする。
2003/04/14

apacheの設定変更

何はともあれpublic_htmlでCGIが実行できるようにhttpd.confを変更

/etc/httpd/conf/httpd.conf
#
# This setting for user home folder by YANO
#
<Directory "/home/*/public_html/">
    AllowOverride None
    Options +ExecCGI
    Order allow,deny
    Allow from all
</Directory>

#
# DirectoryIndex: Name of the file or files to use as a pre-written HTML
# directory index.  Separate multiple entries with spaces.
#
<IfModule mod_dir.c>
    DirectoryIndex index.cgi index.shtml index.html index.htm
</IfModule>

リダイレクトCGI

HTTP Location:を出力し、端末毎に適切なHTMLにリダイレクトさせる。2003/08/24版

~yano/index.cgi
#!/usr/local/bin/perl
#
# USER_AGENT判定によるリダイレクト
#
#======================

## 環境変数の取得
$UA = $ENV{'HTTP_USER_AGENT'};
$SN = $ENV{'SERVER_NAME'};
$RU = $ENV{'REQUEST_URI'};

## default用設定
$path_default="index.html";

## i-mode用設定
$ua_imode="DoCoMo";
$path_imode="i/";

## J-Phone用設定
$ua_jphone="J-PHONE";
$path_jphone="j/";

## EZweb用設定
$ua_ezweb="UP\.Browser";
$path_ezweb="ez/";

## AirH-PHONE用設定
$ua_airh="DDIPOCKET";
$path_airh="airh/";

#======================

$home_dir="";
$rix = rindex($RU, "/");
if ( 0 < $rix ){
  $home_dir = substr($RU,1,$rix-1); # rootの '/' を除く
}
$uri_base="http://$SN/$home_dir";
$new_uri="";

## 携帯用の判定 ("/i"はignore case)
if ($UA=~ /$ua_imode/i) { $new_uri = "$uri_base/$path_imode"; }
elsif ($UA=~ /$ua_airh/i) { $new_uri = "$uri_base/$path_airh"; }
elsif ($UA =~ /$ua_jphone/i) { $new_uri = "$uri_base/$path_jphone"; }
elsif ($UA =~ /$ua_ezweb/i) { $new_uri = "$uri_base/$path_ezweb"; }

## 一致しない時はパソコン用
if ( $new_uri eq "" ) { $new_uri="$uri_base/$path_default"; }

## HTTP Location:出力
&redirect;
exit;

#======================

sub redirect {
  print "Location: $new_uri\n\n";
}
exit;

おまけ:ブラウザ環境変数の取得&メール送信

~yano/public_html/cgi-bin/getenv.cgi
#!/usr/local/bin/perl
#
# ブラウザ環境変数の出力
#

  $tmpfile = "/tmp/tmpfil.$$";

  $QMAILINJECT = "/var/qmail/bin/qmail-inject -f";
  $MAILTO = "logwatcher";
  $MAILFROM = "getenv.cgi";

# OUT:ワークファイルへの出力
  open(OUT, "> $tmpfile");

  print(OUT "AUTH_TYPE : \"$ENV{'AUTH_TYPE'}\"\n");
  print(OUT "CONTENT_LENGTH : \"$ENV{'CONTENT_LENGTH'}\"\n");
  print(OUT "CONTENT_TYPE : \"$ENV{'CONTENT_TYPE'}\"\n");
  print(OUT "GATEWAY_INTERFACE : \"$ENV{'GATEWAY_INTERFACE'}\"\n");
  print(OUT "HTTP_ACCEPT : \"$ENV{'HTTP_ACCEPT'}\"\n");
  print(OUT "HTTP_FORWARDED : \"$ENV{'HTTP_FORWARDED'}\"\n");
  print(OUT "HTTP_REFERER : \"$ENV{'HTTP_REFERER'}\"\n");
  print(OUT "HTTP_X_FORWARDED_FOR : \"$ENV{'HTTP_X_FORWARDED_FOR'}\"\n");
  print(OUT "\n");
  print(OUT "HTTP_USER_AGENT : \"$ENV{'HTTP_USER_AGENT'}\"\n");
  print(OUT "REMOTE_ADDR : \"$ENV{'REMOTE_ADDR'}\"\n");
  print(OUT "REMOTE_PORT : \"$ENV{'REMOTE_PORT'}\"\n");
  print(OUT "REMOTE_IDENT : \"$ENV{'REMOTE_IDENT'}\"\n");
  print(OUT "REMOTE_USER : \"$ENV{'REMOTE_USER'}\"\n");
  print(OUT "REQUEST_METHOD : \"$ENV{'REQUEST_METHOD'}\"\n");
  print(OUT "REQUEST_URI : \"$ENV{'REQUEST_URI'}\"\n");
  print(OUT "PATH_INFO : \"$ENV{'PATH_INFO'}\"\n");
  print(OUT "PATH_TRANSLATED : \"$ENV{'PATH_TRANSLATED'}\"\n");
  print(OUT "\n");
  print(OUT "QUERY_STRING : \"$ENV{'QUERY_STRING'}\"\n");
  print(OUT "SCRIPT_FILENAME : \"$ENV{'SCRIPT_FILENAME'}\"\n");
  print(OUT "SCRIPT_NAME : \"$ENV{'SCRIPT_NAME'}\"\n");
  print(OUT "\n");
  print(OUT "SERVER_NAME : \"$ENV{'SERVER_NAME'}\"\n");
  print(OUT "SERVER_PORT : \"$ENV{'SERVER_PORT'}\"\n");
  print(OUT "SERVER_PROTOCOL : \"$ENV{'SERVER_PROTOCOL'}\"\n");
  print(OUT "SERVER_SOFTWARE : \"$ENV{'SERVER_SOFTWARE'}\"\n");
  print(OUT "HTTP_HOST : \"$ENV{'HTTP_HOST'}\"\n");
  print(OUT "DOCUMENT_ROOT : \"$ENV{'DOCUMENT_ROOT'}\"\n");
  print(OUT "\n");
  close(OUT);

  print "Content-type: text/html\n\n";
  print "<HTML><HEAD>\n";
  print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=EUC-JP\">\n";
  print "<TITLE>ブラウザ環境変数</TITLE>\n";
  print "</HEAD><BODY>\n";

  print "以下の情報をwebmasterにメール送信しました。ご協力ありがとうございました。m(__)m";
  print "<BR><BR>\n";

  open(QMAIL, "| $QMAILINJECT $MAILTO");
  print(QMAIL "To: $MAILTO\n");
  print(QMAIL "From: $MAILFROM\n");
  print(QMAIL "Subject: HTTP ENVIRONMENT\n\n");

  open(IN, $tmpfile);
  while (<IN>) {
    # ワークファイルからメールへの出力
    print(QMAIL $_);

    # ワークファイルからHTMLへの出力
    s/&/&amp;/g;
    s/\"/&quot;/g;
    s/>/&gt;/g;
    s/</&lt;/g;
    print $_;
    print "<BR>";
  }
  close(IN);
  close(QMAIL);

  print "</BODY></HTML>";

# ワークファイルの削除
  system("/bin/rm -f $tmpfile");

exit;

imode対応

imode対応版作成Perlスクリプト

当初はimode端末もJISコードだけで良いと思っていたのだが、シフトJISしか解さない端末もあるという事がわかったので、EZweb版をそのまま流用。2003/08/24

~yano/bin/mkimode.pl
#!/usr/local/bin/perl
#
# HTMLをJISコードからimode用Shift_JISに変換する
#
# 毎朝4時10分に起動する
# crontab -e
# 10 4 * * * /home/yano/bin/mkimode.pl >/dev/null
#
#======================

$base='~yano/public_html/airh';

foreach $file (<$base/*>) {
  &process($file);
}
exit;

#======================

sub process {
  local(@arg) = @_;
  local($infile);
  local($outfile);
  local($itime);
  local($otime);

  foreach $infile (@arg) {
    # EZweb用のファイル名を作成
    $outfile = $infile;
    $outfile =~ s:/airh/:/i/:;

    # ディレクトリ処理
    if ( -d $infile ) {
      print "[$infile \t-> $outfile]";
      if ( ! -d $outfile ){
        mkdir($outfile, 0755);
        print "*";
      }
      print "\n";

      # ディレクトリ配下を再帰処理
      &process(<$infile/*>);

    # ファイル
    } else {
      print " $infile \t-> $outfile";

      ($itime) = (stat($infile))[9];
      ($otime) = (stat($outfile))[9];

      # 更新の必要あり?
      if ( $otime < $itime ){
        # .htmと.htmlファイル
        if ( $infile =~ /\.html*$/ ) {
          system("sed -e '/charset=/s/ISO-2022-JP/Shift_JIS/' $infile | nkf -Js > $outfile");
          print "*";

        # その他ファイル(jpeg等)
        } else {
          system("cp -p $infile $outfile");
          print "#";
        }
      }
      print "\n";
    }
  }
  return;
}

EZweb対応

EZweb対応版作成Perlスクリプト

EZwebではシフトJISしか解さないという仕様なので、nkfでコード変換してシフトJISのHTMLを作成するスクリプトを作成。Cronで毎日自動更新させる事によって、人間的にはimode版だけメンテすれば良し。

単純なエンコード変換に加えて、METAタグのcharsetもISO-2022-JPからShift_JISに置換する事を忘れずに。

ゴミファイルの削除は宿題だ。2003/04/18

~yano/bin/mkezweb.pl
#!/usr/local/bin/perl
#
# HTMLをJISコードからEZweb用Shift_JISに変換する
#
# 毎朝4時10分に起動する
# crontab -e
# 10 4 * * * /home/yano/bin/mkezweb.pl >/dev/null
#
#======================

$base='~yano/public_html/airh';

foreach $file (<$base/*>) {
  &process($file);
}
exit;

#======================

sub process {
  local(@arg) = @_;
  local($infile);
  local($outfile);
  local($itime);
  local($otime);

  foreach $infile (@arg) {
    # EZweb用のファイル名を作成
    $outfile = $infile;
    $outfile =~ s:/airh/:/ez/:;

    # ディレクトリ処理
    if ( -d $infile ) {
      print "[$infile \t-> $outfile]";
      if ( ! -d $outfile ){
        mkdir($outfile, 0755);
        print "*";
      }
      print "\n";

      # ディレクトリ配下を再帰処理
      &process(<$infile/*>);

    # ファイル
    } else {
      print " $infile \t-> $outfile";

      ($itime) = (stat($infile))[9];
      ($otime) = (stat($outfile))[9];

      # 更新の必要あり?
      if ( $otime < $itime ){
        # .htmと.htmlファイル
        if ( $infile =~ /\.html*$/ ) {
          system("sed -e '/charset=/s/ISO-2022-JP/Shift_JIS/' $infile | nkf -Js > $outfile");
          print "*";

        # その他ファイル(jpeg等)
        } else {
          system("cp -p $infile $outfile");
          print "#";
        }
      }
      print "\n";
    }
  }
  return;
}

J-Sky対応

J-Sky対応版作成Perlスクリプト

EZweb対応に加えて、J-Skyでは画像イメージはImageMagickのconvertコマンドによってPNG形式に一括変換する。
取り敢えずjpegとgifのみ対応。IMGタグのファイル名も拡張子を.pngに置換する事を忘れずに。
ゴミファイルの削除は宿題だ。2003/04/18
pngは128色に明示して減色しないとファイルサイズが大きすぎて表示されない。2003/04/21
結局表示されない画像の方が多かったので、IMGタグは全て削除する事に。2003/05/xx

~yano/bin/mkjsky.pl
#!/usr/local/bin/perl
#
# HTMLをJISコードからJ-Sky用Shift_JISに変換する
# jpeg,gifイメージをpngに変換する…のは止めた。
#
# 毎朝4時10分に起動する
# crontab -e
# 10 4 * * * /home/yano/bin/mkjsky.pl >/dev/null
#
#======================

# 元ファイルのディレクトリ
$base='~yano/public_html/airh';

# convert コマンドによるPNG変換のオプション(128色減色指定)
$conv_opt='-colors 128';

# HTMLを行単位でフィルタリングするawkコマンド
$awk_cmd = "awk -v IGNORECASE=1 '! /<IMG.+SRC=.*\.jpe*g/'";  # <IMG>の行は削除

# HTMLを書換えるsedコマンド
$sed_cmd  = "sed -e '/charset=/s/ISO-2022-JP/Shift_JIS/'";
#$sed_cmd .= " -e '/<IMG/s/\.jpe*g/.png/i'";
#$sed_cmd .= " -e '/<IMG/s/\.gif/.png/i'";
$sed_cmd .= " -e 's:<P>:<BR>:i'";
$sed_cmd .= " -e 's:</P>:<BR>:i'";

foreach $file (<$base/*>) {
  &process($file);
}
exit;

#======================

sub process {
  local(@arg) = @_;
  local($infile);
  local($outfile);
  local($itime);
  local($otime);

  foreach $infile (@arg) {
    # J-Sky用のファイル名を作成
    $outfile = $infile;
    $outfile =~ s:/airh/:/j/:;

    # ディレクトリ処理
    if ( -d $infile ) {
      print "[$infile \t-> $outfile]";
      if ( ! -d $outfile ){
        mkdir($outfile, 0755);
        print "*";
      }
      print "\n";

      # ディレクトリ配下を再帰処理
      &process(<$infile/*>);

    # ファイル
    } else {
      # jpeg,gifファイルはpngに変換…しない。J-Skyでは使わない
#     $outfile =~ s/\.jpe*g$/.png/i;
#     $outfile =~ s/\.gif$/.png/i;
      print " $infile \t-> $outfile";

      ($itime) = (stat($infile))[9];
      ($otime) = (stat($outfile))[9];

      # 更新の必要あり?
      if ( $otime < $itime ){
        # .htmと.htmlファイル
        if ( $infile =~ /\.html*$/ ) {
          system("$awk_cmd $infile | $sed_cmd | nkf -Js > $outfile");
          print "*";

        # 画像ファイルはconvert@ImageMagickにてpngに変換
        } elsif ( $outfile =~ /\.png$/ ) {
          system("convert $conv_opt $infile $outfile");
          print "*";

        # jpegファイルは無視
        } elsif ( $outfile =~ /\.jpe*g$/ ) {
          print "-";

        # その他ファイル
        } else {
          system("cp -p $infile $outfile");
          print "#";
        }
      }
      print "\n";
    }
  }
  return;
}
参照
ImageMagickhttp://www.imagemagick.org/

Tipsに戻る | Topに戻る

Copyright (c) 2003 by YANO
All rights reserved.