まだPostfix設定編を書いてないのに今日ハマったから先にポストする。
ユーザーのメールアドレスが原因のことがあります。
Ruby on Railsでメール配信する仕組みがどうやらdocomoユーザーに多い、一部の記号系メールアドレス(勝手に命名)に弱いもよう。
特に@直前に.があるやつ。
現象
特定のプロジェクトのフォーラム・ニュースなどに投稿ができない。
ユーザーの違うプロジェクトや、新規で作って自分だけ登録したようなプロジェクトは何も問題が無い
こちらの環境
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
Rails 3.2.6
Redmine 2.0.3
状況確認
Redmineログ(/var/lib/redmine/log/production.log)によれば
Started POST "/redmine/boards/1/topics/new" for xxx.xxx.xxx.xxx at 2012-07-06 00:00:00 +0900
Processing by MessagesController#new as HTML
(投稿内容中略)
Rendered mailer/message_posted.text.erb within layouts/mailer (0.7ms)
Completed 500 Internal Server Error in 172ms
NoMethodError (undefined method `encoding' for #<Array:0x000000067dea00>):
app/models/mailer.rb:420:in `deliver_mail'
app/models/message_observer.rb:20:in `after_create'
app/controllers/messages_controller.rb:59:in `new'
Started POST でフォーラムURLへ投稿している行を見つけて結果を見ると、Completed 500 Internal Server Errorって出てたりする。
app/models/mailer.rbを見に行ったら
self.deliver_mail(mail)
としか書いてない。正直、Ruby on Rails初心者には自前かフレームワークのものなのかわからなかったので、安易に
$ cd /var/lib/redmine
$ find . | xargs grep 'deliver_mail'
すると、log/production.logのエラー行と、さっき見たapp/models/mailer.rbしか出てこない。
この時点で、たぶんRedmine独自関数じゃないだろうからすぐ修正するのは無理そうだなぁ、と思い始めていた。
Railsでドットが連続3つ(トリプルドット)以上あるメールアドレスでもActionMailer::Base.deliverを利用してメールを送信する
ぐはっ。
この内容見ながらやるにしても、RubyもRailsも初心者にはきつい。
時間があればやってみたかったんだけど…。
というわけで、他の方法を考える。
材料
相手のメールアドレスは解っている。
記号系メールアドレスをちゃんと送信できるメールサーバがある。
ついでにSSHログイン不可のRedmine初期登録に使ったテンポラリなアカウントがいくつか作ってある
(Redmineはユーザーのメールアドレスが重複できないうえに、通知するときに適当なローカルメールアドレスだと配信が止まってしまううえに、相手のアドレスもわからなかった)
結論:ローカルアカウントに送信後、メールを転送する
#tmp_user_nameはテンポラリなアカウントのユーザ名
$sudo vim /home/tmp_user_name/.forward
user@example.com
.forwardには転送先だけ書いて保存。
詳細は「Postfix メール転送」とかでぐぐる
Redmineのユーザー設定でメールアドレスを書き換えて、フォーラム投稿できるか確認して、メールログで転送されてるか確認して、ついでにニュースに「○○さんへ 急いでたから適当に処理したんで他のアドレスに書き換えてね(変えたら転送解除するから返信してね)」って投稿しておわり。
感想
実は昨日、数万件の中から明らかに不正確なメールアドレス抽出→削除っていうのをやってたときに、
判定大雑把なのでいいからネットで探してきた正規表現使ったら、@前に.のあるアドレスが結構引っかかったので、今日の事象も解決が早かったと思われます。
(名誉のために言うと、削除前には目視確認してから捨てるので大雑把で良かった)
明らかな入力ミス以外は全部docomoだったので、この形式は一般的ではないんだなあ、と思って。
→RFC準拠してないんですね。
実運用中のメールアドレスの仕様はかなり奥深いようで、以前どこかのサイトで「たいてい間違ってるから安易に正規表現乗せないでください」って詳しい人が怒っていたのを目撃したことがあったような…。(´・∀・`)