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


477
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = 'contact@yoursite.com';
    $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ページにありますthankyou.phpが、上記のPHPコードが埋め込まれた別の「送信ありがとうございます」ページに送信されます。コードは完全に送信されますが、電子メールは送信されません。どうすれば修正できますか?


2
ローカルコンピュータまたはライブホストでのプログラム
Tamil Selvan C 'Ju

6
1.スパムに巻き込まれていないと確信していますか?2.ボックスにsendmailが設定されていますか?
Steven Moseley、2014

ライブホスト上ではスパムに分類されません。自分のボックスにsendmailを設定したことの意味がわからないので、想定していません。
user3818620 14

なしで送信してみてください$from
Artem Ilchenko 2017年

回答:


512

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

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

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

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

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

PHPで有用なエラーメッセージを取得するにどうすればよいですか?この詳細については、この回答

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

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

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

bool mail(string $ to、string $ subject、string $ message [、string $ additional_headers [、string $ additional_parameters]])

mail関数は、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一方で正しい方向にあなたを指して助けるTRUEではない必ずしもあなたの電子メールが正常に送信された意味。これは重要です!

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

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

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

スパムフォルダを確認してください。電子メールがスパムとしてフラグされるのを防ぐ

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

PHP経由で送信されたメールが受信者の迷惑メールフォルダーに送信されないようにするには、PHPコード内でも、メールに迷惑メールとしてマークされる可能性を最小限にするためにも、さまざまな方法があります。Michiel de Mareからの良いヒントは次のとおりです。

  • メールとドメイン名が同じであることを証明し、ドメイン名のなりすましを防ぐには、SPFDKIMなどのメール認証方法を使用します。SPF Webサイトには、サイトのDNS情報を生成するためのウィザードが含まれています。
  • 逆引きDNSチェックして、メールサーバーのIPアドレスがメールの送信に使用するドメイン名を指していることを確認します。
  • 使用しているIPアドレスがブラックリストに含まれていないことを確認してください
  • 返信先アドレスが有効な既存のアドレスであることを確認してください。
  • 宛先フィールドには、電子メールアドレスだけではなく、完全な実名の宛先を使用します(例:)"John Smith" <john@blacksmiths-international.com>
  • abuse@yourdomain.comやpostmaster@yourdomain.comなどの不正使用アカウントを監視します。つまり、これらのアカウントが存在することを確認し、送信されたものを読んで、苦情に対応します。
  • 最後に、登録解除を本当に簡単にします。そうしないと、ユーザーはスパムボタンを押して購読を解除し、評判に影響を与えます。

プログラムで送信するメールが自動的にスパムとしてマークされないようにするにはどうすればよいですかをご覧くださいこのトピックの詳細については。

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

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

$headers = array("From: from@example.com",
    "Reply-To: replyto@example.com",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

メールヘッダーに構文エラーがないことを確認する

無効なヘッダーは、ヘッダーがないのと同じくらい悪いです。1つの間違った文字が、メールの脱線に必要なすべての可能性があります。PHPがこれらのエラーを検出しないため、構文が正しいことを確認してください。

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

偽のFrom:送信者を使用しない

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

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

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

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

場合によっては、メールの受信者の値が正しくないという単純な問題が発生することもあります。これは、誤った変数を使用したことが原因である可能性があります。

$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

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

mail('user@example.com', $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を使用してメールを送信することもできます。これを行う方法については、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 /ウェブサーバーの設定をテストするために利用できるさまざまな配信およびスパム性チェックサービスがあります。通常、メールプローブの宛先:のアドレスを送信してから、配信レポートを取得し、後で具体的なエラーや分析を取得します。

別のメーラーを使用する

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

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


11
よく書かれました、ジョン。もう1つ追加します。可能であれば、送信メールサーバーのメールサーバーログをチェックすると(ローカルまたはリモートでホストされているかどうか)、問題の原因を突き止めることができます。これらのログは、1)送信メールサーバーがPHPスクリプトからメッセージを受信したかどうかを示し、受信した場合は2)受信MXが送信メールサーバーからの配信を受け入れたかどうかを示します。
mti2935 14

@ mti2935とても助かったので、見逃してしまったことに驚いています。すぐに追加します。:)
ジョンコンデ14

1
私は使用mail()しないで始めます、それはそのような貧弱な仕事をし、他のどのメールライブラリよりもデバッグが困難です

1
000webhostの同じWebサイトがnetai.netドメインで電子メールを正常に高速で送信しますが、site88.netでは、コンソールに表示される同じWebサイトにメッセージが正常に送信されますが、メッセージが表示されません。また、comuf.comドメインでもエラーが発生します(同じホスト上の同じWebサイトはnetai.netドメインでのみ機能し、net16.netでも機能します)
Nicolas Papaconstantinou

1
私の質問(stackoverflow.com/questions/44866673/…)は、この質問の複製としてマークされましたが、それでもわかりません。助言がありますか?
Zachary Elkins 2017

37

メール関数にメールヘッダーを追加します。

$header = "From: noreply@example.com\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>';
}

25
  1. 常にメール機能でヘッダーを送信してみてください。
  2. localhost経由でメールを送信する場合は、メールを送信するためのSMTP設定を行います。
  3. サーバー経由でメールを送信する場合は、サーバーでメール送信機能が有効になっていることを確認してください。

20

電子メールの送信に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 = "me@walalang.com";
    $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";
}

2
私も使用する必要がありました:require( "phpmailer / class.smtp.php");
Doug

15

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

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$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: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

後もう一つ。mail()関数は、ローカルホストで動作していません。コードをサーバーにアップロードして試してください。


1
これは実際にフォームが...私の質問は今、私は今、私は、ヘッダーに置き換えてきたことを、ユーザーの電子メールで入力を示し行うbe..howうsubmit--製
user3818620

スパムフォルダからのメールを防ぎますか?コードgmailで使用したこの方法を使用して10通以上メールを送信する場合、このメールをスパムに送信することを確認しました。
jewelhuq 2016年

OPには次の行$from = 'From: yoursite.com'; があります。これは完全な有効な電子メールアドレスのようには見えません。ローカルな部分はありません。Fromヘッダーを置き換え、さらにヘッダーを追加しました。または、$from上記の例では冗長です。そして、奇形であることはおそらくOPの元の問題でした。
Progrock 2016年

13

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

メールを送信するときに、メールアドレスを直接入力します。

mail('email@gmail.com', $subject, $message, $headers)

使用''していない""

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


10

ほとんどの場合、この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();
}
?>

サーバーにsmtpユーザーとパスワードをプレーンテキストで保存することは良い考えですか?
Juri

@Juriはおそらくそうではありません...どうすればメール機能を動作させる方法がわかりません:。(

9

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

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


9

これら2つのことを個別に、一緒に試してください。

  1. を削除 if($_POST['submit']){}
  2. 削除$from(私の腸だけ)

8

これでうまくいくと思います。if(issetPHPをHTMLから分離するために、本文の変数にを追加して連結を追加しました。

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $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

今後この問題が発生する場合は、の使用はお勧めしませんmail。これに触れるいくつかの答えがありますが、その理由はありません。

PHPのmail機能は不透明であるだけでなく、使用するMTASendmailなど)に完全に依存して機能します。mail唯一の MTAはそれを受け入れることができなかった場合はあなたを教えて(あなたが送信しようとしたとき、つまりSendmailがダウンしていました)。引き渡されたため、メールが成功したかどうかはわかりません。このように(John Condeの回答の詳細として)、MTAのログをいじるようになり、それが修正に失敗したことを十分に伝えてくれることを願っています。共有ホストを使用している場合、またはMTAログにアクセスできない場合は、運が悪いです。悲しいことに、Linuxのほとんどの標準的なインストールのデフォルトでは、この方法で処理されます。

メールライブラリ(PHPMailer、Zend Framework 2+など)は、とは非常に異なる動作をしmailます。受信メールサーバーに直接ソケットを開き、そのソケットを介してSMTPメールコマンドを直接送信します。つまり、クラスは独自のMTAとして機能します(mail最終的にメールを送信するために使用するようにライブラリに指示できますが、それを行わないことを強くお勧めします)。

つまり、受信サーバーからの応答を直接確認できます(たとえば、PHPMailerでは、デバッグ出力をオンにできます)。メールの送信に失敗したかどうか、またはその理由を推測する必要はもうありません。

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

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

$mail->SMTPDebug = 2;

また、より良いインターフェースのメリットも得られます。ではmail、あなたがライブラリとなど、すべてのヘッダ、添付ファイルを、セットアップする必要があり、あなたはそれを行うための専用の機能を持っています。また、関数がすべてのトリッキーな部分(ヘッダーなど)を実行していることも意味します。


6
$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

CodeIgniterの設定メールを利用できます。たとえば、SMTP使用する (簡単な方法):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => 'name@domain.com',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);

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

わたしにはできる!


1
fsockopen()[function.fsockopen]:php_network_getaddresses:getaddrinfo failed:そのようなホストは不明です。-このエラーが発生した場合、その理由と何をする必要がありますか?
Choudhury Saadmaan Mahmid

1
「私のために働く」は単なる逸話的な情報ですが、実際にはあまり説明されていません。ポートとsmtpパスワードは、ほとんどのユーザーにとって誤解を招くでしょう。
マリオ

「設定メール」とは何ですか?リファレンスはありますか?
Peter Mortensen

4

これを試して

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

おそらく問題はメールサーバーの設定です。このタイプの問題を回避したり、メールサーバーの問題を心配する必要がない場合は、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 = 'correo@gmail.com';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('correo@gmail.com', 'my name');
    $mail->addAddress('destination@correo.com');

    // 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;
}

1
IANAはポート465をポート587に置き換えました。これはデフォルトのメール送信ポートです。電子メールクライアントまたは送信サーバーが適切なメールサーバーによってルーティングされる電子メールを送信している場合、SMTPポート587を常にデフォルトポートとして使用する必要があります。mailgun.com/blog/which-smtp-port-understanding-ports-25-465-587を参照してください。賢明なアドバイス:何をしているのか完全に理解していない場合は、コンピューターのポートを開かないでください。

3

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

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

空の場合は、次のことを行う必要があります。

sudo apt-get install sendmail

Ubuntuサーバーを使用している場合。


それはあまりにも粗すぎて役に立たない。MTAをインストールするだけでは、MTAにアクセスできることはめったにありません。そして、完全なsendmail / postfix / qmail設定ガイドはここでは話題から外れます。
マリオ

このコメントは私の回答に関連していますか?これは私には起こらなかったし、これと同じ方法で解決しなかったためです。この質問にはさまざまな答えが考えられます。過去に上記のすべてを試した後、私もその1つでした。私の答えは問題を解決してくれたので、別の解決策としてここに提示しました。
ダニエル

はい、そうです。これは、考えられる答えの1つです。しかし、それはまだ表面的なIMOへの道です。…などの「MTAが必要」に一般化すると、リンクされたいくつかの設定ガイドが表示されますが、より実用的かもしれません。
マリオ

3

まず最初に、mail()関数のパラメーターが多すぎる可能性があります...最大5つまで持つことができます。 mail(to, subject, message, headers, parameters);

$from変数に関する限り、Linux cPanelを使用している場合は、Webホストから自動的に取得されます。cPanelのユーザー名とIPアドレスから自動的に取得されます。

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

また、mail()関数で変数の順序が正しいことを確認してください。

mail($to, $subject, $message, etc.)そのために、あるいはそうでなければ動作しない可能性があります。


3

PHPでメールを送信できない場合は、PHPMailerSwiftMailerなどの代替手段を検討してください

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('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => '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

外部メーラーを使用したくない、専用のLinuxサーバーでmail()を実行したい人向け。

PHPがメールを送信する方法についてはphp.ini、セクションで説明し[mail function]ます。

パラメータsendmail-pathは、sendmailの呼び出し方法を示します。デフォルト値はsendmail -t -iなのでsendmail -t -i < message.txt、Linuxコンソールで機能するようになれば完了です。mail.logデバッグに追加して、mail()が実際に呼び出されるようにすることもできます。

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

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

シンプルであり、ポートを開いた状態でデーモンを実行する必要がないため、MTAとしてssmtpを使用することを好みます。ssmtpはlocalhostからのメール送信にのみ適合します。また、公的なメールサービスのアカウントを介して認証済みメールを送信することもできます。ssmtpをインストールし、構成ファイルを編集します/etc/ssmtp/ssmtp.conf。Unixシステムアカウント(たとえば、cronジョブからrootへのアラート)へのローカルシステムメールも受信できるようにするには、/etc/ssmtp/revaliasesファイルを構成します。

Yandexメールの私のアカウントの設定は次のとおりです。

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password

2

これは少数のユーザーにのみ影響しますが、その少数のユーザー向けに文書化してください。この問題のために、この少数の一握りのこのメンバーは、動作するPHPメールスクリプトのトラブルシューティングに6時間を費やしました。

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

はい、わかっています。これは、実際のメールではまったく役に立ちません。しかし、私が見てきたことから、学問的な環境と現実の世界には、ほとんど共通点がほとんどありません。


それは奇妙すぎるほど具体的であり、実際には他の誰も助けにはなりません。回答の下にある[削除]リンクを使用してください。
マリオ

この文脈で「梨」とは何ですか?PHPソフトウェアリポジトリであるPEARを意味しますか?または、他の何か?例えばピア
Peter Mortensen

あなたは本当にかなり小さい」という意味ですか?それは望むことですか?どうして?
Peter Mortensen

1

このコードをローカルサーバー(開発目的のコンピューターなど)で実行している場合、受信者に電子メールは送信されません。.txtという名前のフォルダにファイルを作成しますmailoutput

000webhostまたはなどの無料のホスティングサービスを使用している場合hostinger、これらのサービスプロバイダーは、mail()機能を無効にして、電子メールのなりすまし、スパムなどの意図しない使用を防止します。この機能をサポートしているかどうかを確認するために、それらに連絡することをお勧めします。

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

PHP mail()

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

<?php
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

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

1

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

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

いくつかの可能性があります:

  1. サーバーの問題が発生しています。サーバーにメールサーバーがありません。コードは問題なく、メールはタイプで動作しているため、メールは動作していません。

  2. 投稿された値を取得していません。静的な値でコードを試してください。

  3. SMTPメールを使用してメールを送信...


0

libmailを使用できます:http ://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang= en

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

5
言及することが重要です:これは単なるmail()関数ラッパーです。メッセージの作成といくつかの仕掛けだけを追加します。
マリオ

0

エラーは次の方法で確認できます。

error_reporting(E_ALL);

そして私のサンプルコードは:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = 'someone@gmail.com';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = 'someone@gmail.com';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>

1
SMTPDebug = 0役に立たない。単純な「パスワード」もGMailで機能しません。この答えはここではあまり貢献しません。
マリオ

-2

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: no-reply@yoursite.com\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <contact@yoursite.com>'; 
    $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マーカーが行の最初から始まり、スペースやセミコロンの後に文字がないことが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.