postfixでバーチャルメールアドレスとか

特定のドメインでメールを受け付けてphpを動かす

王道は、

  1. virtual_alias_mapsでアドレスを書き換える
  2. 書き換えたアドレスのaliasを設定しておいて、aliasからプログラム呼び出し

という感じ。


/etc/postfix/main.cf

virtual_alias_maps = regexp:/etc/postfix/virtual_alias_maps
alias_maps = hash:/etc/aliases

/etc/postfix/virtual_alias_maps

/^(.*)\@upload\.exsample\.com$/	upload

/etc/aliases

upload: /usr/bin/php /path/to/upload.php

プログラム呼び出し時の環境変数

aliasからプログラムを呼び出した場合、環境変数に以下の値がセットされる

       SHELL  受信ユーザのログインシェル。
       HOME   受信ユーザのホームディレクトリ。
       USER   裸の(bare)受信者名。
       EXTENSION
              オプションの受信者アドレスの拡張部。
       DOMAIN 受信者アドレスのドメイン部。
       LOG名前
              裸の(bare)受信者名。
       LOCAL  受信者アドレスのローカル部分全体(@ の左側)。
       RECIPIENT
              受信者アドレス全体。
       SENDER 送信者アドレス全体。
http://www.postfix-jp.info/trans-2.3/jhtml/local.8.html


なので、phpを動かした場合、$_SERVER['USER']という風にして受信者名などを取得することができる。

virtualでアドレス書き換えを行った場合のRECIPIENT

上記のように、

/^(.*)\@upload\.exsample\.com$/	upload

こんな感じで書き換えを行なっていた場合に、test@upload.exsample.com宛にメールを送ると、
環境変数RECIPIENTに入る値は、
upload@exsample.com
のように、書き換え後の値が入ってくる。*1


プログラム上で送り先アドレスを見て処理を分岐とかしたい場合、勿論、標準入力*2にはメールの実データが受け渡されてるんで、そっちを分解してやればX-Original-Toに書き換え前のtest@upload.exsample.comが入っているはずなので判断可能だけど…。

書き換え後の宛先は環境変数に入ってるんだから、書き換え前の宛先もさくっと環境変数で取得したりできないものか

というのが本題。*3
で、ほぼ丸一日使って試行錯誤した結果どうにも無理っぽいなぁという雰囲気。

virtualでalias宛に書き換えずに直接virtual_alias_mapsからプログラム起動できないか?

→不可能
どうやら仕様です。

master.cfにpipe追加してtransport_mapsで起動すると良いんじゃないか?

→無理っぽい
確かにこの方法で起動するとRECIPIENTはオリジナルのままなんだけど、存在しないユーザー宛だとUser unknownになってしまった。

http://www.postfix-jp.info/trans-2.3/jhtml/VIRTUAL_README.html#mailing_lists

マニュアルにもしっかり書いていたオチ。

なんかオプションでどうにかならないの?

→無理っぽい
マニュアル読みまくったけどそれっぽいのは無さそう。もしあったら教えてえらい人。

どうにか対処する方法

recipient_delimiterを使う

recipient_delimiterはデフォルトで設定されていないので、main.cfに設定を追加。

recipient_delimiter = +

また、virtual_alias_mapsも書き換える。

/^(.*)\@upload\.exsample\.com$/	upload+$1


これで、例えばtest@upload.exsample.com宛に送ったとすると、

  1. virtualでアドレスをupload+testに変更
  2. ユーザーupload+testは見つからない。recipient_delimiterを設定しないとこの時点でUser knownになる
  3. recipient_delimiterは"+"なので、ユーザーuploadを探すして環境変数EXTENSIONにtestを設定する
  4. aliasにuploadが設定されているので、プログラム呼び出し

って感じになる。


これで、環境変数EXTENSIONに、最初の送信先アドレスが含まれることになるので、わりかしスマートに処理の分岐ができるようになる…と。*4


postfixってマニュアルがしっかりしてるから助かるなぁって話でした。

*1:myoriginの設定がexsample.comの場合

*2:phpだとfile_get_contents(STDIN)とか

*3:そりゃ単にメールデータ分解すればなんでも可能だけど、画像受付用メールアドレスにしたいので下手にphpでメールデータ弄るより前にどうにかしたかったんですよ

*4:それでももっといい方法があるかもしれない。

ソフトバンクでポイント交換

7月11日って何かの日だったような気がするなぁと思ったらiPhone3Gの発売日だったらしい

という訳で、4年前の7月11日にiPhone3Gを買って、2年後の6月7日にiPhone4に機種変した訳ですが、iPhone4機種変時にはポイントを全部使ったんだけど、2年経って7月末でポイントが切れることになりました。


iPhone5が6月だったら機種変にポイント使うところだったんだけど、残念ながら発売しなかったので、1000ポイント余り無駄に消してしまわないためにポイントを使いました。


いろいろ迷った挙句使ったのは、Apple USB Power Adaptor 3 2,667ポイント。

これ、交換ページ見ただけだとわかりづらいですが充電アダプターとUSBケーブルが同梱されています。
どう考えてもケーブルのみって割にあわないような…。


ところで、Amazonでリンク貼ろうかと思ったら…Amazon、偽物しか売ってないね('ω`)
とりあえず本家はこちら。


ケーブルは100均でも買えるから良いとして、USBのアダプターは純正以外のものを買っても1000円近くするし、あったらあったで非常に便利なので。

100均のUSBドックケーブルについて

詳しくは検索すると出てくるけれど、ダイソーは充電のみ対応でピンアサインがおかしい感じです*1
一応充電できるけど、少し不安。


セリアのは至って普通のピンアサイン。カールケーブルになってるのしか持ってないけど、3種類ぐらいあるみたい。*2


ただ、ダイソーのは内部でドックコネクタのピンは5本入っていて他のは4本。
なので、分解してラインアウトケーブルなどを作るにはダイソーのを使うのがベターです。


あと、DealExtreamで売ってる$1.6の純正風ドックケーブルは3本買ったけど1本は充電できず、1本はしばらくして断線という感じでした。

*1:GNDの位置が変だった気がする。詳しくは忘れた

*2:参考リンク (100円ショップで揃えるiPod,iPhone,iPad用USBケーブル)

iPhone4 5.1.1 JB

iPhone4でiOS 5.1.1にアップデートしたらエラー14が出て少々ハマった件

今更なんだけど、iOS5.1.1にアップデートして、またいつものようにJailbreakした。
私の使ってるiPhoneは初期型の4なので、念のためBB維持しています。


BB維持でのアップデート手順としては、

  1. redsn0wでNOBBなファームウェアを作成(Extras→Custom IPSW)
  2. redsn0wでPwned DFUに入る(Extras→Pwned DFU)
  3. iTunesでNOBBのファームウェアを使って復元してiOSアップデート
  4. redsn0wでJailbreak
  5. iTunesでバックアップから復元

…という感じ。

なんだけど、3のiTunesで復元する時点でエラー14が発生。
どうも調べたらPwned DFUに入れてなかったり、ファームウェアが壊れてるとなるということだったので、iREB使ったり、ファームウェア作りなおしたり試した結果、原因は、

9B208のファームウェアを使うとエラー

という事でした。
9B206から作成したファームウェアで無事アップデート成功。


iPhone4の最新は9B208で、redsn0wも9B208に対応してるはずなんだけどな…。
SHSHも5.1.1r1を取得してるんだけど。
もしかすると、ロットによっては9B208だとうまくいかないって可能性があるのかも。

ところで、iPhoneChromeの続き

iPhoneChrome、すごく使い勝手が良くて気に入ってたんだけど…。


Gmailアカウントと同期して、ブックマークの同期をPCとしていたんだけど、
PCのChrome側で、ブックマークを削除したり移動したりして、Chromeを起動し直すと、削除したブックマークが勝手に復活したり、並び順が崩れたりする問題が('ω`)
ダッシュボードから同期を解除すれば直るんだけど、同期しだすとまたなる。


完全な解決法はまだ見つからず困ってる。今はとりあえず同期を解除してるけど…、果たして、PC版が悪いのかiPhone版が悪いのかもわからないな、これ。

iPhone版Chrome

以下の記事はJB済みiPhoneでの記事になるので非JB環境と異なる場合があります*1

数日前、待望の?iPhoneChromeがリリースされました。

詳しい特集記事はその辺にあがってると思うので、自分が思うことだけ書いていきます。

中身のブラウザエンジンはMobileSafariそのまま

PC版のChromeSafariと同じブラウザエンジンのWebKitを使っているけれど、Chrome専用にGoogleチューニングされています。
しかし、iPhoneChromeSafariのブラウザエンジンをそのまま使っているとのことです。


個人的には、これもメインで使おうと思った理由のひとつだったりします。
今のスマートフォン版のWEBページは、MobileSafariを標準としている訳で、わざわざスマートフォンでブラウザエンジン違いでブラウジングに問題が出たりしたら面倒くさいですからね。
『MobileSafariそのまま』という事は、私は安心感としてポジティブに捉えてます。

UIはSafariと全然違う

ブラウザエンジンが同じであっても、ChromeのUIはSafariと全然違います。
しばらくは慣れが必要でしたが、慣れると使いやすい…かなぁ、あんまり変わらない気がする。

タブの切替

左右の画面端からフリックすると、開いているタブをすいすいと切り替えられます。
この操作は使っていて気持ちは良いんですが、横スクロールしようとすると誤爆する事もあるので一長一短。

新規タブを開く

右上にあるタブ切り替えボタンか、そのとなりにあるメインメニューを開いてから新規タブを選ぶ、という操作なんですが、左手で持って片手操作しているときには遠いので少々押しづらい。Safariだと右下にあるのでまだ楽。なんかジェスチェがあれば良いんだけど。

ブックマークの表示がアイコン表示

ブックマークは、大きなアイコンで横3×縦3.5ぐらいで表示されてそこから選ぶようになっています。
なんとなくアイコン表示よりリスト表示のほうが一度に沢山表示できるような気がします…が、実はMobileSafariでは一度にリストに表示される件数は8.5件ほど。

なので、9件+ちょっと表示されるChromeのほうが一度に表示される量は多い。


…けれど、使いやすさとなると別かな、と。
これも慣れなのかもしれないけど、私はリスト表示のほうが使いやすいと思っています。
というのも、やっぱり左手片手操作だからなのかな。右上が微妙に遠い。


ただ、favicon対応してるのは凄く良いので、今後小さいfavicon付きリスト表示に対応しないかなぁと期待してます。

APPアイコンがダサい

UI関係ないけど、ホーム画面でのAPPアイコンが凄くいまいちだと思うのは私だけでしょうか。
単にChromeロゴを小さめに中央に表示してるだけなので、Chromeのアイコンだけ他のAPPより小さく見えちゃうんですよね…。

とりあえずChromeをメインブラウザで使うことにしました

そんな訳でネガティブなことばかり書きましたが、メインブラウザをChromeにしました。

Googleアカウントを使ってブックマークが同期できる

PCでもChromeをメインブラウザにしているんですが、PCのChromeとMobileSafari間でブックマーク同期出来ないのが結構不便でした。
Mac使ってればその辺の不便は無いんだろうけど、Windowsでそれをしようと思うと、一旦IEを経由して同期とか、サードパーティのブックマーク同期サービスを使うとか、わりかし面倒だったので諦めてました。


iPhoneしか持ってないときにPCで付けたあのブックマークを開きたい、とか、出先でiPhoneにメモったブックマークの記事をPCで読みたいとか、時々だけどあったんですよね。その度にメールとか使ってましたよ。*2

iPhoneのブラウザを完全にChromeに切り替える

JB環境の人は、BrowserChangerというアプリをCydiaからインストールすれば、各アプリからOpen Safari等のボタンを使ったときや、メールに書かれたURLを選択した時などにも、SafariではなくChromeを開くように設定できます。


今のところ、Chromeに備わってる機能は最低限って感じなんですが、Googleのことなんで、今後また機能がどんどん追加されていくんじゃないかなーと思ってます。
なんとなく無理な気はするけど、開発者ツールとか搭載しないかなぁ…。

*1:BrowserChangerのこと以外はJB環境に依存することは書いてないと思うけど

*2:ソーシャルブックマークサービスはなんか馴染めないので使ってない。多分ブラウザからブックマークを開く間にワンアクション必要になるのが嫌なんだと思う

jEditのネタいろいろ

http://www.jedit.org/


もっと評価されるべきエディタ、jEditでハマったのでメモ。
というか、本気でもっと評価されるべきだと思うんですよという意味でも積極的に記事は残さないとね…。

phpparserで保存時に構文チェックが行われない

jEditではいろいろなプラグインを使うことでかなり膨大な数のファイルの編集に対応してます。


構文解析自体は、SideKickという中核になるプラグインがあって、それによって構文チェックが行われて、加えてErrorListというプラグインと連携して、エラーの一覧を表示してくれます。


構文解析の定義もまたプラグインで提供されていて、PHPの場合は、PHPParserというのが担当してくれるわけです。


それで、SideKickが構文解析を行うタイミングというのが、PluginOptions→SideKick→General→Auto parsing Settingsで設定ができ、

  • Parse on buffer switch バッファ((jEditが開いてるファイルのことをjEditではbufferと呼んでる)を切り替えた時
  • Parse on buffer save バッファを保存した時
  • Parse on keystroke キーボード入力時(秒数指定可能)

と、三種類あるんです、が、
Parse on buffer saveを設定しても、何故かPHPファイルを保存したタイミングで構文解析が行われない。
Parse on buffer switchやkeystrokeは正常に動くのだけれど、saveだけ無理。


以前はちゃんと動作していたような気がするんだけど、なんだろうバージョンの関係かとか思って、古いバージョンのプラグインを入れたり、逆に最新に切り替えたりJREを最新にしたり…と、試行錯誤した結果、問題が解決。


SideKickのParse on buffer saveは、SideKickタブを表示している状態で無いと動作しない
…と('ω`)


switchとかkeydtrokeはSideKickを表示していなくても動作するし、PHP ParserにLoad plugin on startupとかって項目もあるから、まさか表示しないと動かないとは思いもしなかった…。

5.0pre1がリリースされてた

4.3の頃はずっとpreが外れなかったけれど、ここのところ活発で嬉しい限り。

5.0では結構変更点があるっぽいけど、気付いたところではユーザーごとの保存フォルダが、
4.xでは
C:\Users\\.jEdit
だったのが、
C:\Users\\AppData\Roaming\jEdit
に変更になってる。順当といえば順当。

後は最初からメニューが日本語化されてたり、他にもタスクトレイに格納する機能(前からあったかもしれないけど)とか、個人的には嬉しい。

2012年04月13日のツイート

2012年04月03日のツイート