web-dev-qa-db-ja.com

PHP メール機能がEメールの送信を完了しない

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

簡単なメールフォームを作成してみました。フォーム自体は私のindex.htmlページにありますが、上記のphpコードが埋め込まれている別の「提出ありがとう」ページ、thankyou.phpに送信します。コードは完全に送信されますが、電子メールを送信することはありません。助けてください。

431
user3818620

この回答には、mail()関数自体の使用にのみ適用される部分がありますが、これらのトラブルシューティング手順の多くは、どのPHPメーリングシステムにも適用できます。

スクリプトがメールを送信していないように見えるさまざまな理由があります。明らかな構文エラーがない限り、これらのことを診断することは困難です。これがない場合は、以下のチェックリストを実行して、発生する可能性のある潜在的な落とし穴を見つける必要があります。

エラー報告が有効になっており、すべてのエラーを報告するように設定されていることを確認してください

エラーの報告は、コードのバグとPHPが遭遇する一般的なエラーを取り除くために不可欠です。これらのエラーを受信するには、エラー報告を有効にする必要があります。次のコードをPHPファイルの先頭(またはマスター構成ファイル)に配置すると、エラー報告が有効になります。

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

詳細については、 このスタックオーバーフローの回答 を参照してください。

mail()関数が呼び出されていることを確認してください

ばかげているように見えるかもしれませんが、よくあるエラーは、実際にコードにmail()関数を配置するのを忘れることです。そこにあり、コメントアウトされていないことを確認してください。

mail()関数が正しく呼び出されることを確認してください

boolメール(string $ to、string $ subject、string $ message [、string $ additional_headers [、string $ additional_parameters]])

メール機能は、3つの必須パラメーターと、オプションで4番目と5番目のパラメーターを取ります。 mail()への呼び出しに少なくとも3つのパラメーターがない場合、失敗します。

mail()の呼び出しに正しい順序で正しいパラメーターがない場合も失敗します。

サーバーのメールログを確認する

Webサーバーは、それを介して電子メールを送信するすべての試行を記録する必要があります。これらのログの場所は異なります(サーバー管理者にログの場所を尋ねる必要がある場合があります)が、一般的には、logsの下のユーザーのルートディレクトリにあります。内部には、サーバーが報告したエラーメッセージがあります(存在する場合)。

ポート接続の失敗を確認する

ポートブロックは、SMTPを使用して電子メールを配信するコードを統合する際にほとんどの開発者が直面する非常に一般的な問題です。また、これはサーバーのメールログで簡単に追跡できます(メールログのサーバーの場所は、上記で説明したようにサーバーごとに異なる場合があります)。共有ホスティングサーバーを使用している場合、ポート25と587はデフォルトでブロックされたままです。このブロックは、ホスティングプロバイダーによって意図的に行われます。これは、一部の専用サーバーにも当てはまります。これらのポートがブロックされている場合は、ポート2525を使用して接続してみてください。ポートもブロックされている場合は、ホスティングプロバイダーに連絡してこれらのポートのブロックを解除してください。

ほとんどのホスティングプロバイダーは、これらの電子メールポートをブロックして、ネットワークをスパム電子メールの送信から保護します。

プレーン/ TLS接続にはポート25または587を使用し、SSL接続にはポート465を使用します。ほとんどのユーザーには、ポート587を使用して、一部のホスティングプロバイダーによって設定されたレート制限を回避することをお勧めします。

エラー抑制演算子を使用しないでください

エラー抑制演算子@がPHPの式の先頭に追加されると、その式によって生成される可能性のあるエラーメッセージは無視されます。この演算子を使用する必要があるが、メールの送信がそれらの1つではない状況があります。

コードに@mail(...)が含まれている場合、デバッグに役立つ重要なエラーメッセージを非表示にしている可能性があります。 @を削除して、エラーが報告されているかどうかを確認します。

error_get_last()で確認 直後に具体的な障害が発生した場合にのみお勧めします。

mail()の戻り値を確認してください

mail() 関数:

メールの配信が正常に受け入れられた場合はTRUEを返し、そうでない場合はFALSEを返します。メールが配信のために受け入れられたからといって、メールが実際に目的の宛先に到達するという意味ではないことに注意することが重要です。

次の理由により、これは重要です。

  • FALSE戻り値を受け取った場合、サーバーがメールを受け入れているときにエラーが発生することがわかります。これはおそらくコーディングの問題ではなく、サーバーの構成の問題です。システム管理者に連絡して、これが起こっている理由を調べる必要があります。
  • TRUEの戻り値を受け取ったとしても、メールが確実に送信されるという意味ではありません。これは、メールがPHPによってサーバー上のそれぞれのハンドラーに正常に送信されたことを意味します。メールが送信されない原因となる可能性のあるPHPの制御外の障害点がまだあります。

そのため、FALSEは正しい方向に導くのに役立ちますが、TRUEnotは必ずしもメールが正常に送信されたことを意味します。これは注意することが重要です!

ホスティングプロバイダーがメールの送信を許可し、メールの送信を制限していないことを確認してください

多くの共有Webホスト、特に無料のWebホスティングプロバイダーは、サーバーからの電子メールの送信を許可しないか、特定の期間中に送信できる量を制限します。これは、スパマーが安価なサービスを利用できないようにするための努力によるものです。

ホストに電子メールの制限があるか、電子メールの送信がブロックされていると思われる場合は、そのような制限がリストされているかどうか、ホストのFAQを確認してください。それ以外の場合は、サポートに連絡して、電子メールの送信に関する制限があるかどうかを確認する必要があります。

スパムフォルダーを確認します。電子メールがスパムとしてフラグ付けされるのを防ぎます

多くの場合、さまざまな理由で、PHP(およびその他のサーバー側プログラミング言語)を介して送信された電子メールは、受信者のスパムフォルダーに入ります。コードのトラブルシューティングを行う前に、必ずそこを確認してください。

PHPを介して送信されるメールが受信者のスパムフォルダーに送信されるのを防ぐために、あなたのPHPコードとそうでない場合の両方で、メールが届く可能性を最小限に抑えることができますスパムとしてマークされました。 Michiel de Mare からの良いヒント:

  • SPFDKIM などの電子メール認証方法を使用して、電子メールとドメイン名が一緒になっていることを証明し、ドメイン名のなりすましを防ぎます。 SPF Webサイトには、サイトのDNS情報を生成するウィザードが含まれています。
  • チェック your reverse DNS メールサーバーのIPアドレスがメールの送信に使用するドメイン名を指していることを確認します。
  • 使用しているIPアドレスが ブラックリストにない であることを確認してください
  • 返信先アドレスが有効な既存のアドレスであることを確認してください。
  • 電子メールアドレスだけでなく、Toフィールドに宛先の完全な実名を使用します(例:"John Smith" <[email protected]>)。
  • [email protected][email protected]などの悪用アカウントを監視します。つまり、これらのアカウントが存在することを確認し、送信されたものを読み、苦情に対処します。
  • 最後に、本当に登録解除を簡単にします。そうでない場合、ユーザーはspamボタンを押すことで登録を解除し、それが評判に影響します。

このトピックの詳細については、「 プログラムで送信する電子メールが自動的にスパムとしてマークされないようにする方法 」を参照してください。

すべてのメールヘッダーが提供されていることを確認してください

一部のスパムソフトウェアは、「From」や「Reply-to」などの一般的なヘッダーがない場合、メールを拒否します。

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

メールヘッダーに構文エラーがないことを確認してください

無効なヘッダーは、ヘッダーがないことと同じくらい悪いです。間違った文字が1つあれば、メールを脱線させるのに十分です。 PHPはこれらのエラーをnotキャッチするため、構文が正しいことを再確認してください。

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

偽のFrom:送信者を使用しないでください

メールにはFrom:送信者が必要ですが、any値だけを使用することはできません。特に、ユーザーが指定した送信者アドレスは、メールをブロックする確実な方法です。

$headers = array("From: $_POST[contactform_sender_email]"); // No!

理由:Webまたは送信メールサーバーは、@ hotmailまたは@gmailアドレスを担当するふりをするSPF/DKIMホワイトリストに登録されていません。 From:送信者ドメインが設定されていないメールを静かにドロップすることもあります。

受信者の値が正しいことを確認してください

問題は、電子メールの受信者の値が間違っているという単純な場合もあります。これは、誤った変数の使用が原因である可能性があります。

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

これをテストする別の方法は、受信者の値をmail()関数呼び出しにハードコーディングすることです。

mail('[email protected]', $subject, $message, $headers); 

これは、mail()パラメーターのすべてに適用できます。

複数のアカウントに送信する

電子メールアカウントの問題を除外するには、異なる電子メールプロバイダーの複数の電子メールアカウントに電子メールを送信します。メールがユーザーのGmailアカウントに届かない場合は、同じメールをYahooアカウント、Hotmailアカウント、通常のPOP3アカウント(ISPが提供するメールアカウントなど)に送信します。

電子メールが他のすべての電子メールアカウントまたはいくつかの電子メールアカウントに到着した場合、コードが電子メールを送信していることはわかっていますが、何らかの理由で電子メールアカウントプロバイダーがそれらをブロックしている可能性があります。メールがどのメールアカウントにも届かない場合、問題はコードに関連している可能性が高くなります。

コードがフォームメソッドと一致することを確認してください

フォームメソッドをPOSTに設定している場合は、$_POSTを使用してフォーム値を探していることを確認してください。 GETに設定した場合、またはまったく設定しなかった場合は、$_GETを使用してフォームの値を探してください。

フォームのaction値が正しい場所を指していることを確認してください

フォームのaction属性に、PHPメーリングコードを指す値が含まれていることを確認してください。

<form action="send_email.php" method="POST">

Webホストが電子メールの送信をサポートしていることを確認してください

一部のWebホスティングプロバイダーは、サーバーを介した電子メールの送信を許可または有効にしません。この理由はさまざまですが、メールの送信が無効になっている場合は、サードパーティを使用してそれらのメールを送信する代替方法を使用する必要があります。

テクニカルサポートへのメール(オンラインサポートまたはFAQへの旅行後)は、サーバーでメール機能が利用可能かどうかを明確にする必要があります。

localhostメールサーバーが設定されていることを確認してください

WAMP、MAMP、またはXAMPPを使用してローカルワークステーションで開発している場合、電子メールサーバーはおそらくワークステーションにインストールされていません。これがないと、PHPはデフォルトでメールを送信できません。

これを解決するには、基本的なメールサーバーをインストールします。 Windowsの場合、無料の Mercury Mail を使用できます。

SMTPを使用してメールを送信することもできます。 この素晴らしい答え from Vikas Dwivedi をご覧ください。

PHPのカスタムmail.logを有効にします

MTAとPHPのログファイルに加えて、具体的に mail()関数のログ記録 を有効にできます。完全なSMTP相互作用は記録されませんが、少なくとも関数呼び出しパラメーターと呼び出しスクリプトは記録されます。

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

詳細については http://php.net/manual/en/mail.configuration.php をご覧ください。 (おそらく、php.iniまたは.user.iniまたは.htaccessでこれらのオプションを有効にすることをお勧めします。)

メールテストサービスで確認する

MTA /ウェブサーバーの設定をテストするために利用できるさまざまな配信およびスパムチェックサービスがあります。通常、メールプローブTo:のアドレスを送信し、配信レポートと、より具体的な障害または分析を後で取得します。

別のメーラーを使用する

PHPに組み込まれたmail()関数は便利であり、多くの場合仕事を成し遂げますが、それは 欠点があります です。幸いなことに、上記で説明した多くの問題の処理を含む、より強力で柔軟性のある代替手段があります。

これらはすべて、プロのSMTPサーバー/サービスプロバイダーと組み合わせることができます。 (一般的な08/15共有Webホスティングプランは、メールのセットアップ/構成可能性に関しては、ヒットまたはミスになるためです。)

473
John Conde

メール機能にメールヘッダを追加

$header = "From: [email protected]\r\n"; 
$header.= "MIME-Version: 1.0\r\n"; 
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 
$header.= "X-Priority: 1\r\n"; 

$status = mail($to, $subject, $message, $header);

if($status)
{ 
    echo '<p>Your mail has been sent!</p>';
} else { 
    echo '<p>Something went wrong, Please try again!</p>'; 
}
36
er.irfankhan11
  1. 常にメール機能でヘッダを送信してみてください。
  2. Localhostを使ってメールを送信している場合は、メールを送信するためのSMTP設定を行います。
  3. サーバー経由でメールを送信している場合は、サーバーでメール送信機能が有効になっていることを確認します。
21
sonam gupta

あなたのメールを送信するためにSMTP設定を使用していますか?代わりにphpmailerを使ってみてください。ライブラリは https://github.com/PHPMailer/PHPMailer からダウンロードできます。私はこのように送信する私の電子メールを作成しました:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet="utf-8";
    $mail->IsSMTP();                                      // set mailer to use SMTP
    $mail->Host = "mail.example.com";  // specify main and backup server
    $mail->SMTPAuth = true;     // turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // set Word wrap to 50 characters
    $mail->IsHTML(true);                                  // set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";    
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
20
oneDerer

メールを送信する前にヘッダを追加するだけです。

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

後もう一つ。 mail()関数はlocalhostでは機能していません。コードをサーバーにアップロードしてみてください。

15
user1258544

それは000webhostで私にとって次のことをすることによって働きました:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n"; 

Eメールを送信するときにEメールアドレスを直接入力してください

mail('[email protected]', $subject, $message, $headers)

''ではなく""を使用

このコードは機能しますが、電子メールは30分遅れて受信されました

13
bat .t

ほとんどのmail()関数は共有ホスティングでは無効になっています。より良い方法はSMTPを使うことです。最良の選択肢はGmailかSendGridでしょう。


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_Host."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
10
Karthik

mail()関数のみを使用する場合は、設定ファイルを完成させる必要があります。

メール展開を開き、SMTP smtp_portなどを設定する必要があります。最も重要なのは、ユーザー名とパスワードです。それがなければ、メールを送ることはできません。また、PHPMailクラスを使って送信することもできます。

9
iatboy

これら二つの太ももを別々にそして一緒に試してみてください。

  1. if($_POST['submit']){}を削除します
  2. $fromを削除する
9
vldfr

これでうまくいくと思います。私はちょうどPHPをHTMLから分離するためにif(issetを追加しそしてボディの変数に連結を追加しました。

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>
8
Stephen M

これが今後起こると思う人には、私はmailの使用をお勧めしません。これに触れるいくつかの答えがありますが、 なぜ ではありません。

PHPのmail関数は不透明であるだけでなく、あなたがどんなMTA(Sendmail)を使って仕事をしているかに完全に依存しています。 mailは、MTAがそれを受け入れなかった場合にのみ通知します(つまり、送信しようとしたときにSendmailが停止した)。メールが渡されたため、メールが成功したかどうかはわかりません。 John Condeの回答詳細のように、MTAのログをいじる必要があります。MTAの修正に失敗したことについて十分な情報があることを確認してください。あなたが共有ホストにいるか、MTAログにアクセスできない場合、あなたは運が悪いです。残念ながら、Linux用のほとんどのVanillaインストールのデフォルトはこのように処理します。

メールライブラリ( PHPMailer 、Zend Framework 2+など)は、mailとはまったく異なる動作をします。彼らがしていることは、受信側のメールサーバーに直接ソケットを開き、そのソケットを介してSMTPメールコマンドを直接送信することです。言い換えれば、そのクラスはそれ自身のMTAとして振る舞う(最終的にメールを送るためにmailを使うようにライブラリに言うことができるが、私はあなたがそうしないことを強く勧めます)。

これがあなたにとって何を意味するかというと、あなたはそれから直接受信サーバーからの応答を見ることができるということです(例えばPHPMailerでは、 デバッグ出力をオンにすることができます )。メールが送信に失敗したかどうか、またはその理由を推測する必要はもうありません。

SMTPを使用している場合(つまりisSMTP()を呼び出している場合)、SMTPDebugプロパティを使用してSMTP会話の詳細な記録を取得できます。

このオプションを設定するには、スクリプトに次のような行を追加します。

$mail->SMTPDebug = 2;

あなたはまた、より良いインターフェースの恩恵を受けます。 mailを使用すると、すべてのヘッダ、添付ファイルなどを設定する必要があります。ライブラリを使用すると、そのための専用の機能があります。これはまた、関数が(ヘッダのような)すべてのトリッキーな部分をやっていることを意味します。

8
Machavity

これを試して

<?php
$to = "[email protected], [email protected]";
$subject = "HTML email";

$message = "
    <html>
    <head>
       <title>HTML email</title>
    </head>
    <body>
      <p>This email contains HTML Tags!</p>
      <table>
        <tr>
         <th>Firstname</th>
         <th>Lastname</th>
        </tr>
        <tr>
          <td>John</td>
          <td>Doe</td>
        </tr>
      </table>
    </body>
    </html>";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// More headers
$headers .= 'From: <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";

mail($to,$subject,$message,$headers);
?> 
6
Ganga Reddy
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6
Chirag patel

あなたは、codeigniterによる設定電子メールを使うことができます、例えばsmtpを使う(簡単な方法):

$config = Array(
        'protocol' => 'smtp',
        'smtp_Host' => 'mail.domain.com', //your smtp Host
        'smtp_port' => 26, //default port smtp
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   //conditional true
}

それは私のために働きます!

これを試して

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4

PHPでメールを送信できない場合は、 PHPMailer または SwiftMailer のような代替方法を検討してください。

PHPでメールを送る必要があるときはいつもSwiftMailerを使います。


基本的な使い方

require 'mail/Swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

SwiftMailerの使い方の詳細については 公式ドキュメント をご覧ください。

3
John Slegers

たぶん問題は、この種の問題を避けるためにメールサーバーの設定であるか、メールサーバーの問題について心配する必要はない、私はあなたが PHPMailer を使うことを勧めますメール、あなたが考慮しなければならない唯一の事はSMTPポート(ポート:25と465)を有効にすることです。

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
       //Server settings
       $mail->SMTPDebug = 0;                                 
       $mail->isSMTP();                                      
       $mail->Host = 'smtp.gmail.com';  
       $mail->SMTPAuth = true;                               
       $mail->Username = '[email protected]';                 
       $mail->Password = 'contrasenia';                           
       $mail->SMTPSecure = 'ssl';                          
       $mail->Port = 465;                                    

       //Recipients
       $mail->setFrom('[email protected]', 'my name');    
       $mail->addAddress('[email protected]');               

       //Attachments
       $mail->addAttachment('optional file');         // Add files, is optional

       //Content
       $mail->isHTML(true);// Set email format to HTML
       $mail->Subject = utf8_decode("subject");
       $mail->Body    = utf8_decode("mail content");
       $mail->AltBody = '';
       $mail->send();
     }
     catch (Exception $e){
        $error = $mail->ErrorInfo;
     }
3
Jack Ch

外部メーラを使いたくない、専用のLinuxサーバでmail()したい人のためのものです。

方法、phpのメール送信方法は、セクションphp.ini[mail function]で説明されています。パラメータsendmail-pathは、sendmailの呼び出し方法を記述します。デフォルト値はsendmail -t -iなので、もしあなたがLinuxコンソールでsendmail -t -i < message.txtを動かせば - あなたはそれをするでしょう。 mail.logをdebugに追加して、mail()が本当に呼ばれるようにすることもできます。

異なるMTAがsendmailを実装することができます、彼らはただその名前の彼らのバイナリへのシンボリックリンクを作るだけです。例えば、debianではデフォルトはpostfixです。メールを送信し、コンソールからsendmail -v -t -i < message.txtを使ってテストするようにMTAを設定します。ファイルmessage.txtには、メッセージと本文のすべてのヘッダーを含める必要があります。エンベロープの宛先アドレスはTo:ヘッダーから取得されます。例:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

私はMTAとして ssmtp を使用することを好みます。なぜならそれは単純で、開かれたポートでデーモンを実行する必要がないからです。 ssmtpはローカルホストからメールを送信するためだけに適しています、それはまたパブリックメールサービスのあなたのアカウントを通して認証されたEメールを送ることができます。 ssmtpをインストールしてconfig /etc/ssmtp/ssmtp.confを編集します。ローカルシステムのメールをunixアカウントに回収することもできるようにするには(例えば、cronジョブからrootへのアラート)、/etc/ssmtp/revaliasesファイルを設定します。

これが私のYandexメールアカウントの設定です。

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
3
user3132194

サーバーにSendmailがインストールされていることを確認してください。

コードを確認し、問題がないことを確認したら、/ var/mailに移動してそのフォルダが空かどうかを確認します。

空の場合は、次の手順を実行する必要があります。

Sudo apt-get install sendmail

あなたがUbuntuサーバー上にいる場合。

3
Daniel

まず第一に、

あなたはmail()関数のために多くのパラメータを持っているかもしれません...あなたは最大5つまで持つことができます。 mail(to,subject,message,headers,parameters);$from変数に関する限り、あなたがlinux cPanelを使っているならば、それはあなたのウェブホストから自動的に来るべきです。それは自動的にあなたのcPanelユーザー名とIPアドレスから来ます。

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

また、mail()関数内の変数の順序が正しいことを確認してください。その順番でmail($to,$subject,$message,etc.)を実行しないと、それが機能しない可能性があります。これが役立つかどうか私に知らせてください...

2
aidangig

これはほんの一握りのユーザにしか影響しませんが、私はそれがその一握りのために文書化されてほしいのです。この小さな一握りのメンバーは、この問題のためにPHPメールスクリプトのトラブルシューティングに6時間を費やしました。

Www.AceITLab.comからXAMPPを実行している大学に行く場合は、教授が教えてくれなかったことを知っておく必要があります。AceITLabファイアウォール(Windowsファイアウォールではない)がXAMPPのMercuryMailをブロックします。あなたは代替のメールクライアントを使わなければならないでしょう、ナシは我々のために働いています。セキュリティ設定が低いGmailアカウントに送信する必要があります。

はい、私は知っています、これは実社会の電子メールにはまったく役に立ちません。しかし、これまで見てきたことから、学問的設定と現実の世界にはほとんど共通点がありません。

2
TonyLuigiC

もしあなたがこのコードをローカルサーバー(すなわち開発目的のためにあなたのコンピューター)上で実行しているならば、それは受信者にEメールを送信しません。何が起こるかというと、mailoutputという名前のフォルダーに.txtファイルが作成されます。

000webhosthostingerのような無料の詐欺サービスを使用している場合、これらのサービスプロバイダはmail()機能を無効にして、電子メールのなりすまし、スパムなどの意図しない使用を防止します。

サービスプロバイダがmail()関数をサポートしていることが確実な場合は、このPHPマニュアルを参照してください。 PHP mail()

ホスティングサービスがmail()関数をサポートしているかどうかを確認するには、次のコードを実行してみてください。 (受信者の電子メールアドレスを忘れずに変更してください)

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>

これが役に立ったことを願っています。

1

Empty()とisset()関数を使うことができます。別のファイルでも動作させたい場合は、action='yourphp.php'を私が提供しているHTMLに変更し、store the PHP scriptをそのyourphp.phpファイルに変更します。また、PHP機能を有効にするには、index.htmlindex.phpに変更する必要があります。

PHP

<?php

    error_reporting(0);
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";


    if ($_POST['submit']){
                if (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

宜しくお願いします!

1
Bishop

sendmail Debian 10.0.0( 'Buster')のインストールは実際には簡単でした!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

標準sendmailパッケージのインストール(「送信」を許可):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

その他の便利なコマンド:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation 
systemctl restart sendmail                  # As and when required  

検証(送信能力の)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

上記は約5分かかりました。

それから私は5時間を無駄にした...
スパムフォルダを確認するのを忘れないでください!!!!

0
Bad Loser

あなたはlibmailを使うことができます: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=ja

include "libmail.php";
$m = new Mail(); // create the mail
$m->From( $_POST['form'] );
$m->To( $_POST['to'] );
$m->Subject( $_POST['subject'] );
$m->Body( $_POST['body'] );
$m->Cc( $_POST['cc']);
$m->Priority(4);
//  attach a file of type image/gif to be displayed in the message if possible
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
$m->Send(); // send the mail
echo "Mail was sent:"
echo $m->Get(); // show the mail source
0
Salim Ibrogimov

あなたのsendmailシステムがうまくいけば、あなたのコードは次のように修正されなければなりません:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $header =" 
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: [email protected]\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <[email protected]>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $header) !== false) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

これにより、HTMLベースの電子メールを送信できます。

注目に値するのは:

  1. ヘッダーの複数行の文字列(各行は\ r\nで区切られています)を作成しました。
  2. より良い電子メールを作成できるように、HTMLを返すように表現するためにContent-typeを追加しました(HTMLページで行うのと同じように、CSSを含む、必要なHTMLコードを追加できます)。

注:<<<EOB構文では、最後のEOBマーカーが行の先頭から始まり、セミコロンの後にスペースや文字が含まれていない必要があります。

0