81

ユーザーが HTML フォームへの入力を完了し、フォームから情報を電子メールで送信したときに、PHP で電子メールを送信したいと考えています。フォームを持つ Web ページを表示する同じスクリプトから実行したいと考えています。

このコードは見つかりましたが、メールが送信されません。

<?php 

if (isset($_POST['submit'])) {
    $to = $_POST['email']; 
    $subject = $_POST['name'];
    $message = getRequestURI();
    $from = "zenphoto@example.com";
    $headers = "From:" . $from;

    if (mail($to, $subject, $message, $headers)) {
        echo "Mail Sent.";
    }
    else {
        echo "failed";
    }
}

?>

PHPでメールを送信するコードは何ですか?

4

8 に答える 8

171

編集 (#1)

私の理解が正しければ、すべてを 1 つのページにまとめて、同じページから実行したいと考えています。

次のコードを使用して、単一のページからメールを送信できます。たとえばindex.php、またはcontact.php

これと私の元の答えの唯一の違いは<form action="" method="post">、アクションが空白のままになっていることです。

後でユーザーを別のページにリダイレクトするには、PHP ハンドラーのheader('Location: thank_you.php');代わりに使用することをお勧めします。echo

以下のコード全体を 1 つのファイルにコピーします。

<?php 
if(isset($_POST['submit'])){
    $to = "email@example.com"; // this is your Email address
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    // You can also use header('Location: thank_you.php'); to redirect to another page.
    }
?>

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html> 

元の答え


質問の内容がよくわかりませんでしたが、フォームに記入した人にメッセージのコピーが送信されるという印象を受けました。

これは、HTML フォームと PHP ハンドラーのテスト済み/作業用コピーです。これは PHPmail()関数を使用します。

PHP ハンドラーは、フォームに入力した人にもメッセージのコピーを送信します。

//スラッシュを使用しない場合は、コード行の前に2 つのスラッシュを使用できます。

例: // $subject2 = "Copy of your form submission";実行されません。

HTMLフォーム:

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="mail_handler.php" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html>

PHP ハンドラ (mail_handler.php)

(HTML フォームからの情報を使用してメールを送信します)

<?php 
if(isset($_POST['submit'])){
    $to = "email@example.com"; // this is your Email address
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    // You can also use header('Location: thank_you.php'); to redirect to another page.
    // You cannot use header and echo together. It's one or the other.
    }
?>

HTML として送信するには:

メールを HTML として両方のインスタンスで送信する場合は、異なる変数名を持つ 2 つの別個の HTML ヘッダー セットを作成する必要があります。

mail()メールを HTML として送信する方法については、次のマニュアルを参照してください。


脚注:

  • HTML5に関して

action 属性を使用して、送信されたデータを処理するサービスの URL を指定する必要があります。

https://www.w3.org/TR/html5/forms.html4.10.1.3 サーバーと通信するためのフォームの構成で概説されているとおりです。完全な情報については、ページを参照してください。

したがって、action=""HTML5 では機能しません。

適切な構文は次のとおりです。

  • action="handler.xxx"また
  • action="http://www.example.com/handler.xxx".

xxxプロセスを処理するために使用されるファイルの種類の拡張子になることに注意してください。これは、、、、ファイル.php拡張子などです。.cgi.pl.jsp


メールの送信に失敗した場合は、Stack に関する次の Q&A を参照してください。

于 2013-08-22T13:36:56.940 に答える
5

Windows 7 で SMTP サーバーに接続して電子メールを送信するための PHP スクリプト

Windows で PHP から電子メールを送信することは、落とし穴と頭を悩ませるちょっとした地雷原です。Windows 7 と PHP 5.2.3 の (IIS) インターネット インフォメーション サービス Web サーバーで動作するようになった 1 つのインスタンスについて説明します。

メール送信機能を備えた CodeIgniter や Symfony のような事前構築済みのフレームワークを使用したくないと想定しています。スタンドアロンの PHP ファイルから電子メールを送信します。私はこのコードを codeigniter フードの下 (system/libraries の下) から取得し、修正して、この Email.php ファイルにドロップするだけで動作するようにしました。

これは、新しいバージョンの PHP で動作するはずです。しかし、あなたは決して知りません。

ステップ 1、SMTP サーバーのユーザー名とパスワードが必要です。

smtp.ihostexchange.netすでに作成され、セットアップされているsmtpサーバーを使用しています。これがないと先に進めません。Thunderbird、evolution、Microsoft Outlook などの電子メール クライアントを使用して、smtp サーバーを指定し、そこから電子メールを送信できるようにする必要があります。

ステップ 2、Hello World メール ファイルを作成します。

IIS を使用していると仮定しています。index.php というファイルを作成し、C:\inetpub\wwwrootこのコードをそこに挿入します。

<?php

  include("Email.php");

  $c = new CI_Email();

  $c->from("FromUserName@foobar.com");
  $c->to("user_to_receive_email@gmail.com");
  $c->subject("Celestial Temple");
  $c->message("Dominion reinforcements on the way.");
  $c->send();
  echo "done";
?>

ブラウザで localhost/index.php に移動すると、この index.php にアクセスできるはずです。Email.php が見つからないため、エラーが発生します。ただし、少なくともブラウザから実行できることを確認してください。

ステップ 3、次のファイルを作成しますEmail.php

の下に Email.php という新しいファイルを作成しますC:\inetpub\wwwroot

この PHP コードをコピーして Email.php に貼り付けます。

https://github.com/sentientmachine/standalone_php_script_send_email/blob/master/Email.php

smtp サーバーにはさまざまな種類があるため、 の上部にある設定を手動でいじる必要がありますEmail.php。で自動的に動作するように設定しましたsmtp.ihostexchange.netが、smtp サーバーは異なる場合があります。

例えば:

  1. smtp_port 設定を smtp サーバーのポートに設定します。
  2. smtp_crypto 設定を smtp サーバーが必要とするものに設定します。
  3. $newline と $crlf を設定して、smtp サーバーが使用するものと互換性があるようにします。間違った選択をすると、smtp サーバーはエラーなしで要求を無視する場合があります。私は \r\n を使用します\n。必要な場合があります。

リンクされたコードは、stackoverflow の回答として貼り付けるには長すぎます。編集する場合は、ここまたは github からコメントを残してください。変更します。

ステップ 4、php.ini で ssl 拡張機能が有効になっていることを確認します。

PHP.ini ファイルを見つけて、コメントを外します。

;extension=php_openssl.dll

したがって、次のようになります。

extension=php_openssl.dll

ステップ 5、作成した index.php ファイルをブラウザで実行します。

次の出力が得られるはずです。

220 smtp.ihostexchange.net Microsoft ESMTP MAIL Service ready at 
Wed, 16 Apr 2014 15:43:58 -0400 250 2.6.0 
<534edd7c92761@summitbroadband.com> Queued mail for delivery 
lang:email_sent

done

ステップ 6、メールと迷惑メール フォルダを確認します。

user_to_receive_email@gmail.com のメール アカウントにアクセスすると、メールが届いているはずです。5 ~ 10 秒以内に到着するはずです。そうでない場合は、ページで返されたエラーを調べます。それでもうまくいかない場合は、「食料品店で働くのはそれほど悪くない」と唱えながら、Google のキーボードで顔をつぶしてみてください。

于 2014-04-16T20:35:44.543 に答える
4

まだ行っていない場合は、メール サービスを有効にするために設定php.iniの下のパラメーター[mail function]が正しく設定されていることを確認してください。PHPMailerライブラリを使用して、指示に従ってください。

于 2013-08-22T13:03:13.547 に答える
2

action次のようにフォームに追加する必要があります。

<form name='form1' method='post' action='<?php echo($_SERVER['PHP_SELF']);'>
    <!-- All your input for the form here -->
</form>

次に、スニペットをドキュメントの上部に配置して、メールを送信します。つまり、情報をスクリプトの先頭に送信してecho($_SERVER['PHP_SELF']);、使用できるようにします。

于 2013-08-22T11:53:29.470 に答える
1

私が使用するPHPメール設定は次のとおりです。

//Mail sending function
$subject = $_POST['name'];
$to = $_POST['email'];
$from = "zenphoto@example.com";

//data
$msg = "Your MSG <br>\n";       

//Headers
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: <".$from. ">" ;

mail($to,$subject,$msg,$headers);
echo "Mail Sent.";
于 2013-08-22T11:47:15.220 に答える
-2

元のコードのエラーの 1 つは、次のようなものだった可能性があると思います。

$message = echo getRequestURI();

それ以外の:

$message = getRequestURI();

(ただし、コードはその後編集されています。)

于 2015-12-09T08:50:20.740 に答える