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

492
user3818620 2014-07-09 16:18.
<?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ページにありますthankyou.phpが、上記のPHPコードが埋め込まれている別の「送信ありがとうございます」ページに送信されます。コードは完全に送信されますが、メールを送信することはありません。どうすればこれを修正できますか?

25 answers

533
John Conde 2014-07-09 16:21.

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

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

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

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

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

PHPで有用なエラーメッセージを取得するにはどうすればよいですか?PHPで有用なエラーメッセージを取得するにはどうすればよいですか?参照してください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サーバーは、Webサーバーを介して電子メールを送信するすべての試行をログに記録する必要があります。これらのログの場所はさまざまですが(サーバー管理者にログの場所を尋ねる必要がある場合があります)、通常はユーザーのルートディレクトリの下にありlogsます。内部には、メール送信の試みに関連してサーバーが報告したエラーメッセージがあります。

ポート接続障害を確認します

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

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

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

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

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

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

直後に具体的な障害がないPHP mail()エラーをキャッチし、妥当なユーザーエラーメッセージを表示する場合にのみお勧めします。

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

mail()機能:

TRUEメールの配信が正常に受け入れられた場合は戻りますFALSE。それ以外の場合は戻ります。メールの配信が承認されたからといって、メールが実際に目的の宛先に到達するわけではないことに注意してください。

これは次の理由で注意することが重要です。

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

したがってFALSE、正しい方向を示すのに役立ちますが、必ずしも電子メールが正常に送信されたことを意味するTRUEわけでありませ。これは注意することが重要です!

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

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

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

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

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

PHPを介して送信されたメールが受信者のスパムフォルダに送信されないようにするには、PHPコードとその他の両方で、電子メールがスパムとしてマークされる可能性を最小限に抑えるためのさまざまな方法があります。Michiel deMareからの良いヒントは次のとおりです。

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

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

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

一部のスパムソフトウェアは、「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はこれらのエラーをキャッチしないため、構文が正しいことを再確認してください。

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // 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 = '[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が提供するメールアカウントなど)に送信します。

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

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

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

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

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

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

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

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

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

localhostメールサーバーが構成されていることを確認します

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

基本的なメールサーバーをインストールすることで、これを克服できます。Windowsの場合、無料のMercuryMailを使用できます。

SMTPを使用してメールを送信することもできます。これを行う方法については、VikasDwivediからのこのすばらしい回答を参照してください。

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

MTAとPHPのログファイルに加えてPHPメール:mail.log設定をオーバーライドまたはバイパスする方法具体的に有効にすることができます。完全な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 / Webサーバーのセットアップをテストするために利用できるさまざまな配信およびスパム性チェックサービスがあります。通常、メールプローブを次の宛先に送信します。そのアドレスに、配信レポートと、後でより具体的な障害または分析を取得します。

別のメーラーを使用する

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

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

39
er.irfankhan11 2015-07-28 04:01.

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

$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>';
}
25
sonam gupta 2015-05-21 03:23.
  1. 常にメール機能でヘッダーを送信してみてください。
  2. ローカルホストを介してメールを送信する場合は、メールを送信するためのSMTP設定を行います。
  3. サーバー経由でメールを送信する場合は、サーバーでメール送信機能が有効になっていることを確認してください。
21
oneDerer 2014-07-09 16:55.

電子メールの送信に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 = "[email protected]"; // 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";
}
17
user1258544 2014-07-09 17:22.

メールを送信する前に、いくつかのヘッダーを追加するだけです。

<?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()関数はローカルホストで機能していません。コードをサーバーにアップロードして試してください。

13
bat .t 2015-09-30 04:25.

次のようにすることで、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 protected]', $subject, $message, $headers)

使用するの''ではなく""

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

10
Karthik 2016-06-23 23:02.

ほとんどの場合、この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();
}
?>
9
iatboy 2014-08-05 17:49.

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

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

9
vldfr 2015-02-12 05:20.

これら2つのことを別々にそして一緒に試してください:

  1. を削除します if($_POST['submit']){}
  2. 取り除く$from(私の腸だけ)
8
Stephen M 2015-01-03 16:32.

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

<?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
Machavity 2016-05-21 02:45.

今後これを見つけた人には、を使用することはお勧めしませんmail。これに触れるいくつかの答えがありますが、その理由はありません。

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

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

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

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

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

$mail->SMTPDebug = 2;

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

6
Chirag patel 2015-07-13 21:27.
$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
dEsta88 2014-10-07 12:33.

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

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for 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
}

わたしにはできる!

4
Gaurav Sirauthiya 2015-06-24 00:58.

これを試して

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
Jack Ch 2018-03-20 09:09.

たぶん問題はメールサーバーの設定です。この種の問題を回避するため、またはメールサーバーの問題を心配する必要がない場合は、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
Daniel 2017-09-24 17:50.

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

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

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

sudo apt-get install sendmail

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

3
aidangig 2016-02-01 04:15.

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

$fromLinux cPanelを使用している場合、変数に関する限り、それは自動的にWebホストから取得されます。これは、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.)順序でないと、機能しない可能性があります。

3
John Slegers 2016-02-11 03:23.

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('[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
user3132194 2017-06-22 02:07.

外部メーラーを使用せず、専用の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: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

ssmtpはシンプルで、開いているポートでデーモンを実行する必要がないため、MTAとしてssmtpを使用することを好みます。ssmtpは、ローカルホストからメールを送信する場合にのみ適合します。また、パブリックメールサービスのアカウントを介して認証済みの電子メールを送信することもできます。ssmtpをインストールし、構成ファイルを編集します/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
2
TonyLuigiC 2017-04-05 15:09.

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

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

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

1
Ron 2017-04-01 17:30.

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

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

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

PHPメール()

ホスティングサービスが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
Bad Loser 2019-08-21 23:14.

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
SuReSh 2015-04-28 20:08.

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

  1. サーバーの問題に直面しています。サーバーにはメールサーバーがありません。つまり、コードは問題なく、メールはタイプで機能しているため、メールは機能していません。

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

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

0
krishna 2018-12-24 04:25.

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

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 = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $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';
?>
0
ofri cofri 2020-08-16 15:44.

Hostgatorでホストされているアプリで立ち往生している場合は、これが私の問題を解決したものです。詳細な解決策を投稿してくれた人に感謝します。リンクがいつかオフラインになった場合の概要は次のとおりです。

  • サーバーでsendmailパスを探します。それを確認する簡単な方法は、あなただけがアクセスするページに次のコードを一時的に記述して、生成された情報を読み取ることです<?php phpinfo(); ?>。このページを開いて、を探しますsendmail path。(次に、このコードを削除することを忘れないでください!)
  • 問題と修正: sendmailパスがのみを示している-t -i場合は、サーバーを編集してphp.ini次の行を追加します。sendmail_path = /usr/sbin/sendmail -t -i;

しかし、PHPmail()機能でメールを送信できるようになった後、認証されていないメールを送信することを知り、別の問題が発生しました。電子メールはすべて私のHotmailの迷惑メールボックスに落ちていて、一部の電子メールは配信されませんでした。これは、認証されていないという事実に関連していると思います。私は切り替えることを決めた理由ですmail()PHPMailer、すべての後に、SMTPで。

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

ランボルギーニの創設者であるフェルッチオランボルギーニが100歳になるのは毎日ではありません(そうです、彼は死んでいて、まだ死んでいると思います。

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

Appleが自動車分野に参入するという噂はかなり前から渦巻いており、AppleウォッチャーがSixtyEight Researchという会社がAppleの自動車研究開発のシェル会社である可能性が高いと判断したとき、その渦巻きは本当に渦巻いた。また、会社が購入した車は1台だけであることが知られており、その車はAppleが何を考えているかについての手がかりでいっぱいになる可能性があることも伝えています。

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

太陽系の外側にある架空の大きな物体である惑星Xの探索は、何十年にもわたって人間を魅了してきました。その検索の最新の章は、地球の10倍の大きさで、公転周期が15であるほど遠くにある惑星を指しています。

キャムニュートン、ゴッドダム

キャムニュートン、ゴッドダム

カムニュートンは昨日、簡単な265ヤードと3回のタッチダウンでファルコンズを引き裂き、別の素晴らしいゲームをしました。その日のハイライトは、上のタッチダウンスローでした。これは、視聴するたびにばかげているだけです。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language