Cover Image

ガジェットつれづれ

ガジェットについて

fetchmail+procmailで携帯へメール転送

2026年1月11日

※この記事は2009年10月にブログに上げた記事の書き直しです。
fetchmailで複数のアカウントのメールを携帯に転送する方法について。自分の設定のまとめ。使用しているのはFreeBSDが稼働する自宅サーバ。

fetchmailをデーモン起動し、pop3にて複数サーバからメールを取得し、これをprocmailに渡して、必要なメールだけをフィルタリングして携帯のアドレスに送信している。以下に僕の場合の例として紹介します。

なお、 fetchmail release 6.3.8+RPA+SDPS+SSL+OPIE+NLS / procmail v3.22 です。

インストール

% cd /usr/ports/mail/fetchmail
% make
% make install
% cd /usr/ports/mail/procmail
% make
% make install

基本設定

上記のインストールで、

/usr/local/etc/rc.d/fetchmailが自動生成されていた。これがデーモンでのfetchmailの起動コマンドになる。すなわち

/usr/local/etc/rc.d/fetchmail start          ←起動
/usr/local/etc/rc.d/fetchmail restart          ←再起動
/usr/local/etc/rc.d/fetchmail stop          ←停止

とできる。

fetchmail を root で使うことは推奨されていない。FreeBSD上にあるいずれかのユーザーで使うようにする。

どのユーザーで使用できるようにするかを、利用の有効化と合わせて、/etc/rc.conf に設定する。

ここでは仮に hoge ユーザーで使用することにする。ユーザーはスペース区切りで複数指定できる。なお、ポーリングのインターバル時間(何秒毎にメールサーバに問い合わせるか)も合わせて設定。

↓ /etc/rc.conf に追加する設定の記述

fetchmail_enable="YES"
fetchmail_users="hoge"
fetchmail_polling_interval="180"

転送設定

fetchmail

fetchmailの設定自体は、上記で使うことにしたユーザーのホームディレクトリに .fetchmailrc ファイルを作って行う。つまり、.fetchmailrc があれば自動的に読み込まれ、指定のインターバルで実行される。以下のように設定した。

なお、このファイルのパーミッションは 600 にすること。> chmod 600 .fetchmailrc

↓/home/hoge/.fetchmailrc の設定

set postmaster hoge
set logfile fetchmail.log
defaults
  protocol pop3
  uidl
  no rewrite
  no mimedecode
  keep
  mda "/usr/local/bin/procmail"

poll pop.smallmake.com
  username "hogege"
  password "********"
poll pop3.nifty.com
  username "hogege"
  password "*******"
poll pop.appale.com
  username "ichirohoge"
  password "********"
poll pop.atandta.net
  username "info"
  `password "********"

keep の指定によってサーバーにメールを残している。この場合のポイントは、 udil の指定。これは一度転送したメールは転送しない設定。これがないとインターバル時間毎に、同じメールを何回も送って来てしまう。protocol 指定の直後に指定しておくのがよいようだ。

そして、mda としてprocmail コマンドを指定。これで、メールをprocmailに引き渡せる。

poll 指定のあとに、メールサーバーとアカウント名とパスワードを指定。複数指定できる。

procmail

procmail もホームディレクトリに設定用ファイルを作る。ファイル名 .procmailrc である。

↓/home/hoge/.procmailrc の設定

TRANSTO=hogenokeitai@docomo.ne.jp
:0
* ^Subject:.*TASK-ML.*
/dev/null
:0 E
* ^Subject:.*Report www.appale.com.*
/dev/null
:0 E
* ^To:.*hogege@smallmake.com.*|^To:.*ichiro@smallmake.com.*
!$TRANSTO
:0 E
* ^To:.*hogege@nifty.com.*
!$TRANSTO
:0 E
* ^To:.*info@atandta.net.*
  {
     :0
      * ^From:.*@ atandta.net.*|^From:.*@ atandta-net.com.*
      * ! ^From:.*info@ atandta.net.*
       !$TRANSTO
  }

:0はプログラム構文の IF にあたり、 ":0 E" は ELSE IF にあたると考えてよい。つまり僕の場合、頭から条件に当てはまるものを順に処理し、前の条件で処理しなかったものを次の処理に回わすようにしている。

*で始まる行が条件の内容で一致した場合にその次の行の評価または実行を行う。なお、ここでは全てメールのヘッダを対象に検査している。メール本文を検査したい場合は、上記の指定を:0 Bと記述するらしいが僕の場合は使用していない。また、ELSE IF ではなく、前に評価したものをさらに次の条件でも検査したい場合 :0 cと書くらしいが、これも今回は使わなかった。条件の内容については ORは | で、 NOT は ! で記述できる。また"{" と "}" でくくることで条件をネストできる。

"!" で始まる行がメール転送先の指定。転送先は冒頭でTRANSTOという変数を作って代入し、それを参照している。dev/nullはその条件に当てはまるメールをnullに捨てて、転送しない設定である。転送やnull指定以外にもファイルに書き出したりなどする方法もあるが、今回は使っていない。

だいたい以上のような内容である。FreeBSDが起動したときにfetchmailがデーモンとして自動起動するようにしたいが、それについてはまだやっていない。