(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;

このQ&Aに関連する最新のQ&A

A 回答 (4件)

単純にパイプでメール送信するのであれば、



#!/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が正常に動作していればの話ですが。
    • good
    • 0

> &jcode'convert(*subject,'jis');


> &jcode'convert(*body,'jis');

$subject と $body はどこから沸いたのでしょう?
    • good
    • 0

まず、そのマシン上の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 $!;
とかやり出すと、優先順位の関係から、エラー検出が
できなくなります。
    • good
    • 0

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って勝手に漢字コードの変換を行ってくれるのでしょうか?

何事も基本が大切です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Q「$" = ',';」という構文の意味は?

Perl スクリプト中に「$" = ',';」という構文が出てきたのですが、これはどういう意味ですか?

Aベストアンサー

"(ダブルクオート)内ではリスト値(@foo)も展開されますが、そのリスト値の区切り文字を定義する特殊変数で、デフォルトはスペースだそうです。

参考URL:http://www.tohoho-web.com/wwwperl1.htm#Tokushu

Qopen (FILEHANDLE,"< $filename") or die "エラーメッセージ";について

下記プログラムでperl_read_writes.txtを出力すると、中身が表示されるのですが、a_perl_read_writes.txt等に名前を変更すると、当然エラーが起きます。
が、die "$filenameを開けません。";の部分の
$filenameを開けません。という文章が出力されないのですが、どなたか原因分かりませんか?

==================================================
#!/usr/bin/perl
print "Content-type: text/html;charset=Shift-JIS", "\n\n";

# HTMLの出力
print "<html>\n";
print "<body>\n";
print "ファイルの読み書き<br>\n";

$filename='/usr/local/apache/htdocs/aaa/bbb/perl_read_writes.txt';
# ファイルオープン
open (FILEHANDLE,"< $filename") or die "$filenameを開けません。";
...以下省略
==================================================

よろしくお願いします。

下記プログラムでperl_read_writes.txtを出力すると、中身が表示されるのですが、a_perl_read_writes.txt等に名前を変更すると、当然エラーが起きます。
が、die "$filenameを開けません。";の部分の
$filenameを開けません。という文章が出力されないのですが、どなたか原因分かりませんか?

==================================================
#!/usr/bin/perl
print "Content-type: text/html;charset=Shift-JIS", "\n\n";

# HTMLの出力
print "<html>\n";
print "<body>\n";
print "ファイルの...続きを読む

Aベストアンサー

# > ・・という文章が出力されないのですが、

# ↑どこに出力されないのか? というか、
# エラーメッセージを通常どこで確認しているかが不明ですが、


# エラーメッセージを標準エラーメッセージファイル"STDERR"以外に、
# 画面にも出力するように指定する。
use CGI::Carp qw(fatalsToBrowser);

my $filename = '/usr/local/apache/htdocs/aaa/bbb/a_perl_read_writes.txt';
open (FILEHANDLE,"< $filename") or die "$filenameを開けません。";

# 上記を、手元の
#  WinXP Pro.SP2 + Apache 1.3 + ActivePerl 5.8.4(810) + shift-jis
# で試すと画面(ブラウザ)に以下が出ます。

# (結果)
# /usr/local/apache/htdocs/aaa/bbb/a_perl_read_writes.txtを開けません。at c:\apache\cgi-bin\nu\hoge.pl line nn.

# key word : Perl STDERR, use CGI::Carp

# > ・・という文章が出力されないのですが、

# ↑どこに出力されないのか? というか、
# エラーメッセージを通常どこで確認しているかが不明ですが、


# エラーメッセージを標準エラーメッセージファイル"STDERR"以外に、
# 画面にも出力するように指定する。
use CGI::Carp qw(fatalsToBrowser);

my $filename = '/usr/local/apache/htdocs/aaa/bbb/a_perl_read_writes.txt';
open (FILEHANDLE,"< $filename") or die "$filenameを開けません。";

# 上記を、手元の
#  WinXP Pro.SP2 + Apac...続きを読む

Q$yerr = "$year (Y)"; と記述していいでしょうか?

「" "」の中で、かっこ「( )」を使っても問題ないですか?
エスケープが必要でしょうか?

Aベストアンサー

> $yerr = "$year (Y)";
のような、単なる文字列の文字としてカッコを使う分には、エスケープの必要はありません。
エスケープしなければならないのは、「$ 自身」と「@ 自身」くらいでしょう。
(これらは "~" の中では変数展開されてしまうので、エスケープする必要があります。)


このカテゴリの人気Q&Aランキング

おすすめ情報