perlでsmtpサーバーに接続して送信

何年かぶりに、Perlからメール送信のプログラムを作ってる。

今まではsendmailコマンドをたたいてたけど、昨今の状況だと、適当なサーバーからのsendmailは迷惑メールとして扱われる。

ということで、「差し出し元のEmailアドレス正規のsmtpサーバー」に接続してメール送信を行うことにします。smtp authやらサブミッションポートやらがあるので、
Net::SMTP
を使用。

Authen::SASL
も忘れずにインストール。これが無くてもエラーは出ないが、動作しない。(オイ!)
これで、はまる人多い。(auth – World Wide Walker)

送信ポートの指定も、はまる所のようだ。(G-chan Square – [perl] Net::SMTPでメールを送ろう
本家のドキュメントには書いてないが、実際はポートの指定が出来るようだ。
普通はSMTPサーバーのポートは25番なのですが、CGIの設置はホスティングサーバーを使用して送信する事になると思うので、たいていは25番は不可(OP25B)。
サブミッションポートの587番を指定する。で、サブミッションポートを使うときは、SMTP認証が必須って所も多い。(詳しくは、Emailアドレスの提供元へ。ISPとかGoogleとか・・・。)

 

#!/usr/bin/perl
use Net::SMTP;
my $mailhost = 'smtp.exmple.jp'; # SMTP用のサーバー名
my $mailport = 587; # SMTP用のポート番号。25番のことも多い。
my $mail_username = 'exmple-user'; # メールアカウント
my $mail_password = 'exmple-pass'; # メールのパスワード
my $from_mail = 'from@exmple.jp'; # 送信元のメールアドレス
my $to_mail = 'sendto@exmple.jp'; # 宛先のメールアドレス
my $subject = 'test soushin';
my $message = 'body test mail';
my $header;
$header = "From: $from_mail\n";
$header .= "To: $to_mail\n";
$header .= "Subject: $subject\n";
$header .= "MIME-Version: 1.0"."\n";
$header .= "Content-type: text/plain; charset=ISO-2022-JP"."\n";
$header .= "Content-Transfer-Encoding: 7bit"."\n";
my $smtp = Net::SMTP->new($mailhost, Port => $mailport);
$smtp->auth($mail_username, $mail_password);
$smtp->mail($from_mail);
$smtp->to($to_mail);
$smtp->data();
$smtp->datasend($header);
$smtp->datasend("\n");
$smtp->datasend($message);
$smtp->quit;

/var/spool/mqueueの古いキューを削除

古いキューの削除
find /var/spool/mqueue -type f -a -mtime +30 -print0 | xargs -0 rm -f

外部配送用の起動
sendmail -L sm-mta -bd -q30m

内部配送用の起動
sendmail -L sm-msp-queue -Ac -q30m

 

-bd
Background Daemonで起動します。
-q30m
キューを処理する時間(滞留メールを処理するタイムアウト時間)を指定します。

sendmailのコマンド

■配送テスト
sendmail -bt -C/etc/sendmail.cf

■queueにたまってるかどうかの確認
sendmail -bp

■queueの送信
sendmail -q

■queueの送信(詳細状況をだしながら)
sendmail -q -v

■バッググラウンドで起動
sendmail -L sm-mta -bd -q30m
sendmail -L sm-msp-queue -Ac -q30m

■queueを削除する(あて先不明で配送されないメールを定期的に削除する)
※お試し中です。よい方法があったら教えてください。cronで定期的にすればいいんじゃないかなぁと。
kill `cat /var/run/sendmail.pid`
mv /var/spool/mqueue/* /var/spool/omqueue

sendmail -L sm-mta -bd -q30m
sendmail -L sm-msp-queue -Ac -q30m

sendmail -oQ/var/spool/omqueue -q -v
rm /var/spool/omqueue/*

最初に書いたのは2006年5月25日 

sendmailのインストール

sendmailのインストール

sendmailのホームページ
現在、sendmail.8.12.7.tar.gzが最新です。
(このページは1年ぶりの更新となります。)

ここではFreeBSDにインストールしたときのメモを残します。
FreeBSDは4.7となります。
(一部、違うバージョンのメモも残しています。)

ちなみに、今回から example.net として例を記述している。
このドメインは http://example.net/ をご覧ください。

 

ソースのダウンロード

ソースは ftp://ftp.sendmail.org/pub/sendmail/ からダウンロードできます。
でも今回はココをみてミラーサイトからダウンロードしました。

ソースの展開

ソースの展開はどこでも良いのですが、私は/usr/local/src/にて行っています。

 cd /usr/local/src/
tar xvfz sendmail.8.12.7.tar.gz

コンパイルの前に

■FreeBSD3.5.1以下の方
m4のインストール(バージョンアップ)
FreeBSD3.5.1標準のm4では途中でエラーになります。
pkgからインストールします。

■FreeBSD 4.4以下の方
sendmail.8.12.0になってからいくつか準備が必要になったようです。

suでsmmspのアカウントを作ります。(FreeBSD 4.5ではすでに標準でアカウントがあります。)
vipw
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin

/etc/group
smmsp:*:25:

こんな感じになっています。ここは自身がないので誰か教えて下さい。

コンパイル

後はいつもと同様です。

cd sendmail.8.12.7/sendmail
./Buildcd ../makemap
./Build

インストール

まず、オリジナルのファイルを保存しておく。

cp /usr/sbin/sendmail /usr/sbin/sendmail.org
cp /usr/sbin/makemap /usr/sbin/makemap.org

インストール

cd ../sendmail
./Build install
cd ../makemap
./Build install

sendmail.cf の作成

付属の cf ツールを利用する。

cd ../cf/cf
cp generic-bsd4.4.mc sendmail.mc
ee config.mc

sendmail.mcの編集

必要に応じて追加する。

divert(0)dnl
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl

FEATURE(access_db, `hash -o /etc/mail/access’)dnl
# 外部へメールする場合に必要。

define(`ALIAS_FILE’,`/etc/mail/aliases’)dnl
# 特に記述しなくても動作するが、aliasesファイルを複数設置するときに
#
すぐに設定できるように入れています。「,」で区切って複数記述します。

FEATURE(virtusertable, `hash -o /etc/mail/virtusertable’)dnl
# バーチャルドメイン設定。各ドメイン宛のメールをどのユーザーに集めるか
# 指定できる


FEATURE(`nouucp’,`reject’)dnl
# uucp は使わない。

MAILER(local)dnl
MAILER(smtp)dnl

cfの作成

make sendmail.cf

cfの動作確認

cfは本稼動する前に動作確認をすることが出来る。

# sendmail -bt -f ./sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 root@milkbar.habit.net
3                  input: root @ example . net
96                 input: root < @ example . net >
96               returns: root < @ example . net >
3                returns: root < @ example . net >
0                  input: root < @ example . net >
97                 input: root
3                  input: root
3                returns: root
0                  input: root
0                returns: $# local $: root
97               returns: $# local $: root
0                returns: $# local $: root

localのroot宛になっていることがわかる。

> 3,0 root@habit.net
3                  input: root @ example . net
96                 input: root < @ example . net >
96               returns: root < @ example . net >
3                returns: root < @ example . net >
0                  input: root < @ example . net >
88                 input: < smtp : example . net > . root < @ example . net >
88               returns: $# smtp $@ example . net . $: root < @ example . net >
0                returns: $# smtp $@ example . net . $: root < @ example . net >

同じroot宛だが、smtpを経由してexample.net宛になっている。

テストの終了は ctrl+D

cfインストール

make install-cf

その他の設定

受信するドメインを入れる

ee /etc/mail/local-host-names

aliasesファイルを移動

mv /etc/aliases* /etc/mail

sendmail の起動

sendmailは通常起動されていますので、再起動をします。

cd /etc/mail
make restart

もし終了されていたら、

/usr/sbin/sendmail -bd -q30m

として起動する。

sendmailの起動確認

# telnet localhost smtp
Trying 127.0.0.1…
Connected to localhost.example.net.
Escape character is ‘^]’.
220 example.net ESMTP Sendmail 8.12.0/8.12.0; Fri, 28 Sep 2001 11:19:23 +0900 (JST)

と出るとOKである。
バージョンが正しいかをチェック。
終了は quit を行なう

参考

http://www.imasy.or.jp/~ume/published/sendmail-8.12/

2003/2/23

SMTP認証(SMTP AUTH)

書きかけでした。気づかなかった・・・
まぁ、いつか・・・。

Kerberos 4 ( http://www.pdc.kth.se/kth-krb/) LOGIN認証を使う場合必要

ソースの展開

ソースの展開はどこでも良いのですが、私は/usr/local/src/にて行っています。

 cd /usr/local/src/
tar xvfz sendmail.8.12.2.tar.gz

コンパイルの前に

sendmail.8.12.0になってからいくつか準備が必要になったようです。

suでsmmspのアカウントを作ります。(FreeBSD 4.5ではすでに標準でアカウントがあります。)
vipw
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin

/etc/group
smmsp:*:25:

こんな感じになっています。ここは自身がないので誰か教えて下さい。

m4のインストール(バージョンアップ)
FreeBSD3.5.1標準のm4では途中でエラーになります。
pkgからインストールします。

コンパイル

後はいつもと同様です。

cd sendmail.8.12.0/sendmail
./Buildcd ../makemap
./Build

インストール

まず、オリジナルのファイルを保存しておく。

cp /usr/sbin/sendmail /usr/sbin/sendmail.org
cp /usr/sbin/makemap /usr/sbin/makemap.org

インストール

cd ../sendmail
./Build install
cd ../makemap
./Build install

sendmail.cf の作成

付属の cf ツールを利用する。

cd ../cf/cf
cp generic-bsd4.4.mc sendmail.mc
ee config.mc

sendmail.mcの編集

必要に応じて追加する。

divert(0)dnl
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl

FEATURE(access_db, `hash -o /etc/mail/access’)dnl
# 外部へメールする場合に必要。

define(`ALIAS_FILE’,`/etc/mail/aliases’)dnl
# 特に記述しなくても動作するが、aliasesファイルを複数設置するときに
#
すぐに設定できるように入れています。「,」で区切って複数記述します。

FEATURE(virtusertable, `hash -o /etc/mail/virtusertable’)dnl
# バーチャルドメイン設定。各ドメイン宛のメールをどのユーザーに集めるか
# 指定できる


FEATURE(`nouucp’,`reject’)dnl
# uucp は使わない。

MAILER(local)dnl
MAILER(smtp)dnl

cfの作成

make sendmail.cf

cfの動作確認

cfは本稼動する前に動作確認をすることが出来る。

# sendmail -bt -f ./sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 root@milkbar.habit.net
3                  input: root @ milkbar . habit . net
96                 input: root < @ milkbar . habit . net >
96               returns: root < @ milkbar . habit . net >
3                returns: root < @ milkbar . habit . net >
0                  input: root < @ milkbar . habit . net >
97                 input: root
3                  input: root
3                returns: root
0                  input: root
0                returns: $# local $: root
97               returns: $# local $: root
0                returns: $# local $: root

localのroot宛になっていることがわかる。

> 3,0 root@habit.net
3                  input: root @ habit . net
96                 input: root < @ habit . net >
96               returns: root < @ habit . net >
3                returns: root < @ habit . net >
0                  input: root < @ habit . net >
88                 input: < smtp : habit . net > . root < @ habit . net >
88               returns: $# smtp $@ habit . net . $: root < @ habit . net >
0                returns: $# smtp $@ habit . net . $: root < @ habit . net >

同じroot宛だが、smtpを経由してhabit.net宛になっている。

テストの終了は ctrl+D

cfインストール

make install-cf

その他の設定

受信するドメインを入れる

ee /etc/mail/local-host-names

aliasesファイルを移動

mv /etc/aliases* /etc/mail

sendmail の起動

sendmailは通常起動されていますので、
ps -x
をして
kill プロセス番号
でいったんsendmailを終了させてから以下のコマンドで起動しています。
kill -HUP プロセス番号
では正常に起動しないのです(誰か教えてぇ)

/usr/sbin/sendmail -bd -q30m

sendmailの起動確認

# telnet localhost smtp
Trying 127.0.0.1…
Connected to localhost.mk.habit.net.
Escape character is ‘^]’.
220 milkbar.habit.net ESMTP Sendmail 8.12.0/8.12.0; Fri, 28 Sep 2001 11:19:23 +0900 (JST)

と出るとOKである。
バージョンが正しいかをチェック。
終了は quit を行なう

参考

http://www.imasy.or.jp/~ume/published/sendmail-8.12/

popサーバー

・popサーバー
ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-stable/All/qpopper-2.53.tgz
からダウンロード

パッケージをインストール
# pkg_add qpopper-2.53.tgz
 
inetd.confを編集
# ee /etc/inetd.conf
 
inetdを再起動
# kill -HUP `cat /var/run/inetd.pid`

これで終了。簡単ね。

imapサーバー

今回対象のサーバー

FreeBSD 4.5

ダウンロード

2002/3/13現在の最新版はimap-2001a.tar.Zのようである。
いつもは、ftp://ftp.cac.washington.edu/mail/imap.tar.Z は最新版へリンクされているから、そのままダウンロードするのですが、今回は、リンク先から直接ダウンロードしてみた。

cd /usr/local/src

ftp ftp.cac.washington.edu
cd /mail
get imap-2001a.tar.Z

コンパイルとインストール

展開

tar xvfz imap-2001a.tar.Z
cd imap-2001a

いつもコンパイルの前にやっているのだが、なぜかこのメモに残していなくて、いつも四苦八苦していることがある。
それは、IMAP使用時のデフォルトのフォルダ指定だ。
標準だと、各自のホーム内がIMAPのメールフォルダになってしまい、他のドットファイルと混じってしまう。クライアント側で、フォルダを明示すればいいのだが、サーバー側で、それようのフォルダを用意した方が楽だ。

ee ./src/osdep/unix/env_unix.c

static char *mailsubdir = NIL; /* mail subdirectory name */

static char *mailsubdir = “mail”;/* mail subdirectory name */
と変更する。
(この辺は、バージョンが変わるたびに、変更箇所が頻繁に変わっているような気がするので、ドキュメントを読んでください。)

コンパイル

make bsf

インストールは手動で行なう。

mkdir /usr/local/libexec
cp ipopd/ipop2d ipopd/ipop3d imapd/imapd /usr/local/libexec

設定

/etc/services の確認。(無ければ追加する)

ee /etc/servicespop2 109/tcp
pop3 110/tcp
imap 143/tcp

/etc/inetd.conf の変更

ee /etc/inetd.confpop2 stream tcp nowait root /usr/local/libexec/ipop2d ipop2d
pop3 stream tcp nowait root /usr/local/libexec/ipop3d ipop3d
imap4 stream tcp nowait root /usr/local/libexec/imapd imapd

ちょっと古いOSだと、imap stream .....のようだ。今まで使っていたqpopperは、UW IMAPd 付属の ipop3dを利用することになります。

inetdの再起動

# kill -HUP `cat /var/run/inetd.pid`

moo.誰も教えてくれないんだもんなぁ。って、NTPの所に自分で書いてました。

動作確認

% telnet localhost imap
Trying 127.0.0.1 ...
Connected to localhost.
Escape character is '^]'.
* OK localhost IMAP4rev1 v12.264 server ready

とサーバーから反応があればよい。
終了は logout である。

参考URL

詳しくは以下のURLをご覧ください。
基本的には、自分用に最低限必要な項目をこのページにまとめただけです。

http://www.luice.or.jp/~obata/imap/uw-imapd.htmlhttp://www.nspl.co.jp/Solaris/Mail/imap.html

2002/3/13

sendmail-8.11.1のインストール

sendmail-8.11.1のインストール

このページは古いので、こちらが良いと思う。

最新版はsendmail-8.11.1(2000/11/29)で日本のCFツールも更新されていないようである。
そこで標準添付のcfを使った設定を行う。

ソースの展開

 tar xvfz sendmail.8.11.1.tar.gz

コンパイル

cd sendmail.8.11.1/sendmail
./Buildcd ../makemap
./Build

インストール

まず、オリジナルのファイルを保存しておく。

cp /usr/lib/sendmail /usr/lib/sendmail.org
or
cp /usr/sbin/sendmail /usr/sbin/sendmail.org

cp /usr/sbin/makemap /usr/sbin/makemap.org

インストール

cd ../sendmail
./Build install
cd ../makemap
./Build install

sendmail.cf の作成

WIDE CF は、sendmail-8.9.x 用しかないため、付属の cf ツールを利用する。
CFでは難しい設定でもm4版で出来るそうだ。

cd ../cf/cf
cp generic-bsd4.4.mc config.mc
ee config.mc

config.mcの編集

divert(0)dnl
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl
→受信するドメインを/etc/mail/local-host-nameに記述する。(後述)
FEATURE(`virtusertable’)dnl
→/etc/mail/virtusertable で、各ドメイン宛のメールをどのユーザーに集めるか指定できる(後述)

MAILER(local)dnl
MAILER(smtp)dnl

cfの作成

make config.cf

cfの動作確認

cfは本稼動する前に動作確認をすることが出来る。

# sendmail -bt -f ./sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 root@milkbar.habit.net
3                  input: root @ milkbar . habit . net
96                 input: root < @ milkbar . habit . net >
96               returns: root < @ milkbar . habit . net >
3                returns: root < @ milkbar . habit . net >
0                  input: root < @ milkbar . habit . net >
97                 input: root
3                  input: root
3                returns: root
0                  input: root
0                returns: $# local $: root
97               returns: $# local $: root
0                returns: $# local $: root

localのroot宛になっていることがわかる。

> 3,0 root@habit.net
3                  input: root @ habit . net
96                 input: root < @ habit . net >
96               returns: root < @ habit . net >
3                returns: root < @ habit . net >
0                  input: root < @ habit . net >
88                 input: < smtp : habit . net > . root < @ habit . net >
88               returns: $# smtp $@ habit . net . $: root < @ habit . net >
0                returns: $# smtp $@ habit . net . $: root < @ habit . net >

同じroot宛だが、smtpを経由してhabit.net宛になっている。

テストの終了は ctrl+D

cfの移動

cp config.cf /etc/mail/sendmail.cf

その他の設定

受信するドメインを入れる

ee /etc/mail/local-host-names

aliasesファイルを移動

cp /etc/aliases /etc/mail/aliases
cp /etc/aliases.db /etc/mail/aliases.db

sendmail の起動

/usr/sbin/sendmail -bd -q30m

sendmailの起動確認

# telnet localhost smtp
Trying 127.0.0.1…
Connected to localhost.mk.habit.net.
Escape character is ‘^]’.
220 milkbar.habit.net ESMTP Sendmail 8.11.2/3.7W; Sun, 15 Apr 2001 17:18:21 +0900 (JST)

と出るとOKである。
終了は quit を行なう

 

参考

How to install sendmail-8.11.1

http://akiba.to/note.html

SPAM の現状と対策

sendmailのインストール

sendmailのインストール

sendmailのホームページ
現在、sendmailは8.13.6が最新です。

qmailに移行しようとしましたが、挫折しました。
なにをするにも、パッチパッチって言うのがどうも好きになれません。
速度の点ではやはり遅いようですので、並列処理を出来るように設定ファイルを作りたいと思います。(ここに書けるかは分かりませんが。

FreeBSD4.11への設定です。
今回は、サクラに借りたサーバーに設定を行います。

■ソースのダウンロード

ソースは ftp://ftp.sendmail.org/pub/sendmail/ からダウンロードできます。
でも今回はココをみてミラーサイトからダウンロードしました。

■ソースの展開

ソースの展開はどこでも良いのですが、私は/usr/local/src/にて行っています。

 cd /usr/local/src/
tar xvfz sendmail.8.13.6.tar.gz

■コンパイルの前に

■FreeBSD3.5.1以下の方
m4のインストール(バージョンアップ)
FreeBSD3.5.1標準のm4では途中でエラーになります。
pkgからインストールします。

■FreeBSD 4.4以下の場合
sendmail.8.12.0移行になってからいくつか準備が必要になったようです。

suでsmmspのアカウントを作ります。
vipw
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin

/etc/group
smmsp:*:25:

■FreeBSD 4.5以降

smmspはすでに標準でアカウントがあります。

■コンパイル

後はいつもと同様です。

cd sendmail.8.13.6/sendmail
./Buildcd ../makemap
./Build

■インストール

まず、オリジナルのファイルを保存しておく。

cp /usr/sbin/sendmail /usr/sbin/sendmail.org
cp /usr/sbin/makemap /usr/sbin/makemap.org

インストール

cd ../sendmail
./Build install
cd ../makemap
./Build install

■mcの準備

標準的なmcファイルを準備します。

cd ../cf/cf
cp generic-bsd4.4.mc /etc/mail/freebsd.mc

■freebsd.mcの編集

必要に応じて追加する。

divert(0)dnl
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl

FEATURE(access_db, `hash -o /etc/mail/access’)dnl
# 外部へメールする場合に必要。

define(`ALIAS_FILE’,`/etc/mail/aliases’)dnl
# 特に記述しなくても動作するが、aliasesファイルを複数設置するときに
#
すぐに設定できるように入れています。「,」で区切って複数記述します。

FEATURE(virtusertable, `hash -o /etc/mail/virtusertable’)dnl
# バーチャルドメイン設定。各ドメイン宛のメールをどのユーザーに集めるか
# 指定できる


FEATURE(`nouucp’,`reject’)dnl
# uucp は使わない。

MAILER(local)dnl
MAILER(smtp)dnl

■cfの作成

make sendmail.cf

■cfの動作確認

cfは本稼動する前に動作確認をすることが出来る。
以前書いてたコマンドに間違いがありました。

# sendmail -bt -C ./freebsd.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 root@example.net
3                  input: root @ example . net
96                 input: root < @ example . net >
96               returns: root < @ example . net >
3                returns: root < @ example . net >
0                  input: root < @ example . net >
97                 input: root
3                  input: root
3                returns: root
0                  input: root
0                returns: $# local $: root
97               returns: $# local $: root
0                returns: $# local $: root

localのroot宛になっていることがわかる。

> 3,0 root@example.net
3                  input: root @ example . net
96                 input: root < @ example . net >
96               returns: root < @ example . net >
3                returns: root < @ example . net >
0                  input: root < @ example . net >
88                 input: < smtp : example . net > . root < @ example . net >
88               returns: $# smtp $@ example . net . $: root < @ example . net >
0                returns: $# smtp $@ example . net . $: root < @ example . net >

同じroot宛だが、smtpを経由してexample.net宛になっている。

テストの終了は ctrl+D

■cfインストール

make install-cf

■その他の設定

□受信するドメインを入れる
変更後再起動が必要です。

ee /etc/mail/local-host-names
make restart

□aliasesを変更した場合
再起動は必要ないが、データベースの更新が必要。

ee aliases
newaliases

■sendmail の起動

sendmail -L sm-mta -bd -q30m
sendmail -L sm-msp-queue -Ac -q30m

sendmailは通常起動されていますので、再起動をします。

cd /etc/mail
make restart

もし終了されていたら、

/usr/sbin/sendmail -bd -q30m

として起動する。

■sendmailの起動確認

# telnet localhost smtp
Trying 127.0.0.1…
Connected to localhost.example.net.
Escape character is ‘^]’.
220 example.net ESMTP Sendmail 8.12.0/8.12.0; Fri, 28 Sep 2001 11:19:23 +0900 (JST)

と出るとOKである。
バージョンが正しいかをチェック。
終了は quit を行なう

■参考

□速報sendmail 8.12 (FreeBSD PRESS No.7)
http://www.imasy.or.jp/~ume/published/sendmail-8.12/

初稿:2000/01/20
更新:2003/2/23 sendmail.8.12.7に設定
更新:2006/6/2 sendmail 8.13.6に設定。