OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

sendmailができない

  • すぐに回答を!
  • 質問No.132798
  • 閲覧数224
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 8% (10/125)

(1)お問い合わせフォームを入力(2)入力データを確認する(3)最後に指定先のメールに送り終了
という具合ですが(3)のところで指定先にメールが届きません。メール自体も送られてこないのですがどのような方法があるのでしょうか?どうか教えていただけないでしょうか?お願いします。

(3)のソースコートです。-------------
&header;
open (KEIJI, "<keijiban.dat") || die "File 'keijiban.dat' Open Error.";

# ファイルの内容を1行単位ですべて配列allに読み込む
@all = <KEIJI>;
split(/:/, $_);
if( $_ = $all[0] ){
($time, $name, $mail, $title, $message, $to) = split(/:/);

#送信前処理
&jcode'convert(*subject,'jis');
&jcode'convert(*body,'jis');

# send mail
open(MAIL, "| /usr/lib/sendmail -t");
print MAIL "TO: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-Type: text/plain;\n\n";
print MAIL "\n";
print MAIL "---------------------------------------------\n";
print MAIL " 名前:$name\n";
print MAIL " 内容:$body\n";
print MAIL " お名前:$firstname $secondname\n";
print MAIL " かな:$kanafirstname $kanasecondname\n";
print MAIL " 所在都道府県 :$area1 $area2\n";
print MAIL " 電話番号:$telno\n";
print MAIL " 性別:$sex\n";
print MAIL " メールアドレス:mailto:$mailad\n";
print MAIL "お問合わ、ご相談内容:";
print MAIL " $con1\n";
print MAIL "---------------------------------------------\n";
close(MAIL);
&one_message;
}
close(KEIJI);
# フッターを表示するサブルーチン
&footer;
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全4件)

  • 回答No.1
レベル12

ベストアンサー率 41% (324/772)

perlはほとんど使ったことがないのでよくわかりませんが、このコードだとメールを送る送らない以前の問題があるようにみえます。 Mime関連の設定は --- "Content-Type: text/plain; charset=\"iso-2022-jp\"" "Content-Transfer-Encoding: 7bit" " ...続きを読む
perlはほとんど使ったことがないのでよくわかりませんが、このコードだとメールを送る送らない以前の問題があるようにみえます。
Mime関連の設定は
---
"Content-Type: text/plain; charset=\"iso-2022-jp\""
"Content-Transfer-Encoding: 7bit"
"Mime-Version: 1.0"
---
と書くのが正式(?)ですし、
---
&jcode'convert(*subject,'jis');
print MAIL "Subject: $subject\n";
---
となっていますが、
print MAIL "Subject: $subject\n";
の$subjectの部分はMime-Encodeする必要があります。
To,Fromの部分に関しても日本語を使用しているのであれば、Mime-Encodeは必須です。
さらに
---
&jcode'convert(*subject,'jis');
&jcode'convert(*body,'jis');
---
とJISに変換していても、肝心なメールの本文の部分はEUCまたは、Shift-JISのままなのではありませんか?
だとすると、漢字コードが入り交じったメールが送信されませんか?
8bitコードが含まれているためsendmailが拒否している可能性はありませんか?
このままでは受け取ったほうが迷惑します。

それとも最近のsendmailって勝手に漢字コードの変換を行ってくれるのでしょうか?

何事も基本が大切です。
  • 回答No.2
レベル9

ベストアンサー率 71% (59/82)

まず、そのマシン上のsendmailの設定は済んでいて、 いつもそのsendmailを介してメールが送れていますか? それができていないなら、当然、perlからメールを 送ることもできません。 未確認なら、mailコマンドなどで、メールがきちんと 送れることを確認して下さい。 prompt> mail -s TEST_MAIL yourname@your.mail.host.ne ...続きを読む
まず、そのマシン上のsendmailの設定は済んでいて、
いつもそのsendmailを介してメールが送れていますか?
それができていないなら、当然、perlからメールを
送ることもできません。

未確認なら、mailコマンドなどで、メールがきちんと
送れることを確認して下さい。

prompt> mail -s TEST_MAIL yourname@your.mail.host.ne.jp

とやると、メールの本文入力モードになるので、
本文を入力して、Ctrl-Dを押します。それで
yourname@...にメールが届けば、sendmailは
ちゃんと動いてます。

以上の確認をしたか、あるいはいつもそのマシンのsendmailを
介してメールを送っていることが明らかなら、sendmailのログや
標準エラー出力をチェックするんですね。sendmailに-vオプションを
指定すれば、チェックモードになってメッセージがいっぱいでます。
ログは/var/log/maillogとか/var/log/syslog、/var/log/messagesに
入ってるはずです。標準エラーは、

open(MAIL, "| /usr/lib/sendmail -t -v >>& /tmp/sendmail-stderr.log") or die $!;

などとして、/tmp/sendmail-stderr.log(名前はなんでもいいです
けど)をチェックして下さい。原因を特定しないことには
どうにもならないですから。

あと、私には直接sendmailを起動する意図がよく分らないです。
sendコマンドとかimputコマンドを使わないんですか?
imputはメールの整形やヘッダのMIMEエンコード、JISへの変換など
勝手にやってくれますよ。さらには、CGIが動いてるローカル
マシンではない、リモートサーバ上のsendmailを利用することも
可能です。その場合、同一組織内のサーバでない限り、はじかれますが。
ですから、ローカルマシンのsendmailがちゃんと設定されていない場合、
いつも利用している同一組織内の別のサーバ上のsendmailを
使った方が簡単です。

なお、imputを使うには、imパッケージがインストールされてないとダメです。

意地でもsendmailを使いたいなら、selenityさんが仰るように、
まだやることがあります。

1.ヘッダ部分のBase64エンコーディング
  jcodeではなく、Jcodeパッケージを使って、
  print MAIL "Subject: ", Jcode->new($subject)->mime_encode, "\n";
  To:, From: なども同様。

2.print MAIL " 名前:$name\n"; の「名前」など、
  変数以外の部分は確かにJISですか?
  そんなに一生懸命JISへの変換をしなくても、

  open(MAIL, "| nkf -j | /usr/lib/sendmail -t") or die $!;

  とやって、nkfを噛ましてやれば、全部JISに変換してくれます。
  nkfがインストールされてないようなら、インストールする
  価値はあると思いますよ。

3.まあ、クリティカルな問題ではないですが、お行儀よくするなら、
  Content-TypeとかMime-Versionとかのヘッダエントリも入れましょう。

最後に、細かいことですが、
  open(FH, "....") || die $!;
よりも、
  open(FH, "....") or die $!;
ですよね。open()のC記法をずっと遵守するなら
問題ないですが、そのうちにperlの手抜き記法に慣れて
  open FH, "..." || die $!;
とかやり出すと、優先順位の関係から、エラー検出が
できなくなります。
  • 回答No.3
レベル12

ベストアンサー率 67% (310/456)

> &jcode'convert(*subject,'jis'); > &jcode'convert(*body,'jis'); $subject と $body はどこから沸いたのでしょう?
> &jcode'convert(*subject,'jis');
> &jcode'convert(*body,'jis');

$subject と $body はどこから沸いたのでしょう?
  • 回答No.4
レベル4

ベストアンサー率 0% (0/1)

単純にパイプでメール送信するのであれば、 #!/usr/bin/perl $from = "hoge\@hogehoge.hoge"; $to = "hoge\@hogehoge.hoge"; open MAIL, "|nkf -j -m0| /usr/sbin/sendmail -f $from -t $to"; pr ...続きを読む
単純にパイプでメール送信するのであれば、

#!/usr/bin/perl

$from = "hoge\@hogehoge.hoge";
$to = "hoge\@hogehoge.hoge";

open MAIL, "|nkf -j -m0| /usr/sbin/sendmail -f $from -t $to";

print MAIL "From: $from\n";
print MAIL "Subject: This is a test mail.\n";
print MAIL "To: $to\n";
print MAIL "\n";
print MAIL "ほげほげ\n";

close MAIL;

のようにすれば送れます。
どこが抜けていたかはご覧になればご覧になればわかると思います。
まあ、Fookeyさんの仰るとおりsendmailが正常に動作していればの話ですが。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ