島谷的舞録゛のミラーブログです。
マジカルバナナ 碁楽苑 大広間 検討室控えの間 級位者ハッスル道場 手談の広場 石葉活用の広場  
sendmailで悪戦苦闘
 テキスト碁盤を使ってメール碁をするとメールソフトの設定によっては碁盤が崩れて表示されて用を足さない。
 棋譜データをメッセージに貼り込んでメール交換をすればいいのだが棋譜ソフトが必要だ。
 メールのやりとりやホームページを見ることはできるがPCの操作は苦手だという人には棋譜ソフトのダウンロードやインストールはハードルが高すぎる。
 そこで棋譜ソフトがなくてもメール碁ができるようにめんさんの棋譜をメールで送信するツールや通りすがりさんから教えていただいた碁盤付きコメント作成ツールをアレンジしてメール碁支援ツールを作ってみた。
 ドシロウトが作るのだから動くまでにも半日費やしたが動いてからが大変だ。
 なんと!メッセージが文字化けしてしまう。
 「sendmail 文字化け」をキーワードにグー検し対策記事を頼りに試行錯誤を重ねても直らない。
 1日費やしてふと気がついた。めんさんの棋譜をメールで送信するツールは文字化けしない。
 ということはsendmailを使ったソースが文字化けの犯人ではなくjavascript内のformから送信したのがいけなかったのだ。
 formをjavascriptから外に出し試行錯誤を重ねて文字化けしないようにすることができた。 しかし、このツールでは自分宛にBCCできないから送信メールの確認ができない。
 そこでsendmail.cgiの
$M_name = $QUERY{'name'};
$M_from = $QUERY{'from'};
$M_subject = $QUERY{'subject'};
$M_to = $QUERY{'mail'};
$M_message = $QUERY{'body'};
$M_message = "【送信者】 $M_name\n ================= \n$M_message";
main::sdmail($sendmail,$M_to,$M_name,$M_from,$M_subject,$M_message);
にfromアドレスをbccアドレスにしようと思い
$M_name = $QUERY{'name'};
$M_from = $QUERY{'from'};
$M_subject = $QUERY{'subject'};
$M_to = $QUERY{'mail'};
$M_bcc = "$M_to,$M_from";
$M_message = $QUERY{'body'};
$M_message = "【送信者】 $M_name\n ================= \n$M_message";
main::sdmail($sendmail,$M_to,$M_name,$M_from,$M_subject,$M_message,$M_bcc);
 しかし、これでは全然機能しない。
 とりあえず
$M_name = $QUERY{'name'};
$M_from = $QUERY{'from'};
$M_subject = $QUERY{'subject'};
$M_to = $QUERY{'mail'};
$M_to = "$M_to,$M_from";
$M_message = $QUERY{'body'};
$M_message = "【送信者】 $M_name\n ================= \n$M_message";
main::sdmail($sendmail,$M_to,$M_name,$M_from,$M_subject,$M_message);
としてみた。
 これで送信先に自分のアドレスが追加され送信メールを確認することができるようになったがToに自分のアドレスが加わるのはなんだかなぁという気分だ。
 senmailにBCCを加える方法はないものだろうか。「senmail BCC」でグー検しても役に立つ情報が得られない。
 どなたか教えていただければ幸いです。

#!/usr/bin/perl

require './pack.pl';

# sendmailのパス
$sendmail = '/usr/sbin/sendmail';

# 分かりやすいように、個々の変数にコピーします
$M_name = '$name'; #名前
$M_from = '$from'; #送信元アドレス
$M_subject = '$subject';#タイトル
$M_message = '$body'; #本文
$M_to = '$mail';#送信先アドレス

if($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); }
else { $QUERY_DATA = $ENV{'QUERY_STRING'}; }

@pairs = split(/&/,$QUERY_DATA);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$QUERY{$name} = $value;
}
$M_name = $QUERY{'name'};
$M_from = $QUERY{'from'};
$M_subject = $QUERY{'subject'};
$M_to = $QUERY{'mail'};
$M_to = "$M_to,$M_from";
$M_message = $QUERY{'body'};
$M_message = "【送信者】 $M_name\n ================ \n$M_message";

main::sdmail($sendmail,$M_to,$M_name,$M_from,$M_subject,$M_message);

print "Content-type: text/html\n\n";
print "<div style='font-size:30px; font-weight:bold; line-height:60px; background:#ddfdbd;' align=center margin-top:100px;><hr><p>";
print "送信成功";
print "<p><input type=button onClick=location.replace('../hogehoge.html') value='閉じる'>";
print "<p><input type=button onClick=window.open('http://honyarara.html/','_top') value='戻る'>";
print "</div><hr>";
exit;

sub error {
print "Content-type: text/html\n\n";
print "$_[0]";
exit;
}

package main;
sub sdmail {

require './jcode.pl';

($sendmail,$to,$name,$from,$subject,$message) = @_ ;

#$sendmail #sendmailのパス
#$name #名前
#$from #送信元アドレス
#$subject #タイトル
#$message #本文
#$to #送信先アドレス

#文字コードをJISに変換する
&jcode'convert(*subject, 'jis');
&jcode'convert(*message, 'jis');

unless (-e $sendmail) { &error("sendmailのパスが不正です。"); exit; }

# sendmailをパイプで書き込みオープンします
open(MAIL, "| $sendmail -t") || &error("送信失敗");

# メールを送る

print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "$message\n";

# パイプを閉じる
close (MAIL);

}

1;


この記事に対するコメント

はじめまして。囲碁好きなPerlプログラマーです。
sendmail でBCCにメールを送る場合、オプションに -t をつけるといいです。

ソースが全文出ていなかったので、どこにどのようにつければいいかアドバイスできないのですが、これがヒントになればよいと思います。

おそらく、$sendmail に '-t' が追記されるイメージで、さらに main::sendmail で6番目の引数からBCCが渡ってくるのを処理するコードを追記すればよいと思います。
【2008/07/03 10:56】 URL | junichiro #mQop/nM. [ 編集]


junichiroさん、アドバイスありがとうございます。

$sendmail = '/usr/sbin/sendmail';

$sendmail = '/usr/sbin/sendmail -t
とし
main::sdmail($sendmail,$M_to,$M_name,$M_from,$M_subject,$M_message,-t$M_bcc);
とすればよろしいのでしょうか。
【2008/07/03 11:13】 URL | 島谷 #9L.cY0cg [ 編集]


senmail.cgiのソース全文を本記事の追記に記載しました。
【2008/07/03 11:19】 URL | 島谷 #9L.cY0cg [ 編集]


ええ、方向性はあっています。
$sendmail = '/usr/sbin/sendmail';
$sendmail = '/usr/sbin/sendmail -t';

ここまではOK(かもしれません)。
「かもしれません」というのは、実は pack.pl の中身を見てみないことにはなんとも言えないからです。
pack.pl の中に sub sdmail { ... という部分があると思いますので、その中身をちょっと修正しなければなりません。そこだけでも掲載して頂ければ、アドバイスだけではなく、完全な修正方法も提示できると思います。

【2008/07/03 22:33】 URL | junichiro #mQop/nM. [ 編集]


junichiroさん、おはようございます。
 アドバイスありがとうざいます。
 pack.plが影響するとは全然知りませんでした。(ドシロウトのアホですね)
 sub sdmail{ は複数行にわたっているので記事の追記のところに記入しました。
 おんぶにだっこで恐縮ですがよろしくお願いします。
【2008/07/04 04:06】 URL | 島谷 #9L.cY0cg [ 編集]


$sendmail = '/usr/sbin/sendmail';
ここはもとのままで良かったです。

次にsdmailの中身を修正します。

■6行目
($sendmail,$to,$name,$from,$subject,$message) = @_ ;

($sendmail,$to,$name,$from,$subject,$message,$bcc) = @_ ;

■26行目と27行目の間に下記の1行を挿入
print MAIL "Bcc: $bccn";

この時点で一度動くことを確認してください。(BCCにはまだメールが送られません)
この修正で、pack.pl の sdmail という関数が6番目の引数のBCCを解釈できるようになりました。

その後にsendmail.cgi に対して、最初に島谷さんがやった修正をしてみてください。

下記の部分と
$M_bcc = "$M_to,$M_from";

下記の部分ですね。
main::sdmail($sendmail,$M_to,$M_name,$M_from,$M_subject,$M_message,$M_bcc);

今手元に動作環境がないので、私の方で確認はできていませんが、これで動くようになると思います。
【2008/07/04 10:35】 URL | junichiro #mQop/nM. [ 編集]


junichiroさん、アドバイスありがとうざいます。
 おかげさまでBCC送信ができるようになりました。♪└|∵|┐♪└|∵|┘♪┌|∵|┘♪

 好奇心で$M_bcc="$M_to,$M_from";ではなく$M_bcc="$M_from"にして試したところサーバーエラーになりました。
 スクリプトの挙動は私には不可解です。

 お忙しいところをご丁寧に教えていただき心から感謝します。
 これからもよろしくお願いいたします。
【2008/07/04 11:06】 URL | 島谷 #9L.cY0cg [ 編集]


おめでとうございます!

ただ、$M_bcc="$M_from";にしても動くはずなんですけどね。
セミコロンをつけ忘れてしまっていたりとか...

何はともあれ、いま動いているのであればそれで良いと思います。
【2008/07/07 10:52】 URL | junichiro #mQop/nM. [ 編集]


 セミコロンはちゃんとつけたのです。コロンではありません。^^
 アホな癖に好奇心だけは旺盛なので$_fromのところに直接アドレスを記入してもエラーになりました。私にとっては謎だらけです。
 目的を達成できたので心から喜んでいます。
 junichiroさん、本当にありがとうございました。
【2008/07/07 11:04】 URL | 島谷 #9L.cY0cg [ 編集]

この記事に対するコメントの投稿 (要cookie)










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


この記事に対するトラックバック
トラックバックURL
http://shimatani.blog113.fc2.com/tb.php/464-ed2cd6cf
この記事にトラックバックする(FC2ブログユーザー)

カテゴリー

最近のトラックバック

最近のコメント

最近の記事

リンク

ブログ コミュニティ





月別アーカイブ

カレンダー

07 | 2008/08 | 09
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

ブログ検索

By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ