PHPメール機能がメール送信を完了しない
<?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コードが埋め込まれている別の「送信ありがとうございます」ページに送信されます。コードは完全に送信されますが、メールを送信することはありません。どうすればこれを修正できますか?
回答
この回答には、mail()
関数自体の使用法にのみ適用される部分がありますが、これらのトラブルシューティング手順の多くは、任意のPHPメールシステムに適用できます。
スクリプトが電子メールを送信していないように見える理由はさまざまです。明らかな構文エラーがない限り、これらのことを診断することは困難です。これがないと、以下のチェックリストを実行して、発生する可能性のある潜在的な落とし穴を見つける必要があります。
エラー報告が有効になっていて、すべてのエラーを報告するように設定されていることを確認してください
エラー報告は、コードのバグや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サーバーは、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 deMareからの良いヒントは次のとおりです。
- SPFやDKIMなどの電子メール認証方法を使用して、電子メールとドメイン名が一緒に属していることを証明し、ドメイン名のなりすましを防ぎます。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のログファイルに加えて、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 / Webサーバーのセットアップをテストするために利用できるさまざまな配信およびスパム性チェックサービスがあります。通常、メールプローブを次の宛先に送信します。そのアドレスに、配信レポートと、後でより具体的な障害または分析を取得します。
- mail-tester.com(無料/シンプル)
- glockapps.com(無料/ $$$)
- senforensics.com(サインアップ/ $$$)
- mailtrap.io(pro / $$$)
- ultratools /…/ emailTest(無料/ MXチェックのみ)
- さまざま:http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
別のメーラーを使用する
PHPの組み込みmail()
関数は便利で、多くの場合作業を完了しますが、欠点があります。幸いなことに、上記で概説した多くの問題の処理を含む、より強力で柔軟性のある代替手段があります。
- 最も人気のある存在:PHPMailer
- 同様に機能的:SwiftMailer
- または、古いPEAR :: Mailですら。
これらはすべて、プロのSMTPサーバー/サービスプロバイダーと組み合わせることができます。(通常の08/15共有ウェブホスティングプランは、電子メールのセットアップ/構成可能性に関してはヒットまたはミスしているためです。)
メール関数にメールヘッダーを追加します。
$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>';
}
- 常にメール機能でヘッダーを送信してみてください。
- ローカルホストを介してメールを送信する場合は、メールを送信するためのSMTP設定を行います。
- サーバー経由でメールを送信する場合は、サーバーでメール送信機能が有効になっていることを確認してください。
電子メールの送信に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";
}
メールを送信する前に、いくつかのヘッダーを追加するだけです。
<?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()
関数はローカルホストで機能していません。コードをサーバーにアップロードして試してください。
次のようにすることで、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分遅れで受信されました。
ほとんどの場合、この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();
}
?>
このmail()
機能のみを使用する場合は、構成ファイルを完成させる必要があります。
メール拡張を開き、などを設定する必要がありSMTP smtp_port
ます。最も重要なのは、ユーザー名とパスワードです。それがないと、メールを送信できません。また、PHPMail
クラスを使用して送信することもできます。
これら2つのことを別々にそして一緒に試してください:
- を削除します
if($_POST['submit']){}
- 取り除く
$from
(私の腸だけ)
これでうまくいくと思います。if(isset
PHPを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>';
}
}
?>
今後これを見つけた人には、を使用することはお勧めしませんmail
。これに触れるいくつかの答えがありますが、その理由はありません。
PHPのmail
機能は不透明であるだけでなく、作業を行うために使用するMTA(Sendmailなど)に完全に依存しています。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
、あなたがライブラリとなど、すべてのヘッダ、添付ファイルを、セットアップする必要があり、あなたはそれを行うための専用の機能を持っています。また、関数がすべてのトリッキーな部分(ヘッダーなど)を実行していることも意味します。
$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>";
}
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
}
わたしにはできる!
これを試して
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>
';
}
}
たぶん問題はメールサーバーの設定です。この種の問題を回避するため、またはメールサーバーの問題を心配する必要がない場合は、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;
}
サーバーにSendmailがインストールされていることを確認してください。
コードをチェックし、そこに問題がないことを確認した場合は、/ var / mailに移動して、そのフォルダーが空かどうかを確認します。
空の場合は、次のことを行う必要があります。
sudo apt-get install sendmail
Ubuntuサーバーを使用している場合。
まず第一に、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 = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
また、mail()関数の変数の順序が正しいことを確認してください。
このmail($to, $subject, $message, etc.)
順序でないと、機能しない可能性があります。
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の使用方法の詳細については、公式ドキュメントを参照してください。
外部メーラーを使用せず、専用の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
これはほんの一握りのユーザーにのみ影響しますが、そのほんの一握りについて文書化してほしいと思います。その小さな一握りのこのメンバーは、この問題のために、動作しているPHPメールスクリプトのトラブルシューティングに6時間を費やしました。
www.AceITLab.comからXAMPPを実行している大学に行く場合は、教授が教えてくれなかったことを知っておく必要があります。AceITLabファイアウォール(Windowsファイアウォールではない)がXAMPPのMercuryMailをブロックします。別のメールクライアントを使用する必要があります。pearが機能しています。セキュリティ設定が低いGmailアカウントに送信する必要があります。
はい、私は知っています、これは実際の電子メールにはまったく役に立たないです。しかし、私が見てきたことから、学術的な設定と現実の世界には、貴重な共通点がほとんどないことがよくあります。
このコードをローカルサーバー(つまり、開発目的のコンピューター)で実行している場合、受信者に電子メールは送信されません。。.txt
という名前のフォルダにファイルを作成しますmailoutput
。
000webhost
またはのような無料のホースサービスを使用している場合hostinger
、それらのサービスプロバイダーmail()
は、電子メールのなりすましやスパムなどの意図しない使用を防ぐために機能を無効にします。この機能をサポートしているかどうかを確認するために、サービスプロバイダーに連絡することをお勧めします。
サービスプロバイダーがmail()関数をサポートしていることが確実な場合は、この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);
?>
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時間を無駄にしました...あなたのスパムフォルダをチェックすることを忘れないでください!
いくつかの可能性があります:
サーバーの問題に直面しています。サーバーにはメールサーバーがありません。つまり、コードは問題なく、メールはタイプで機能しているため、メールは機能していません。
投稿された値を取得していません。静的な値でコードを試してください。
SMTPメールを使用してメールを送信します...
次の方法でエラーを確認できます。
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';
?>
Hostgatorでホストされているアプリで立ち往生している場合は、これが私の問題を解決したものです。詳細な解決策を投稿してくれた人に感謝します。リンクがいつかオフラインになった場合の概要は次のとおりです。
- サーバーでsendmailパスを探します。それを確認する簡単な方法は、あなただけがアクセスするページに次のコードを一時的に記述して、生成された情報を読み取ることです
<?php phpinfo(); ?>
。このページを開いて、を探しますsendmail path
。(次に、このコードを削除することを忘れないでください!) - 問題と修正: sendmailパスがのみを示している
-t -i
場合は、サーバーを編集してphp.ini
次の行を追加します。sendmail_path = /usr/sbin/sendmail -t -i;
しかし、PHPmail()
機能でメールを送信できるようになった後、認証されていないメールを送信することを知り、別の問題が発生しました。電子メールはすべて私のHotmailの迷惑メールボックスに落ちていて、一部の電子メールは配信されませんでした。これは、認証されていないという事実に関連していると思います。私は切り替えることを決めた理由ですmail()
とPHPMailer
、すべての後に、SMTPで。