e日記風 独り言

#気まぐれ & 気まま & 天邪鬼な老いぼれ技術屋の日々の記録のうち、主に Perl・CGI・HTMLなど Web技術に関連した記事です。
右端上端の同一カテゴリージャンプボタンで同じカテゴリーの他の記事を順番にご覧いただけます。
Access Counter:  総アクセス数

楽 天 の 商 品

-2225- また突然 perl
= 今日は画像なし m(_ _)m =
また突然 狭い話だがメモとして。
実は私のホームページにはこのページの下にもあるコメント機能がある。来訪者が質問やコメントを残せるブログライクな機能だが、これはもともとブログなどが流行る前にこの e日記のページのプログラムを自作したときから、ずっと本家としての矜持から既成のブログを使うことを拒んできたが、当初は私が書き込むだけの一方通行の「日記」形式だったが、その後読んでいただいた方などからのコメント機能だけは簡単に追加できるようにと追加で自作したプログラムだ。ただ私の場合 既存ページも簡単に付け加えられるようにしたこともあり、数百ページにコメント記入欄があるので毎日新規コメントを探すわけにも行かない(実際にはごくたまにしかコメントは頂けていないが(汗);;;)。そこで追加プログラムではコメント記入があった場合、私宛のメールが送信されて知らせるようになっていたが、2年ほど前に使用していたメールサーバーのログイン方法が変更されたときにメールが送信できなくなっていた。それに気づいたのは去年の末で、そこからメール送信機能を見直したが、元々プログラム中のメール送信部分のコードはどこかのサンプルをそのままコピペしたもので、どこが問題なのか切り分けることも簡単ではない。そこで今回徹底的に Perlによるメール送信機能を理解しようと老体に鞭打って悪戦苦闘したのでそのメモ。(せっかくのメモも歳のせいで数ヶ月すればこのメモ自体を忘れてしまう可能性が高いが >> sendmail に関しても過去に書いていた(汗);;;)
その時の Web検索情報などから、私はずっと自分のPCに立てた Localhostサーバーから外部メールサーバー経由でメール送信は出来ないと思っていた(Linuxなら出来るが Windowsでは不可という記事がいくつもあったので)。しかし今回上記のように レンタルサーバーの sendmailでメール送信をしている perl スクリプトが不調になったので、再度 sendmailコマンドの Web検索をしてみた。その中でいくつか Windowsの Localサーバー(Xampp)に関するメール送信の例があったものの、Perlのバージョンの違い、利用するモジュールなどの違いなどそのままでは送信できない、或いは漢字が文字化けして使い物にならない情報が多かった。
現状の私の Localhost環境は以下の通り。
Windows11上の Xamppで Apacheのバージョンは Server version: Apache/2.4.38 (Win64)/PHP 7.3.2 (cli) /perl 5, version 32, subversion 1 (v5.32.1))
この環境で gmail からメール送信するには まず "C:\xampp\php\php.ini" を開いて [mail function] の中に以下の 行頭に ";"の無い2行で変数に値を設定<==phpでメール送信する場合でなければ必要ない。

; For Win32 only.
SMTP=smtp.gmail.com
smtp_port=587
;smtp_port=25

次に"C:\xampp\sendmail\sendmail.ini" を開いて [sendmail]の中の以下の各変数を設定 (php / perl 共に必要)

smtp_server=smtp.gmail.com
smtp_port=587
smtp_ssl=auto
auth_username=username@gmail.com
auth_password=PASSWORD ;2段階認証用パスワード(注)
上記サーバー名やポート番号などは送信用メールサーバーのサポート情報などで調べる。
注:また、Gmail などの 2段階認証プロセスを有効にしているメールサーバーにログインする場合は Chromeや一部メールアプリで使用しているパスワードではログインできない。別途 アプリパスワード発行手続きを行って専用の 16桁のコードを入手してそれを使用する必要がある。
ポイントは MIME::Liteや Net::SMTP などのモジュールを使う場合は cgiコード中で サーバー名・ポート番号・ユーザー名・パスワードを指定できるが、sendmail の場合は sendmail.ini で指定するので、複数のメールサーバー・メールアドレスを使い分けるような使い方には向かない。
以上で環境が整ったので、以下のような cgiスクリプトを実行するとメール送信が可能になる。
#!/usr/bin/perl
# sendmail によるメール送信テスト用 2022/02/25
use strict;
use utf8;
use Encode qw(encode);
my $to = 'to_address@abc.co.jp';
my $from = 'from_address@gmail.com';
my $sbj = '件名:from gmail to abcメール using sendmail';
# 送信環境チェック(Local or Web)
my $hostname = $ENV{'REMOTE_HOST'};
my $addr = $ENV{'REMOTE_ADDR'};
my $hostsvr;
if ($hostname eq ''){
$hostsvr = 'Local';
}else{ # 外部サーバー上で実行中なら
$hostsvr = 'Web';
# 送信に使用するサーバーの sendmail の説明に従って
# 必要な設定をここに追加する。
}
# 日本語メールのディフォルトのISO-2022-JP (JIS)に変換
my $sbj = encode('MIME-Header-ISO_2022_JP', $sbj);
my $header = "To: $to\n";
$header .= "From: $from\n";
$header .= "Subject: $sbj\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: text/plain\; charset=iso-2022-jp\n";
$header .= "Content-Transfer-Encoding: 7bit\n\n"; # ヘッダーの最後 \n\n
my $body = "本文:\n sendmail によるメール送信";
$body = encode('iso-2022-jp', $body);
open(SDML,"| /usr/sbin/sendmail -t -i ") || die 'Cannot run sendmail';
print SDML $header;
print SDML $body;
close(SDML);
print "Content-Type: text/html\n\n"; #ブラウザ表示
print "<h2>sendmail test</h2>";
print " host: $hostname / $hostsvr / $addr<br>$sbj / ";
exit;

上記スクリプトは一応 Local/Web環境で共用可能なようにサーバーの環境変数に応じて分岐して設定値を設定するようにしてある。
最後の 3行はブラウザから実行したときの確認表示用。
2022/02/26


このページ(pdiary_2225.html)にコメント/質問をどうぞ
タイトル(30文字以内)
コメント
お名前(ID:10文字以内)
URL(HP or ブログをお持ちの方)
パスワード*
タイトル・コメント・ID は必須です
このページ(pdiary_2225.html)への今までのコメント/質問
このページにはまだ表示できる投稿がありません。

Back to Page top