物好き者

物好き者が行ったことを載せています。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

smtp認証機能が無い機器からのメール送信に挑戦2

smtp認証機能が無い機器からのメール送信に挑戦1 で、smtp認証機能が無い機器からメールを送信するには、smtp認証処理を追加してくれるソフトなどが必要なことがわかりました。

smtp認証プロキシなどで探したところ、Windows版のソフトはいくつか見つかりましたが、DD-WRTのLinuxで使えるようなものがなかなか見つかりませんでした。

delegateで行う方法が有りましたが、delegateはルーターで使うには大きすぎます。
linux 用、smtp auth proxy などありますでしょうか? - Linux Square
DeleGate SMTP-AUTH Server sample

sshで行う方法などが見つかりましたが、うまく出来ませんでした。
Network Security: Detailed info on Re: smtp proxy that takes in smtp auth?

ssmtpを使うことでGmailを使う方法などが見つかりましたが、ssmtpはデーモンとして使えないコマンドなので、別の機器のメールを自動で処理することは出来ません。
ぽっぺん日記@karashi.org - mail/ssmtp(Gmailでも使ってみた) , できごと

Exim4 を使うことで、SMTP-AUTH による認証を行うことが出来るようですが、DD-WRTでは使えません。
Exim4 のスマートホスト機能でメールを送信する

smtpauthというソフトを使うことでsmtp認証ができるようです。ただ、単独で動作するのではなく、Stunnelからキックする方法です。
Openwrtのパッケージとして、stunnel_4.16-1_mipsel.ipk が有りますが、smtpauthをコンパイルしないといけないので、こちらも面倒です。
smtpauth for UNIX

Gmailを非対応メールソフトで読む方法には、stoneを使う方法もあると書かれています。
ただ、Stoneでメールのプロキシを行う方法が良くわかりませんでした。
Gmailを非対応メールソフトで読む方法

さらに探したところ、smtpproxというperlのソフトが見つかりました。このソフトはsmtpプロキシとして動作しますが、smtp認証処理を追加することが出来るそうです。
smtpprox --- simple efficient SMTP proxy in perl

smtpプロキシを通常のLinuxマシンで試してみました。
smtpprox-1.2.tar.gz をダウンロード・解凍して、フォルダの中のsmtpproxを実行します。
マニュアル を参考に、次のように実行したところ、telnetで受付IP:受付ポートにアクセスすると、送信先IP:送信先ポートのメールサーバーにアクセスできました。
smtpprox 受付IP:受付ポート 送信先IP:送信先ポート

次に、smtp認証対応するようにsmtpproxを変更します。
diffs against smtpprox.  の内容を、smtpproxに追加します。
97,98d96 という行が、smtpproxのファイルでの修正行になります。
< my $username = 'joe_user'; というように、< の行を追加します。

--- 行以下は、変更前の行が始まることを示しています。
> "debugtrace=s" => \$debugtrace) or die $syntax; というように、> の行は、変更前の行がわかるように記載されています。

smtproxを変更後、下記のように $usernameと$passwordに、メールサーバーのユーザー名/パスワードを記載します。
my $username = 'メールサーバーユーザー名';
my $password = 'メールサーバーパスワード';

再度実行したところ、エラーが発生しました。
sh: mmencode: command not found
sh: mmencode: command not found

調べたところ、smtp認証ではユーザー名とパスワードを変換したものを送信しています。
smtpproxでは、下記のようにmmencodeを使って変換します。
$username = `echo -n $username|mmencode`; chomp $username;
$password = `echo -n $password|mmencode`; chomp $password;
しかし、Linuxにmmencodeが無いため、エラーとなっていました。
別のコマンドで変換することも考えたのですが、DD-WRTで使用するときにコマンドがあるとは限りません。
このため、手動で変換した結果をここにはめ込むことにしました。
SMTP Autheticationの導入 を参考に、次のようにして変換して、埋め込みました。
perl -MMIME::Base64 -e 'print encode_base64("メールサーバーユーザ名");'
perl -MMIME::Base64 -e 'print encode_base64("メールサーバーパスワード");'

$username = 変換後ユーザー名
$password = 変換後パスワード

実行したところ、次のエラーが発生しました。
Scalar found where operator expected at ./smtpprox line 118, near "$password"
(Missing semicolon on previous line?)
syntax error at ./smtpprox line 118, near "$password "
BEGIN not safe after errors--compilation aborted at ./smtpprox line 123.

smtpproxを確認したころ、ユーザー名とパスワードの変換後に chomp $username; とchomp $password; が実行されています。
とほほのperl入門(リファレンス編) を見ると、行末の改行コードを削除を削除しているそうです。
このため、次のように変更したところ、問題なく動作しました。
$username = 変換後ユーザー名; chomp $username;
$password = 変換後パスワード; chomp $username;

telnetで受付IP:受付ポートにアクセスすると、送信先IP:送信先ポートのメールサーバーにアクセスでき、メールの送信処理も問題なく行えました。

smtpproxにsmtp認証パッチを適用することで、smtp認証に対応していない機器から、smtp認証のメールサーバーにメールを送信することが出来ます。

スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。