web-dev-qa-db-ja.com

送信時にHTMLフォームからPHPの電子メールを同じスクリプトで送信する

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

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

<?php 

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

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

?>

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

60
fusi0n

編集(#1)

私が正しく理解しているならば、あなたは1つのページにすべてを入れて、同じページからそれを実行したいです。

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

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

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

以下のコード全体を1つのファイルにコピーしてください。

<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // 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ハンドラのテスト済み/作業用コピーです。これはPHP mail()関数を使います。

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フォームの情報を使用してEメールを送信します)

<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // 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ヘッダーのセットを作成する必要があります。

HTMLとしてEメールを送信する方法を学ぶためにmail()のマニュアルを読んでください:


脚注:

  • HTML5に関して

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

https://www.w3.org/TR/html5/forms.htmlで説明されているとおりサーバーと通信する。完全な情報については、ページを調べてください。

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

正しい構文は次のとおりです。

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

xxxは、プロセスを処理するために使用されるファイルの種類の拡張子になります。これは.php.cgi.pl.jspファイル拡張子などです。


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

127

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

WindowsでPHPから電子メールを送信するのは、ちょっとした苦労と頭の引っかき傷のある鉱山のようなものです。 Windows 7およびPHP 5.2.3(IIS)のインターネットインフォメーションサービスWebサーバーで動作するようにした場合の1つの例を紹介します。

CodeIgniterやSymfonyのような電子メール送信機能を含む、あらかじめ構築されたフレームワークを使用したくないと思います。スタンドアロンのPHPファイルからメールを送信します。私は、codeigniterフードの下(システム/ライブラリの下)からこのコードを取得して、あなたがこのEmail.phpファイルにドロップすることができるようにそれを修正しました、そしてそれはただ動くべきです。

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

ステップ1、あなたはSMTPサーバとのユーザ名/パスワードを必要とします:

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

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

私はあなたがIISを使っていると思います。それでC:\inetpub\wwwrootの下にindex.phpと呼ばれるファイルを作成し、そこにこのコードを入れてください:

<?php

  include("Email.php");

  $c = new CI_Email();

  $c->from("[email protected]");
  $c->to("[email protected]");
  $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というファイルを作成する:

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

この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. あなたのSMTPサーバが使用するものと互換性があるように$ newlineと$ crlfを設定してください。あなたが間違ったものを選んだ場合、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 
<[email protected]> Queued mail for delivery 
lang:email_sent

done

ステップ6、メールアドレスとスパムフォルダを確認します。

[email protected]の電子メールアカウントにアクセスすると、電子メールを受信して​​いるはずです。それは5か10秒以内に着くべきです。そうでない場合は、ページに返されたエラーを調べます。それでもうまくいかない場合は、「食料品店での作業はそれほど悪くない」と唱えながら、Googleのキーボードで自分の顔をマッシュアップしてみてください。

4
Eric Leschinski

あなたはphpでメールを送るのにmandrillアプリを使うこともできます。このAPIは https://mandrillapp.com/api/docs/index.php.html から入手できます。送ったと他の詳細。

3
Hareesh

まだ行っていない場合は、php.iniを調べて、[mail function]設定の下のパラメータが電子メールサービスをアクティブにするように正しく設定されていることを確認します。あなたは PHPMailer ライブラリを使用して、指示に従うことができた後。

3
KB9

これが私が使用するPHPメール設定です:

//Mail sending function
$subject = $_POST['name'];
$to = $_POST['email'];
$from = "[email protected]";

//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.";
1
user2663434

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

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

それからあなたのスニペットを文書の一番上に置いてメールを送ってください。 echo($_SERVER['PHP_SELF']);がすることはあなたがそれを使うことができるようにあなたの情報をあなたのスクリプトのトップに送るということです。

1
Moduo

あなたはSMPTサーバーが必要です

... mail($to,$subject,$message,$headers);

働く。

あなたはxmailerのような軽量のSMTPサーバーを試すことができます

0
Andrei CACIO