E-mailに即座に返信するシステム

E-mailで課題を提出する科目があって、それで今日提出のためE-mailを送った。

そのE-mailアドレスは受信したら自動返信が返ってくると書いてあった。

確かに送るとたちまち自動返信が返ってきた。これはいい仕組みだ。


この仕組みをつけた教員曰く、E-mailを送ったが到着していないことで過去にトラブルになったことがあるようで、

そのようなトラブルを防ぐためにそういう仕組みを用意したらしい。

確かにE-mailはその仕組み上、いつ先方に到着するかわからない。

以前話題にしたことがあるが、Postfixの標準設定では送信失敗まで5日間かかることになっている。

(参考記事 : 粘るPostfixに水やりしてあげる )

この記事では1時間にわたって再試行を繰り返しても送れなかったら、送信失敗として返送するようにしたと書いた。

この標準値は現在のE-mailの印象からするとあまりに長い気がするが、もともとE-mailはバケツリレーでやっていたという経緯がある。

そういうことを考えると5日ぐらいたいしたことないわ、と考えたのかも知れない。

他にもいろいろE-mailが到着するかわからない理由はあるのだが、こういうことを知っておかなければならない。


自動返信というのは個人とのやりとりにおいてはあったほうがよい仕組みかもしれない。

そういう仕組みを自分のメールサーバーに付けてみた。

まずPerlで自動返信するスクリプトを書く。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use MIME::Parser;
use Mail::Sendmail;
my $parser=MIME::Parser->new;
$parser->output_dir('/tmp');
my $mail=$parser->parse(*STDIN);
my %params=(
  'Smtp'        => 'localhost',
  'Content-Type'=> 'text/plain; charset=ISO-2022-JP',
  'From'        => 'AutoReply <autoreply@example.com>',
  'To'          => $mail->head->get('From'),
  'Subject'     => '[AutoReply]'.$mail->head->get('Subject'),
  'Message'     => encode('iso-2022-jp',"受け取りました\n(このメールは自動返信です)"),
  'Content-Transfer-Encoding' => '7bit',
);
sendmail(%params) or die $Mail::Sendmail::error;

MIME::Parserを届いたE-mailの解析に使い、(参考記事 : メールに反応するTwitterのBotさん)

Mail::SendMailを自動返信のメールの送信に使う。(参考記事 : 一人一人に年賀メールを送りましょう)

FromのE-mailアドレスに[AutoReply]を付加したSubjectのE-mailを送るだけ。わりに簡単。

これを/etc/aliasに登録する。

autoreply: hidemaro,"| /home/hidemaro/autoreply.pl"

これで autoreplyに送ったメールはこのスクリプトとユーザーに転送され、スクリプトでは自動的に応答して返信される。


ところでこう書いた後に気になったのだが、Subjectが日本語だったらどうなるのだろう?

実際に返信されてきたE-mailをみたら、ちゃんと [AutoReply]てすと とちゃんと頭に付加できている。

けどメールのソースコードを見てみるとちょっと不思議なことになっている。

Subject: [AutoReply]=?ISO-2022-JP?B?GyRCJEYkOSRIGyhC?=

普通は1文字でも日本語の文字が入れば、全部ISO-2022-JPでエンコードされるのだが、これは[AutoReply]の部分はそのままASCIIで書かれている。

届いたE-mailのSubjectはISO-2022-JPでエンコードされていたのだが、それをひっぺがして頭に[AutoReply]と付けただけらしい。

えらいいい加減な話だが、特にこれで問題ない。よく考えてみればFromやToに非ASCII文字が来るときは、

To: =?ISO-2022-JP?B?GyRCJEYkOSRIGyhC?= <test@example.com>

のようにアドレス部はASCIIのまま残すよね。

付加したい文字列が非ASCIIなら、

  'Subject'     => encode('MIME-Header-ISO_2022_JP',"[自動返信]").$mail->head->get('Subject'),

のように書けば問題なし。


まぁこの教員がどういう仕組みをつかってるのかようわからんけど、同じようなことしてるんじゃないかな。

わりに簡単な仕組みだし。

ただまぁ、これ導入するには自分のメールサーバーいるからそれが一番大きなハードルやわな。