CGI-BBS > SO−HO > ショッピングバスケット > Net::SMTPを使用してメールを送信したい。


カレッヂ
カレッヂ


質問者 赤青  投稿日 11/18(月) 10:13:51
お世話になります。
サーバー側でsendmailが使用禁止なため、Net::SMTPでメール送信しようとしていますが文字化けが発生します。
また、私の知識内での変換では『SeverInternalError』が発生してしまいます。
Net::SMTPだけで文字化けせずにメールを送る方法をお教え頂けませんでしょうか。

◆現状

 use Net::SMTP
 $smtp = Net::SMTP->new('ucgimail.mmjp.or.jp');
 $smtp->mail('aaaaa@home.email.ne.jp');
 $smtp->to('bbbbb@home.email.ne.jp');
 $smtp->data();
 $smtp->datasend("From:shinko\n");
 $smtp->datasend("To:ShimpeiKatoh\n");
 $smtp->datasend("Subject:テストメール\n");
 $smtp->datasend("テストです1/5\n");
 $smtp->datasend("テストです2/5\n");
 $smtp->datasend("テストです3/5\n");
 $smtp->datasend("テストです4/5\n");
 $smtp->datasend("テストです5/5\n");
 $smtp->datasend("テストおしまい\n");
 $smtp->dataend();
 $smtp->quit;

 これでメールは届きますがSubjectと本題の1行目が化けてしまいます。


◆問題・質問点

 (1)メールは届きますがSubjectと本題の1行目が化けてしまいます。
 (2)上記に絡んでTypeとEncodingの指定の仕方をお教え下さい。
 (3)BCCを追加したいのですが。
 (4)$smtp->mail, $smtp->to と $smtp->datasend("From...") $smtp->datasend("T0...")の関連がよくわかりません。
 (5)次のように変更すると『ServerInternalError』になってしまいますが...
  $cnv = "テストです1/5"; &jcode'convert(*cnv, 'jis'); $stmp->datasend("$cnv\n");

◆前提条件

 ・言語はperl
 ・Net::SMTPのみで
 ・MIMEは使用しない
 ・sendmailは使用しない
 ・添付ファイルはない

以上、よろしくお願い致します。

プロバイダ参照:http://www.asahi-net.or.jp/homepage/domain/freecgi/index.htm
サーバのOS:UNIXサーバ
パソコンのOS:Win95系
エディタ:秀丸 3.15
FTPソフト:FFFTP 1.84
サーバ移転:していない
改造:していない 改造前不動
CGI習熟度:firsttime

回答者 まさ  [削除]  投稿日 11/18(月) 11:59:52
use Net::SMTP

jcode::convert(\$subj,'jis');
jcode::convert(\$body,'jis');

# オブジェクトの作成
my $SMTP = Net::SMTP->new('ucgimail.mmjp.or.jp');

#ヘッダ部の組み立て
$SMTP->mail($from);
$SMTP->to($to);
$SMTP->cc($cc);
$SMTP->bcc($from);

#データ部の組み立て
$SMTP->data();
$SMTP->datasend("From:$from\n");
$SMTP->datasend("To:$to\n");
$SMTP->datasend("Subject:$subj\n");
$SMTP->datasend("Mime-Version: 1.0\n");
$SMTP->datasend("Content-type: text/plain; charset=ISO-8859-1\n");
$SMTP->datasend("Content-transfer-encoding: 8bit\n");
$SMTP->datasend("Reply-to: foo\@bar.com\n\n");
$SMTP->datasend("$body\n");
$SMTP->dataend();
$SMTP->quit;

これで(1)(2)(3)(5)はOKだと思います。
これでも文字化けが起こるようでしたら、このスクリプトの文字コードをEUCにして
下さい。

(4)ですが、$smtp->mail, $smtp->toはヘッダーです。メールは実際ここに書かれている
アドレスに送信されます。

それに対して$smtp->datasend("From...") $smtp->datasend("T0...")はデータ部です。
ようは表示用です。

質問者 赤青  [削除]  投稿日 11/18(月) 16:56:38
まさ様、早速の回答ありがとうございます。

ご指導の通りやってみましたが、『ServerInternalError』になってしまいます。
内容は以下の通りです。
ccは入れていません。
Reply-toのところは勝手に修正しました。

	$from = 'xxxxx@yyyyy.or.jp';
	$to = 'xxxxx@zzzzz.or.jp';
	$subj = 'メール送信テスト';
	$body = "テストです1行目\nテストです2行目\nテストです3行目\nテストです4行目\nテストです5行目\nおしまい\n";
	
	jcode::convert(\$subj,'jis');
	jcode::convert(\$body,'jis');

	my $SMTP = Net::SMTP->new('ucgimail.mmjp.or.jp');
	$SMTP->mail($from);
	$SMTP->to($to);
	$SMTP->bcc($from);

	$SMTP->data();

	$SMTP->datasend("From:$from\n");
	$SMTP->datasend("To:$to\n");
	$SMTP->datasend("Subject:$subj\n");
	$SMTP->datasend("Mime-Version: 1.0\n");
	$SMTP->datasend("Content-type: text/plain; charset=iso-8859-1\n");
	$SMTP->datasend("Content-transfer-encoding: 8bit\n");
	$SMTP->datasend("Reply-to: $from\n\n");
	$SMTP->datasend("$body\n");
	$SMTP->dataend();
	$SMTP->quit;

ところで、想像通りBCCの設定が$SMTP->bcc...でしたので質問の『◆現状』にbccの行を入れてみましたがそれだけで『ServerInternalError』になってしまいます。

これはperlの構文がどうこうということではないのかと...
サーバー管理者からは以下の指定しか出ていません。
 sendmailは使えない
 TCP/IPライブラリであるCPAN libnetがデフォルトで使用できます。
 メール送信はNet::SMTPを使用すると便利です。
 MIMEタイプの設定 .htaccessは使えない
 SSIは使えない
 サーバーはApache 1.3.26です。
 perlは5.005_003です。
 CPUtimelimitは20sec、子プロセス数は32、メモリは8MBです。
で、一応だめもとで質問を投げかけてみたのですが、『その手の質問には回答できない』旨の返答でした。
エラーログをみて解析できるのではあればいいのですが、.gzを展開できるようなソフトは持ってないですし。

この後どういう手順で詰めて行けばいいのでしょう。
何を調べたらいいのでしょう。
うーん、参りました。
回答者 まさ  [削除]  投稿日 11/18(月) 17:10:06
そうですか。
それではまず順を追って実行していきましょう。

ちょっと上記スクリプトにミスがありますのでそれを修正します。

$SMTP->datasend("Content-type: text/plain; charset=iso-8859-1\n");
$SMTP->datasend("Content-transfer-encoding: 8bit\n");

これを

$SMTP->datasend("Content-type: text/plain; charset=iso-2022-jp\n");
$SMTP->datasend("Content-transfer-encoding: 7bit\n");

に変更しておいて下さい。
それで

$SMTP->bcc($from);

これをコメントアウトして実行するとエラーは出ませんか?

エラーが出ずに正常にメールが送れればOKです。

まずはここまで確認して下さい。


質問者 赤青  [削除]  投稿日 11/18(月) 18:03:19
う、動きましたぁ〜(^.^)
ありがとうございます。

指示に従い修正とコメントに変更して実行するとOKです。
出、調子に乗ってBCCのコメントを解除するとNGでした。

BCCはできないということでしょうか。
管理者側で使用出来ないようにしているということはありえますか。
sendmailが使用できないくらいですし。
回答者 まさ  [削除]  投稿日 11/18(月) 18:25:16
あとはBCCだけですね。

これで上手く動くと思うんですがね。
動かないとなるとまた別の方法を考えましょう。

一度試してもらいたいのは、

$address = '<foo@baa.com>';

として

$SMTP->bcc($from);

の箇所を

$SMTP->to("$address");

に変更し、

$SMTP->datasend("To:$to\n");

の下に

$SMTP->datasend("Bcc:$address\n");

を追加して実行させて下さい。

また結果を教えて下さい。

質問者 赤青  [削除]  投稿日 11/18(月) 19:02:50
長々とお世話になります。

指示通り修正してテストした結果は...
Toへはメールが来ました。
Bccへは来ません。
ToとBccは別のアドレスを入れました。

勝手にBccのアドレスを変えて実行していますが、問題ないですよね。
foo@bar.com,foo@baa.comは意味がありますか?(変な質問かもしれません)

当然かもしれませんが、メールのソースからはBccに関する内容やそのアドレスは見られませんでした(除外されている)のでそれなりに認識はしているとは思うのですが...

2回メールを送るというのは、買物カゴの場合、信頼性の面からも止めておいたほうがイイですよね。
回答者 まさ  [削除]  投稿日 11/18(月) 19:18:20
foo@bar.comに意味はないですよ。わたしが適当に入れただけですから、実際はそれなりの
アドレスを指定してやって下さい。

しかしわかりませんね。
管理者側で制限しているのかもとおっしゃっていましたが、その可能性もなくは
ないですね。

一応Net::SMTPの正式なドキュメントを書いておきます。

http://www.perldoc.com/perl5.8.0/lib/Net/SMTP.html

この中には
$SMTP->bcc($from);

これが使えるとありますが、プロバイダー側であえて手を加えてBCCを無効にして
いるのかもしれません。

その辺位なら教えてくれるのではないですか。
スクリプトが何故動かないのかは教えてくれませんが、Net::SMTPの全機能が使える
かどうかぐらいは教えてくれると思いますよ。

もう一度プロバイダーに問い合わせてみて下さい。

質問者 赤青  [削除]  投稿日 11/18(月) 19:27:48
一度、内容には触れないように注意して管理者の方に質問してみます。
ありがとうございました。
本当に助かりました。

このページは終了したので返信(回答)は書きこめません

Web裏技