SMTP を使ってメールを送信

python で SMTP 認証を行ってメールを送信する - forest book を見て、gawk の /inet を介して SMTP でメールを送信するスクリプトを組んでみました。 最近の迷惑メールを防止する意味で多用されている SMTP 認証を使うものではありません。 したがって、ここではローカルのメールサーバーから自分のメールアドレスに送付してみます。

#! /usr/local/bin/gawk -f
# smtp_send.awk
# SMTP でメールを送信する
# usage: gawk -f smtp_send.awk from_address to_address file

BEGIN {
    # 各引数の設定
    from_address = ARGV[1];
    to_address   = ARGV[2];
    mail_file    = ARGV[3];
    email_host   = "localhost";

    # hostname の取得
    hostname_cmd = "/bin/hostname";
    hostname_cmd | getline hostname;
    close(hostname_cmd);

    smtp_service = "/inet/tcp/0/" email_host "/25";
    RS = ORS = "\r\n"

    print "helo " email_host            |& smtp_service;
    print "==> helo " email_host;
    smtp_service                        |& getline;
    print "mail from: " from_address    |& smtp_service;
    print "==> mail from: " from_address;
    smtp_service                        |& getline;
    print "rcpt to: " to_address        |& smtp_service;
    print "==> rcpt to: " to_address;
    smtp_service                        |& getline;
    print "data"                        |& smtp_service;
    print "==> data";

    while (getline < mail_file > 0) {
        print $0                        |& smtp_service;
        print "==> " $0;
    }
    close(mail_file);

    print "."                           |& smtp_service;
    print "==> .";
    print "quit"                        |& smtp_service;
    print "==> quit";
    close(smtp_service);
}

プログラムは他の /inet を用いているプログラムよりも簡単に書けてしまいました。 ここでは以下のようなメール本文を書いたファイルを用意しました。

$ cat mail.txt
From: hi_saito
Subject: test mail

This is a test mail for gawk.

実行してみます。

$ gawk -f smtp_send.awk hi_saito@yk.rim.or.jp hi_saito@yk.rim.or.jp mail.txt
==> helo localhost
==> mail from: hi_saito@yk.rim.or.jp
==> rcpt to: hi_saito@yk.rim.or.jp
==> data
==> From: hi_saito
Subject: test mail

This is a test mail for gawk.

==> .
==> quit

DoukakuAWK_177.png

さて、本当に送付できているかを確認します。 個人的に一度 gmail に集約していますので、gmail を見てみますが、無事に送付されていることが分かります。

もっとも awk を使ってメールを出す必要がある場合があるかと言われると、滅多にないと思いますが、SMTP のやりとりを理解しておくと便利です。 telnet コマンドを使った送信方法がtelnetでメール送信に書かれていますし、gawk を使った POP3 での受信はEmail - TCP/IP Internetworking With gawk' に書かれていますので、参考にしてみてください。

tag_gawk.pngtag_gawk.png