WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:メール・フォームの代理設定?

0:[投稿] 橋口みよ子 [MAIL] [2002/11/26 10:17 ][環境:WIN+IE わからない]

友人に頼まれてHPを作っていますが、フォームやメールを友人のアドレスに届く様に設定するにはどうしたら良いのでしょうか?
アドレス設定しただけでは友人がテストした限りでは「ホストが見つかりません」のエラーばっかり・・・これって他の人がやってもエラーになるんですよね?
私がやるとOKなんだけど・・・
誰か詳しい人・また依頼でHP作製している人おしえてくださ〜い!よろしくお願いします。


1:[回答] アクア [MAIL] [2002/11/26 10:50 ]

方法いろいろあるけどこれでどうかな?
mimew.plとjcode.plは必要になるから適当に集めてください^^;
これでも駄目ならprint文での出力メーラーかな?てか同じか

#!/usr/local/bin/perl

$mailto = ''; #自分のメルアド

$subject = ''; #早い話がメールの件名

$mailcmd = '/usr/lib/sendmail'; #送信コマンド(UNIXはsendmail winはBLATJ.EXEなどのコマンドパス名を指定($mailcmd = 'C:\BLATJ\BLATJ.EXE'; など)

# (ヘッダ)
#    <<END_OF_DATA 〜 END_OF_DATA の間を好みにあわせて変更してください。
$header = <<END_OF_DATA;
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<title>メール送信結果</title>
</head>
<body>
<h1>メール送信結果</h1>
<hr>
<p>下記のメールを送信しました。ありがとうございました。</p><hr>
END_OF_DATA

# (フッタ)
#    <<END_OF_DATA 〜 END_OF_DATA の間を好みにあわせて変更してください。
$footer = <<END_OF_DATA;
<hr>
<a href="../index.htm">[戻る]</a>
</body>
</html>
END_OF_DATA

# ライブラリの呼び出し

require "jcode.pl";
require "mimew.pl";

# 入力値を読み取る

if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
    @a = split(/&/, $query_string);
    foreach $x (@a) {
        ($name, $value) = split(/=/, $x);
        $name =~ tr/+/ /;
        $name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
        &jcode'convert(*name, "jis");
        $value =~ tr/+/ /;
        $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
        $value =~ s/[\r\n]+/\n/g;
        &jcode'convert(*value, "jis");
        if ($FORM{$name} eq "") {
            $FORM{$name} = $value;
            $FORM[$cnt++] = $name;
        } else {
            $FORM{$name} .= (" " . $value);
        }
    }
}

# EMAILが正常なメールあどれすかどうか判断する

if ($FORM{'EMAIL'} =~ /^[-_\.a-zA-Z0-9]+\@[-_\.a-zA-Z0-9]+$/) {
    $mailfrom = $FORM{'EMAIL'};
}

# メールヘッダを作成する

{
    &jcode'convert(*subject, "jis");
    $mailhead = "";
    $mailhead .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
    $mailhead .= "Content-Transfer-Encoding: 7bit\n";
    $mailhead .= "MIME-Version: 1.0\n";
    $mailhead .= "To: $mailto\n";
    if ($mailfrom) {
        $mailhead .= "From: $FORM{'EMAIL'}\n";
        $mailhead .= "Cc: $FORM{'EMAIL'}\n";
    } else {
        $mailhead .= "From: $mailto\n";
    }
    $mailhead .= "Subject: $subject\n";
    $mailhead .= "\n";
}

# メールボディを作成する

{
    for ($i = 0; $i < $cnt; $i++) {
        $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n";
    }

    # "." のみの行は ". " に変換する。
    # 2回繰り返さないと、2行連続で "." のみの行に対応できない
    # "." を ".." に変換する処理が一般的だそうだが、あえて、
    # "." を ". " に変換する。
    $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g;
    $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g;
}

# メールを送信する

if ($mailcmd =~ /sendmail/) {
    unless (open(OUT, "| $mailcmd -t")) {
        &errexit("メールの送信に失敗しました。(1)");
    }
    unless (print OUT &mimeencode($mailhead)) {
        &errexit("メールの送信に失敗しました。(2)");
    }
    unless (print OUT $mailbody) {
        &errexit("メールの送信に失敗しました。(3)");
    }
    close(OUT);
} elsif ($mailcmd =~ /BLAT/i) {
    &jcode'convert(*subject, "sjis");
    $cmd = "$mailcmd";
    $cmd .= " -";
    $cmd .= " -t $mailto";
    $cmd .= " -s \"$subject\"";
    if ($mailfrom) {
        $cmd .= " -c $mailfrom";
        $cmd .= " -f $mailfrom";
    }
    unless (open(OUT, "| $cmd > NUL:")) {
        &errexit("メールの送信に失敗しました。(4)");
    }
    &jcode'convert(*mailbody, "sjis");
    unless (print OUT $mailbody) {
        &errexit("メールの送信に失敗しました。(5)");
    }
    &jcode'convert(*mailbody, "jis");
    close(OUT);
} else {
    &errexit("メール送信コマンド $mailcmd が存在しません。");
}

# ブラウザ画面に送信結果を書き出す

{
    &jcode'convert(*header, "sjis");
    &jcode'convert(*footer, "sjis");

    $mail = $mailhead . $mailbody;
    &jcode'convert(*mail, "euc");
    $mail =~ s/&/&amp;/g;
    $mail =~ s/"/&quot;/g;
    $mail =~ s/</&lt;/g;
    $mail =~ s/>/&gt;/g;
    $mail =~ s/\n/<BR>/g;
    &jcode'convert(*mail, "sjis");

    print "Content-type: text/html\n";
    print "\n";
    print "$header\n";
    print "$mail\n";
    print "$footer\n";
}

# エラーメッセージを出力して終了

sub errexit {
    local($err) = @_;
    local($msg);

    $msg  = "Content-type: text/html\n";
    $msg .= "\n";
    $msg .= "<html>\n";
    $msg .= "<head>\n";
    $msg .= "<meta http-equiv=\"Content-type\" content=\"text/html; charset=Shift_JIS\">\n";
    $msg .= "<title>メール送信結果</title>\n";
    $msg .= "</head>\n";
    $msg .= "<body>\n";
    $msg .= "<h1>メール送信結果</h1>\n";
    $msg .= "<hr>\n";
    $msg .= "<p>$err</p>\n";
    $msg .= "<p>ブラウザの [戻る] ボタンで戻ってください。</p>\n";
    $msg .= "<hr>\n";
    $msg .= "</body>\n";
    $msg .= "</html>\n";

    &jcode'convert(*msg, "sjis");

    print $msg;

    exit(0);
}


2:[回答] エルエル [MAIL] [2002/11/26 11:59 ]

さっそくありがとうございます!
試してみます。詳しいので助かります!
また報告しますね!ありがとうございました。


3:[回答] アクア [2002/11/26 12:16 ]

詳しいと言うかソースそのままやっちゅうねん(笑)
俺がとほほさんの所で勉強して作ったやつだから不具合あるかもしれないけど自分のでは使えているので、多分大丈夫でしょう。
では検討祈ります。


4:[回答] ひじ [2002/11/26 23:45 ]

>>0
>アドレス設定しただけでは友人がテストした限りでは「ホストが見つかりません」のエラーばっかり・・・これって他の人がやってもエラーになるんですよね?

どのスクリプトで、どのような条件で、なんというエラーメッセージが出るのか分からないと、答えようがありません。

推測ですが、セキュリティの問題などで、envelope fromが自ホストのものでないメールは出さないようにしているかもしれません。その場合、
sendmail -f'自分のメールアドレス'
でいけるかも知れません。

>>1
いろいろとツッコミどころのあるスクリプトです。
>$mailhead .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
>$mailhead .= "Content-Transfer-Encoding: 7bit\n";
>$mailhead .= "MIME-Version: 1.0\n";
>$mailhead .= "To: $mailto\n";
Message-IDはスクリプト側で生成するものです。

>for ($i = 0; $i < $cnt; $i++) {
>    $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n";
>}
なぜforeachを使わないのか謎。
#好みの問題だが

># "." のみの行は ". " に変換する。
># 2回繰り返さないと、2行連続で "." のみの行に対応できない
># "." を ".." に変換する処理が一般的だそうだが、あえて、
># "." を ". " に変換する。
なぜ -o i (あるいは -i )オプションを使わないのか謎(sendmailの場合)。

>&jcode'convert(*mail, "euc");
この時点で$mailはすでに'jis'コードになっているのに、それを明示しないのが謎。

>$msg = "Content-type: text/html\n";
(中略)
>$msg .= "<meta http-equiv=\"Content-type\" content=\"text/html; charset=Shift_JIS\">\n";
HTTPヘッダが使えるにも関わらず、利用しようとしない。
ヒアドキュメントを使わない。


5:[回答] アクア [2002/11/27 09:11 ]

つっこみどころ満載なのはすでに承知です^^;
でもforeachを使わないのは一種の好みと言うか自分の使いやすさですね。特にオプションはあまり使ったことも無いので使わないことにしてます。
($mailはすでに'jis'コードになっているのに)確かに^^;


6:[回答] アクア [2002/11/27 09:12 ]

でもってレス立てた人は解決したのかな?
したのなら状態を完了にしといてくださいね。


7:[回答] B-Cus [2002/11/27 13:02 ]

>>4
> Message-IDはスクリプト側で生成するものです。

そうなんですか? sendmail が一意な Message-ID を
付加してくれることを期待してはダメなの?


8:[回答] ふじ [URL] [2002/11/27 13:48 ]

>>7
> sendmail が一意な Message-ID を
> 付加してくれることを期待してはダメなの?
qmail は Message-ID を付けてくれないんですよ。
sendmail と Postfix は付けてくれますが。
# しかし自分も MTA が付けてくれるのを期待して書いたスクリプトが
# いくつあるか・・・

http://www.emaillab.org/essay/message-id.html
こんな文書もあります。


9:[回答] B-Cus [2002/11/27 15:13 ]

なるほど、知りませんでした。勉強になります。

# しかし、やっぱり MTA で付けてほしいなー。


10:[関連] さら [MAIL] [2002/11/28 11:22 ]

http://www.webpower.jp/websofts/others/libraries/stdio/
を使うとラクチン。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World