September 02, 2015

モバイルサイトへの自動転送 mod_rewrite

ブログを久しぶりにメンテして、モバイル向けサイトを作ってみました。デバイスの画面サイズ等に応じてデザインが調整されるレスポンシブルデザインとなっています。
構築にあたってはこのブログのContent Management SystemであるMovableType 2.661(かなり古いです、2004年!)を変えることなく、jQuery Mobileを使って構築してみました。結構工夫をこらしてみましたが、その話はおいおいしていくことにして、今回の記事ではモバイルサイトへの自動転送の方法を書いてみようと思います。

自動転送を行うにあたってはとても一般的なapache mod_rewriteというURL書き換えモジュールを使っています。僕がやりたかったのは、モバイルデバイスがもしPCサイトへアクセスしていたら、まずはモバイルサイトへ転送し、その後はユーザの指示にまかせるというものです。具体的には、いったんはモバイルサイトが表示されても、その後ユーザの指示でPCサイトへの移動、以降PCサイトにとどまり続けることが可能にしたい、というものです。

しかしネットを調べても、なかなか自分の思った通りの設定がありませんでしたので、以下に僕がした設定(.htaccess)を書いておきたいと思います。(現在モバイルサイトでは下記設定ファイルの情報が表示されないことがあると思います…されるようになりました)

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
# If the visit is neither html nor directory, stop
RewriteCond %{LA-U:REQUEST_URI} !\.html?$ [NC]
RewriteRule ^ - [L]
# If the user is asking for manual control, set a cookie, remove the query, and stop.
RewriteCond %{QUERY_STRING} ^(.*&)?rewrite=([^&]*)&?(.*)$
RewriteRule .* $0?%1%3 [L,R=301,CO=rewrite:%2:.naruoka.org]
# If there's cookie, no redirection ocures.
RewriteCond %{HTTP_COOKIE} (?:^|;)\ *rewrite=[^;]* [NC]
RewriteRule ^ - [L]
# if the browser accepts these mime-types, it's definitely mobile, or pretending to be
#RewriteCond %{HTTP_ACCEPT} "text\/vnd\.wap\.wml|application\/vnd\.wap\.xhtml\+xml" [NC,OR]
# a bunch of user agent tests
RewriteCond %{HTTP_USER_AGENT} "sony|symbian|nokia|samsung|mobile|windows ce|epoc" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "mini|nitro|j2me|midp-|cldc-|netfront|mot|up\.browser|up\.link|audiovox"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "ericsson,|panasonic|philips|sanyo|sharp|sie-"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "portalmmm|blazer|avantgo|danger|palm|series60|palmsource|pocketpc"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "smartphone|rover|ipaq|au-mic,|alcatel|ericy|vodafone\/|wap1\.|wap2\.|iPhone|android"[NC,OR]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
# Note: I've updated the conditions above to skip iPads. However,
# mobile safari still reports itself as 'mobile' and thus needs an explicit opt-out
RewriteCond %{HTTP_USER_AGENT} !iPad [NC]
RewriteRule ^ - [E=USER_DEVICE:mobile]
RewriteCond %{ENV:USER_DEVICE} mobile
RewriteCond %{LA-U:REQUEST_URI} !\.m\.html?$ [NC]
RewriteCond %{LA-U:REQUEST_FILENAME} (.*)\.(html?)$ [NC]
RewriteRule ^ - [E=REDIRECT_TRY:%1.m.%2]
RewriteCond %{ENV:REDIRECT_TRY} -f
RewriteRule ^ %{ENV:REDIRECT_TRY} [R=302]
RewriteRule ^ - [L,CO=rewrite:auto:.naruoka.org]

注目すべきは、1度目だけモバイルデバイスかを判定し、以後はユーザの指示に従えるよう、セッションクッキーを使っているところです。17行目でセッションクッキーの有無の確認、42行目でセッションクッキーの発行をしています。その他、モバイル用ファイルがなかった場合は書き換えを行わないなどの細工も41行目にしてみました。

モバイルサイトも今後よろしくお願いいたします。

21:39 fenrir が投稿 : 固定リンク |
| このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/931

September 11, 2015

E-MailRelayでメール送信中にアドレス確認

最近ボケてきていて、ついうっかりメールを誤送信してしまうことがありました。そんなボケ予防ツールを導入してみました、というお話です。メールアドレスが完全に送信される前にメールアドレスを再チェックする体制を整えました。

体制を整えるにあたって、正規表現で細かくアドレスのルール決めができるツールを探しました。Thunderbirdならそういうアドオンがあるようですが、残念ながらメーラとしてWindows Live Mailにも対応していて欲しいのです。調べてみると世の中にはそういうことをしてくれるアドオンソフトが商用で出回ってはいるようなのですが、できればお金をかけたくありません。

ということでよくよく調べてみると、オープンソースでそういう利用が可能なものがありました。E-MailRelayという、メールサーバとメーラの間に立ってメールを中継してくれるSMTP Proxyで、送信中にフィルタを適用することができるものです。

こんな感じの体制を整えました。問題がありそうなメールアドレスの場合、送信しようとした際に以下のようなダイアログを表示するようにしました。

check_address_dialog.png

またこのダイアログでキャンセルを選ぶと、メーラ側はエラーとなり送信が中止されます。

check_address_when_cancel.png

僕が望む機能は、アドレスの確認をし問題がありそうならダイアログを開くRubyスクリプト( check_address.rb)を、送信中継中に起動するバッチファイル(emailrelay-start.bat)でE-MailRelayを起動することで実現しました。以下では例として、メールサーバがsmtp.forward.comにあり、@example.com以外のメールアドレスについて確認を要求するようにしています。

#!/usr/bin/ruby
# coding: utf-8
require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
address = ARGV[0]
if address !~ /\@example\.com$/ then
case wsh.popup("アドレスを確認、送信する?\r\n" + address , 0, '', 1);
when 2
puts "invalid address."
exit(2)
end
end
puts ""
puts address
exit 1
__END__
start "emailrelay" "C:\Program Files (x86)\emailrelay\emailrelay.exe" --close-stderr --as-proxy smtp.forward.com:25 --immediate --log --pid-file "C:\Program Files (x86)\emailrelay\emailrelay.pid" --port 10025 --remote-clients --spool-dir "C:\Program Files (x86)\emailrelay\spool" --verifier "C:\cygwin\bin\ruby.exe 'C:\Program Files (x86)\emailrelay\check_address.rb'"

E-MailRelayは、アドレスのチェック以外にコンテンツに対してフィルタを適用したりなど、いろいろな使い方ができます。また今回は僕が慣れているということでRuby(さらにcygwinのRuby!)を使いましたが、別にフィルタプログラムはなんでもよく、ネイティブコードの他、Windows Script Host(WSH)が対応しているJavaScript等で記述することもできます。

※その後、一部の環境でエラーがでることがわかりました。スクリプトをアップデートしました。

22:31 fenrir が投稿 : 固定リンク |
| このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/932