サーチ…


パラメーター

パラメータ詳細
string $to 受信者の電子メールアドレス
string $subject 件名
string $message 電子メールの本文
string $additional_headers オプション:電子メールに追加するヘッダー
string $additional_parameters オプション:コマンドラインで設定されたメール送信アプリケーションに渡す引数

備考

電子メール私はスクリプトを送信することは決して到着しません。私は何をすべきか?

  • エラー報告を有効にして、エラーを確認してください。

  • PHPのエラーログファイルにアクセスできる場合は、それらをチェックしてください。

  • サーバー上で mail()コマンドが正しく設定されていますか? (共有ホスティングの場合は、ここで何も変更できません)。

  • 電子メールが消えてしまった場合は、迷惑メールフォルダを持つフリーメイルサービス(または迷惑メールフィルタリングを全く行わないメールアカウントを使用)を使って電子メールアカウントを開始します。このようにして、電子メールが送信されないか、送信されたのかスパムとしてフィルタリングされるのかを確認できます。

  • 可能性のある「返送先」メールに使用した「送信元」アドレスを確認しましたか?エラーメール用に別のバウンスアドレスを設定することもできます。

送信している電子メールがスパムとしてフィルタリングされています。私は何をすべきか?

  • 送信者アドレス(「送信者」)は、電子メールを送信するサーバー上で実行されるドメインに属していますか?そうでない場合は、変更してください。

    [email protected]などの送信者アドレスは使用しないでください。 reply-to先が異なるアドレスに到着する必要がある場合は、 reply-to使用してください。

  • あなたのサーバーはブラックリストに載っていますか?これは、ネイバーがひどく振る舞うときに共有ホスティングを行っているときに可能性があります。 Spamhausのようなほとんどのブラックリストプロバイダには、サーバーのIPをルックアップできるツールがあります。また、 MX Toolboxのようなサードパーティのツールもあります。

  • PHPのインストールによっては、送信者アドレスを追加するために5番目のパラメータをmail()に設定する必要があります。これがあなたに当てはまるかどうかを見てください。

  • 他のすべてが失敗した場合、などの電子メールサービスとしての使用を検討してMailgunSparkPostアマゾンSESMailjetSendinBlueまたはSendGrid少数の代わりに名前を付ける-to。彼らはすべてPHPを使って呼び出すことができるAPIを持っています。

電子メールの送信 - 基本事項、詳細、および完全な例

一般的な電子メールには3つの主要コンポーネントがあります。

  1. 受信者(電子メールアドレスとして表される)
  2. テーマ
  3. メッセージ本文

PHPでメールを送信するのは、組み込み関数mail()を呼び出すのと同じくらい簡単です。 mail()は最大5つのパラメータを取りますが、最初の3つは電子メールの送信に必要なものです(ただし、以下で説明するように4つのパラメータが一般的に使用されます)。最初の3つのパラメータは次のとおりです。

  1. 受信者の電子メールアドレス(文字列)
  2. 電子メールの件名(文字列)
  3. 電子メールの本文(文字列)(例えば電子メールの内容)

最小の例は次のコードに似ています:

mail('[email protected]', 'Email Subject', 'This is the email message body');

上記の単純な例は、内部システムの電子メールアラートのハードコーディングなどの限られた状況でうまく機能します。ただし、 mail()パラメータとして渡されたデータを変数に格納して、コードをよりきれいにして管理しやすいようにするのが一般的です(たとえば、フォーム送信から電子メールを動的に作成するなど)。

さらに、 mail()は4番目のパラメータを受け取ります。これにより、あなたのメールで追加のメールヘッダーを送ることができます。これらのヘッダーでは、次の項目を設定できます。

  • ユーザーに表示されるFrom名前と電子メールアドレス
  • ユーザーの応答が送信されるReply-To電子メールアドレス
  • X-Mailerような追加の非標準ヘッダーは、この電子メールがPHP経由で送信されたことを受信者に伝えることができます
$to      = '[email protected]';             // Could also be $to      = $_POST['recipient'];  
$subject = 'Email Subject';                     // Could also be $subject = $_POST['subject'];  
$message = 'This is the email message body';    // Could also be $message = $_POST['message'];  
$headers = implode("\r\n", [
    'From: John Conde <[email protected]>',
    'Reply-To: [email protected]',
    'X-Mailer: PHP/' . PHP_VERSION
]);

オプションの5番目のパラメーターは、 sendmail_path構成設定で定義されているように、メールを送信するときに使用するように構成されたプログラムにコマンド行オプションとして追加のフラグを渡すために使用できます。たとえば、 -f sendmailオプションを指定してsendmail / postfixを使用するときに、これを使用してエンベロープ送信者アドレスを設定することができます。

$fifth  = '[email protected]';

mail()使用はかなり信頼できるものですが、 mail()が呼び出されたときに電子メールが送信されることは決して保証されません。電子メールの送信時にエラーが発生する可能性があるかどうかを確認するには、 mail()戻り値を取得する必要があります。メールが正常に配信された場合はTRUEが返されます。それ以外の場合は、 FALSE返されFALSE

$result = mail($to, $subject, $message, $headers, $fifth);

mail()TRUE返すかもしれませんが 、電子メールが送信されたか、または電子メールが受信者によって受信されることを意味しませ 。これは、メールがシステムのメールシステムに正常に引き渡されたことを示しています。

HTMLメールを送信したい場合は、もっと多くの作業を行う必要はありません。必要がある:

  1. MIME-Versionヘッダーを追加する
  2. Content-Typeヘッダーを追加する
  3. あなたの電子メールコンテンツがHTMLであることを確認してください
$to      = '[email protected]';                            
$subject = 'Email Subject';                                     
$message = '<html><body>This is the email message body</body></html>';       
$headers = implode("\r\n", [
    'From: John Conde <[email protected]>',
    'Reply-To: [email protected]',
    'MIME-Version: 1.0',
    'Content-Type: text/html; charset=ISO-8859-1',
    'X-Mailer: PHP/' . PHP_VERSION
]);

PHPのmail()関数の使用例

<?php

// Debugging tools. Only turn these on in your development environment.

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

// Special mail settings that can make mail less likely to be considered spam
// and offers logging in case of technical difficulties.

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

// The components of our email

$to      = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$headers = implode("\r\n", [
    'From: [email protected]',
    'Reply-To: [email protected]',
    'X-Mailer: PHP/' . PHP_VERSION
]);

// Send the email

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

// Check the results and react accordingly

if ($result) {
  
    // Success! Redirect to a thank you page. Use the
    // POST/REDIRECT/GET pattern to prevent form resubmissions
    // when a user refreshes the page.
  
    header('Location: http://example.com/path/to/thank-you.php', true, 303);
    exit;
  
}
else {
  
    // Your mail was not sent. Check your logs to see if
    // the reason was reported there for you.
  
}

関連項目

公式文書

関連するスタックオーバーフローに関する質問

代替メーラ

メールサーバー

関連トピック

mail()を使用してHTMLメールを送信する

<?php
$to      = '[email protected]';
$subject = 'Sending an HTML email using mail() in PHP';
$message = '<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>';

$headers = implode("\r\n", [
    "From: John Conde <[email protected]>",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION,
    "MIME-Version: 1.0",
    "Content-Type: text/html; charset=UTF-8"
]);

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

これはプレーンテキストのメールを送信するのと大きく異なるわけではありません。コンテンツ本文の主な違いはHTML文書のように構造化されており、電子メールクライアントがHTMLとして電子メールを流通させるためには2つのヘッダーが追加されている必要があります。彼らです:

  • MIMEバージョン:1.0
  • Content-Type:text / html; charset = UTF-8

PHPMailerを使用してプレーンテキストメールを送信する

基本テキストメール

<?php

$mail = new PHPMailer();

$mail->From     = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject  = "Subject Text";
$mail->Body     = "This is a sample basic text email using PHPMailer.";

if($mail->send()) {
    // Success! Redirect to a thank you page. Use the
    // POST/REDIRECT/GET pattern to prevent form resubmissions
    // when a user refreshes the page.
  
    header('Location: http://example.com/path/to/thank-you.php', true, 303);
    exit;
} 
else {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

追加受信者、CC受信者、BCC受信者の追加

<?php

$mail = new PHPMailer();

$mail->From     = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]"); 
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject  = "Subject Text";
$mail->Body     = "This is a sample basic text email using PHPMailer.";

if($mail->send()) {
    // Success! Redirect to a thank you page. Use the
    // POST/REDIRECT/GET pattern to prevent form resubmissions
    // when a user refreshes the page.
  
    header('Location: http://example.com/path/to/thank-you.php', true, 303);
    exit;
} 
else {
    echo "Error: " . $mail->ErrorInfo;
}   

mail()を使用して添付ファイルで電子メールを送信する

<?php

$to         = '[email protected]';
$subject    = 'Email Subject';
$message    = 'This is the email message body';

$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);

/* Attachment content transferred in Base64 encoding
MUST be split into chunks 76 characters in length as
specified by RFC 2045 section 6.8. By default, the
function chunk_split() uses a chunk length of 76 with
a trailing CRLF (\r\n). The 76 character requirement
does not include the carriage return and line feed */
$content = chunk_split(base64_encode($content));

/* Boundaries delimit multipart entities. As stated
in RFC 2046 section 5.1, the boundary MUST NOT occur
in any encapsulated part. Therefore, it should be
unique. As stated in the following section 5.1.1, a
boundary is defined as a line consisting of two hyphens
("--"), a parameter value, optional linear whitespace,
and a terminating CRLF. */
$prefix     = "part_"; // This is an optional prefix
/* Generate a unique boundary parameter value with our
prefix using the uniqid() function. The second parameter
makes the parameter value more unique. */
$boundary   = uniqid($prefix, true);

// headers
$headers    = implode("\r\n", [
    'From: [email protected]',
    'Reply-To: [email protected]',
    'X-Mailer: PHP/' . PHP_VERSION,
    'MIME-Version: 1.0',
    // boundary parameter required, must be enclosed by quotes
    'Content-Type: multipart/mixed; boundary="' . $boundary . '"',
    "Content-Transfer-Encoding: 7bit",
    "This is a MIME encoded message." // message for restricted transports
]);

// message and attachment
$message    = implode("\r\n", [ 
    "--" . $boundary, // header boundary delimiter line
    'Content-Type: text/plain; charset="iso-8859-1"',
    "Content-Transfer-Encoding: 8bit",
    $message,
    "--" . $boundary, // content boundary delimiter line
    'Content-Type: application/octet-stream; name="RenamedFile.pdf"',
    "Content-Transfer-Encoding: base64",
    "Content-Disposition: attachment",
    $content,
    "--" . $boundary . "--" // closing boundary delimiter line
]);

$result = mail($to, $subject, $message, $headers); // send the email

if ($result) {
    // Success! Redirect to a thank you page. Use the
    // POST/REDIRECT/GET pattern to prevent form resubmissions
    // when a user refreshes the page.
  
    header('Location: http://example.com/path/to/thank-you.php', true, 303);
    exit;
}
else {
    // Your mail was not sent. Check your logs to see if
    // the reason was reported there for you.
}

コンテンツ転送エンコーディング

利用可能なエンコーディングは、 7bit8bitバイナリquoted-printablebase64ietf-tokenx-tokenです。 RFC 2045、セクション6.4で述べたように、これらのエンコーディングの、ヘッダがマルチパートのContent-Typeを有する場合、コンテンツ転送エンコードは7ビット 、8ビット 、またはバイナリ以外の他の値あってはなりません

この例では、マルチパートヘッダーのUS-ASCII文字を表す7ビットエンコーディングを選択しています。なぜなら、RFC 2045のセクション6に記載されているように、このエンコーディングのみをサポートするプロトコルがあるからです。境界内のデータは、パーツ単位でエンコードできます(RFC 2046、セクション5.1)。この例はまさにこれを行います。追加の文字をサポートする必要があるかもしれないので、text / plainメッセージを含む最初の部分は8bitと定義されています。この場合、Latin1(iso-8859-1)文字セットが使用されています。 2番目の部分は添付ファイルなので、base64でエンコードされたアプリケーション/オクテットストリームとして定義されています。 base64は任意のデータを7ビットの範囲に変換するので、制限された転送(RFC 2045、セクション6.2)で送ることができます。

PHPMailerを使用してHTML電子メールを送信する

<?php

$mail = new PHPMailer();

$mail->From     = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]"); 
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject  = "Subject Text";
$mail->isHTML(true);
$mail->Body     = "<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>";
$mail->AltBody = "This paragraph is not bold.\n\nThis text is not italic.";

if($mail->send()) {
    // Success! Redirect to a thank you page. Use the
    // POST/REDIRECT/GET pattern to prevent form resubmissions
    // when a user refreshes the page.
  
    header('Location: http://example.com/path/to/thank-you.php', true, 303);
    exit;
} 
else {
    echo "Error: " . $mail->ErrorInfo;
}   

PHPMailerを使用して添付ファイルで電子メールを送信する

<?php

$mail = new PHPMailer();

$mail->From     = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject  = "Subject Text";
$mail->Body     = "This is a sample basic text email with an attachment using PHPMailer.";

// Add Static Attachment
$attachment = '/path/to/your/file.pdf';
$mail->AddAttachment($attachment , 'RenamedFile.pdf');

// Add Second Attachment, run-time created. ie: CSV to be open with Excel
$csvHeader = "header1,header2,header3";
$csvData = "row1col1,row1col2,row1col3\nrow2col1,row2col2,row2col3";

$mail->AddStringAttachment($csvHeader ."\n" . $csvData, 'your-csv-file.csv', 'base64', 'application/vnd.ms-excel');

if($mail->send()) {
    // Success! Redirect to a thank you page. Use the
    // POST/REDIRECT/GET pattern to prevent form resubmissions
    // when a user refreshes the page.
  
    header('Location: http://example.com/path/to/thank-you.php', true, 303);
    exit;
} 
else {
    echo "Error: " . $mail->ErrorInfo;
}   

Sendgridを使用してプレーンテキストメールを送信する

基本テキストメール

<?php

$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email    = new SendGrid\Email();

$email->addTo("[email protected]")
      ->setFrom("[email protected]")
      ->setSubject("Subject Text")
      ->setText("This is a sample basic text email using ");

$sendgrid->send($email);

追加受信者、CC受信者、BCC受信者の追加

<?php

$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email    = new SendGrid\Email();

$email->addTo("[email protected]")
      ->setFrom("[email protected]")
      ->setSubject("Subject Text")
      ->setHtml("<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>");
      
$personalization = new Personalization();
$email = new Email("Recepient Name", "[email protected]");
$personalization->addTo($email);
$email = new Email("RecepientCC Name", "[email protected]");
$personalization->addCc($email);
$email = new Email("RecepientBCC Name", "[email protected]");
$personalization->addBcc($email);
$email->addPersonalization($personalization);
    
$sendgrid->send($email);

Sendgridを使用して添付ファイルで電子メールを送信する

<?php

$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email    = new SendGrid\Email();

$email->addTo("[email protected]")
      ->setFrom("[email protected]")
      ->setSubject("Subject Text")
      ->setText("This is a sample basic text email using ");
      
$attachment = '/path/to/your/file.pdf';
$content    = file_get_contents($attachment);
$content    = chunk_split(base64_encode($content));

$attachment = new Attachment();
$attachment->setContent($content);
$attachment->setType("application/pdf");
$attachment->setFilename("RenamedFile.pdf");
$attachment->setDisposition("attachment");
$email->addAttachment($attachment);

$sendgrid->send($email);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow