
PHPメールの実装方法と手順|よくあるトラブルと対処法も解説
「Webサイトのフォームから自動でメールを送れるようにしたい」
「PHPでメールを実装する手順や、運用する際の注意点が知りたい」
自社サイトを運用する中で上記のお悩みはありませんか?
PHPはWeb開発で広く使われるプログラミング言語で、メール送信機能を実装するためにも用いられます。しかし、単純に送信するだけでは文字化けしたり、迷惑メールと判定されたりする問題が起きがちです。
本記事では、PHPでメールを実装する主な方法やトラブルの対処法などを詳しく解説します。
なお、セキュリティ性に優れたメールフォームを設置したいなら、フォーム作成ツール「formrun(フォームラン)」の利用がおすすめです。
「formrun(フォームラン)」には、以下の特徴があります。
自動返信や個別メール送信などの豊富なメール機能
購読者のリスト管理を効率化できる
申込フォームをドラッグ&ドロップ操作で作成できる
SalesforceやkintoneなどのCRMやSlack・Chatworkなどの通知ツールとの連携が可能
ISMS・Pマーク取得済みの万全のセキュリティ
▼「formrun(フォームラン)」を活用すれば、直感的な操作で自社業務に即したフォームを簡単に作成できます。
目次[非表示]
PHPメールを実装する3つの方法
PHPでメールを実装する方法は、主に3つ存在します。
mail関数でメールを送信する方法
mb_send_mail関数でメールを送信する方法
PHPクラスライブラリでメールを送信する方法
基本的な関数を使う方法から、高機能なライブラリを利用する方法まで、順番に解説します。
mail関数でメールを送信する方法
mail関数は、PHPに標準で組み込まれている基本的なメール送信関数で、シンプルさが特徴です。主に4つの情報(宛先、件名、本文、追加ヘッダ)を指定するだけで、メールを送信可能です。
追加ヘッダには、送信元のメールアドレスを指定する必要があり、複数のヘッダを指定する場合は、特定の改行コード(CRLF)で区切ります。
Windows環境で利用する場合は、PHPの設定ファイルであるphp.iniファイルに、使用するSMTPサーバーとポート番号をあらかじめ設定しておく必要があります。
mail関数でメールを送信する際のコード例は、以下のとおりです。
<?php // 宛先 $to = "recipient@example.com"; // 件名 $subject = "Test Mail"; // 本文 $message = "This is a test mail.\r\nHello!"; // 追加ヘッダ(Fromは必須) $headers = "From: sender@example.com"; // メール送信 if (mail($to, $subject, $message, $headers)) { echo "メール送信に成功しました"; } else { echo "メール送信に失敗しました"; } ?> |
mail関数は手軽ですが、日本語の文字化け対策やSMTP認証などは自分で行わなければならず、手間がかかるのが難点です。
mb_send_mail関数でメールを送信する方法
mb_send_mail関数は、mail関数と同じくPHPの標準関数で、日本語のようにマルチバイト文字のメール送信に特化しています。日本語メール送信時に必要な文字コードの処理を自動で行ってくれる点がメリットです。
mb_language('Japanese')やmb_internal_encoding('UTF-8')などの関数を事前に呼び出し、使用する言語や文字コードを設定しておくだけで、日本語の文字化けを防ぎやすくなります。
また、使い方はmail関数とよく似ており、指定する情報や送信結果の受け取り方もほぼ同じです。
mb_send_mail関数でメールを送信する際のコード例は、以下のとおりです。
<?php // 言語と文字コードの設定(日本語メール送信前に必須) mb_language("Japanese"); mb_internal_encoding("UTF-8"); // 宛先 $to = "recipient@example.com"; // 件名(日本語対応) $subject = "テストメール"; // 本文(日本語対応) $message = "これは日本語のテストメールです。\r\n問題なく表示されているでしょうか。"; // 追加ヘッダ $headers = "From: sender@example.com"; // メール送信 if (mb_send_mail($to, $subject, $message, $headers)) { echo "メール送信に成功しました"; } else { echo "メール送信に失敗しました"; } ?> |
ただし、mail関数と同様に、SMTP認証など複雑な機能は持っていないため、別途対応が必要です。
PHPクラスライブラリでメールを送信する方法
PHPクラスライブラリは、メール送信に関するさまざまな機能があらかじめ部品(クラス)としてまとめられたプログラムの集まりです。
mail関数と違い、ライブラリを使うとSMTP認証や、ファイルの添付、画像などを含むHTMLメールの送信など、より高度な機能を簡単に実装できます。
代表的なライブラリには「PHPMailer」や「Symfony Mailer」などがあります。
代表的なPHPクラスライブラリは2つ存在する
PHPでメール送信を実装する方法には、mail 関数や mb_send_mail 関数を直接使う方法のほかに、より高度な機能をまとめて利用できる「クラスライブラリ」 を活用する方法があります。
中でも有名なライブラリが次の2つです。
- PHPMailer
- Symfony Mailer
PHPMailer
「PHPMailer」は、WordPressの内部でも使用されている定番のメール送信ライブラリです。
SMTP認証、HTMLメール、添付ファイルなど、メール送信に必要な機能が最初から豊富に揃っており、実務でも広く使われています。
Symfony Mailer
「Symfony Mailer」は、よりモダンなPHPコードに対応した設計で、近年人気が高まっているライブラリです。外部のメール配信サービス(SendGrid、Mailgunなど)との連携がしやすい点が特徴です。
PHPMailer PHPメールを実装する手順【3STEP】
ここでは、広く使われているライブラリの一つである「PHPMailer」を使って、メールを送信する手順を3つのステップで解説します。
PHPMailerをComposerでインストールする
送信コードを記述する
SMTP設定とGmail連携を行う
Composerを使った、標準的な導入手順を見ていきましょう。
1.PHPMailerをComposerでインストールする
はじめに、PHPMailerライブラリを自分の開発環境にインストールします。Composerが利用できる環境であれば、コマンドラインで「composer require phpmailer/phpmailer」と命令を実行するだけで、インストール完了です。
インストール後、PHPのプログラムファイル内で「require 'vendor/autoload.php';」と記述を追加すると、インストールしたライブラリが自動的に読み込まれます。
さらに、「use PHPMailer\PHPMailer\PHPMailer;」のuse文を記述し、PHPMailerのクラスを使うことを宣言しましょう。
もしComposerが使えない環境の場合は、GitHubからPHPMailerのファイルを直接ダウンロードし、必要なファイルをrequire文で個別に読み込む方法もあります。
2.送信コードを記述する
ライブラリの準備ができたら、次にメールを送信するためのPHPコードを記述します。まず、PHPMailerのインスタンスを生成します。
次に、CharSet(文字セット)に「UTF-8」を指定し、Encoding(エンコード方式)に「base64」などを設定しましょう。
続いて、setFromで送信元のメールアドレスと名前、addAddressで送信先のメールアドレスを設定します。Subjectで件名、Bodyで本文をそれぞれ設定してください。
最後にsend()メソッドを実行すると、メールが送信されます。send()メソッドは送信結果を返すため、プログラム上で送信が成功したか失敗したかを判定できます。
3.SMTP設定とGmail連携を行う
PHPMailerを使い、Gmailアカウント経由でメールを送信する設定(SMTP連携)も行えます。
isSMTP()を呼び出してSMTP(メール送信プロトコル)の使用を宣言します。次に、Gmail用の設定としてHostに「smtp.gmail.com」、Portに「587」(TLS暗号化の場合)を指定しましょう。
SMTPAuthをtrueにしてSMTP認証を有効化し、UsernameとPasswordにGmailアカウントの情報を設定します。注意点として、Gmailで2段階認証を使用している場合は、通常のパスワードではなく、「アプリパスワード」を別途生成して設定する必要があります。
もし接続がうまくいかない場合は、SMTPDebugを設定すると、通信の詳細なログが出力され、問題解決の手がかりになるでしょう。
PHPメールの文字化けを防ぐ3つのポイント
メールの文字化けはあらゆる言語で起こり得ますが、特に日本語でのメールでは注意が必要です。
これは、日本語が マルチバイト文字(1文字を複数バイトで扱う文字) を含んでおり、英数字だけで構成されるメールに比べて、文字コードの設定やエンコードの影響を受けやすいためです。
日本語には、
全角・半角の違い
機種依存文字
絵文字や特殊記号
複数の文字コード規格(UTF-8 / ISO-2022-JP など)の併存
といった要素があり、適切に処理しないと文字化けが起こりやすい構造になっています。
文字化けを防ぐためには、文字コードの扱いに注意する必要があります。ここでは、文字化けを防ぐための3つの重要なポイントを解説します。
エンコード設定(ISO-2022-JP・UTF-8)の選び方
件名と本文の正しいエンコード方法
差出人名の文字化け対策
上記の設定を正しく行うと、受信側でメールが正しく表示されるようになります。
エンコード設定(ISO-2022-JP・UTF-8)の選び方
メールの文字コード(エンコード)設定には、主に「ISO-2022-JP」と「UTF-8」の2種類が使われます。
ISO-2022-JPは、古くから使われている文字コードで、古いメールソフトや一部の携帯電話(ガラケー)にも対応している互換性の高さが特徴です。しかし、一部の旧漢字や記号(JIS第3・第4水準漢字)は表示できず、文字化けする場合があります。
一方、UTF-8は、現在主流の文字コードで、世界中のほぼすべての文字を表現できます。しかし、ごく一部の古い環境ではUTF-8に対応しておらず、文字化けする可能性がゼロではありません。
PHPのmb_send_mail関数を使う場合、mb_language('Japanese')を設定するとISO-2022-JPで送信され、mb_language('uni')とmb_internal_encoding('UTF-8')を設定するとUTF-8で送信されます。
件名と本文の正しいエンコード方法
メールの本文だけでなく、件名も正しくエンコードする必要があります。件名に日本語を含める場合は、mb_encode_mimeheader()関数を使って、MIMEヘッダ(メールの仕様)に合わせた形式にエンコードしましょう。
本文は、mb_convert_encoding()関数を使い、送信したい文字コード(ISO-2022-JPやUTF-8など)へ正しく変換します。特に、機種依存文字(特定の環境でしか表示されない文字)を含む場合は、「ISO-2022-JP-MS」の形式に変換しなければなりません。
さらに、メールヘッダのContent-Typeで、メールがどの文字コードで作成されているかを明示的に指定します。
差出人名の文字化け対策
メールの差出人名(Fromヘッダに含まれる名前)も、日本語を使用する場合は文字化け対策が必須です。差出人名も、件名と同様にmb_encode_mimeheader()関数を使ってエンコードしましょう。
Fromヘッダは、「エンコード済みの名前 <メールアドレス>」の決まった形式で記述しなければなりません。ただし、mb_encode_mimeheader()関数で指定する文字コードは、mb_internal_encoding()でPHPプログラム内部の文字コードとして設定したものと、一致させてください。
PHPメールが届かない原因と対処法
PHPでメールを送信しても、相手に届かない、迷惑メールフォルダに入ってしまうなどのトラブルも頻繁に発生します。ここでは、メールが届かない主な原因と対処法を解説します。
よくあるエラーコードと対処法
迷惑メール判定を回避する方法
Gmail・Outlookでメールが届かない場合の対処法
上記の対策は、メールの到達率を上げるために重要です。
よくあるエラーコードと対処法
メール送信が失敗すると、SMTPサーバーからエラーコードが返されますが、エラーコードの意味を知ると原因を特定可能です。
例えば、「550」エラーは、宛先のメールアドレスが存在しない場合によく返されます。「553」エラーは、SMTP認証(送信サーバーのID・パスワード)が設定されていないか、間違っている場合に発生します。
「554」エラーは、何らかの理由で通信が失敗したことを示すものです。エラーコードの最初の桁が「5xx」の場合は永続的なエラー、「4xx」の場合は一時的なエラーを示します。
「SMTP connect() failed」のエラーが出る場合は、SSL/TLSの暗号化の設定や、認証情報(ID・パスワード)の誤りが原因である可能性があります。
迷惑メール判定を回避する方法
送信したメールが迷惑メールと判定されるのを防ぐには、「送信ドメイン認証」と呼ばれる技術的な設定が必要です。主な送信ドメイン認証には、以下の3つがあります。
ドメイン認証の種類 | 内容 |
|---|---|
SPF | メール送信サーバーのIPアドレスをDNSに登録し、送信元が正当であることを証明します。 |
DKIM | メールの内容が途中で改ざんされていないかを検知できるよう、電子署名をメールに付与します。 |
DMARCSPF | SPFやDKIMの認証が失敗したメールを、受信側がどう扱うかのポリシーを送信側が設定します。 |
Gmail・Outlookでメールが届かない場合の対処法
特にGmailやOutlookなどの主要なメールサービスは、迷惑メール対策を強化しており、メールが届きにくい場合があります。
Gmailは2024年2月から、1日に5,000通以上のメールを送信する送信者に対し、SPFまたはDKIMの設定、さらにDMARCの設定も必須としました。
Outlookは、送信元IPアドレスの「評判(レピュテーション)」を重視する傾向があります。過去に迷惑メールを送ったと判定されたIPアドレスはブラックリストに登録され、メールが届きにくくなるため注意が必要です。
上記の対策に加え、エラーメールの宛先(Return-Path)を正しく設定したり、DNSの逆引き設定を行ったりすると、メールの到達率が向上します。
PHPメールにはセキュリティ・スパム対策が欠かせない

PHPでメールフォームを設置する際は、セキュリティ対策とスパム対策が必要です。代表的な攻撃には「ヘッダインジェクション」が挙げられます。
フォームの入力欄に不正な改行コードやヘッダ情報を挿入し、メールを乗っ取って大量の迷惑メール送信の踏み台に利用する攻撃です。対策するには、フォームから受け取った値に含まれる改行コードを除去したり、エスケープ処理を行ったりする必要があります。
また、スパムbotによるフォームへの無差別な投稿を防ぐ対策も重要です。Googleが提供する「reCAPTCHA v3」を導入したり、botにしか見えない罠をフォームに仕掛けたりする方法があります。
短時間に大量の送信を防ぐ「送信レート制限」や、不正な送信を防ぐ「CSRFトークン」の利用も、フォームの悪用防止に役立ちます。
▼PHPメールフォームのセキュリティ対策に関して知りたい方は、以下の記事も参考にしてください。
>> PHPメールフォームのセキュリティ対策完全ガイド|実務で必須の知識と実装ポイント
セキュリティ性に優れたメールフォームを設置するなら「formrun」がおすすめ
PHPで安全なメールフォームを自力で構築・運用するには、高度な専門知識と継続的なメンテナンスが必要です。もし、セキュリティ性に優れたメールフォームを手軽に設置したいなら、フォーム作成ツール「formrun」がおすすめです。
ISMS・Pマーク取得済みの万全のセキュリティ
「formrun」は、情報セキュリティ管理の国際規格である「ISMS(ISO 27001)」認証や、個人情報保護体制の基準である「プライバシーマーク(Pマーク)」を取得しています。
通信の暗号化(SSL/TLS)はもちろん、24時間365日のサーバー監視体制など、厳格なセキュリティ基準に基づいて運用されているのが特徴です。
PHPで自作する場合に懸念される脆弱性対策や、サーバー管理の負担を「formrun」に任せられるため、利用者は安心してフォームの運用に集中できます。
豊富なメール機能
「formrun」は、フォームと連携したメール機能(個別メール・自動返信メール・一斉メール)を標準で備えており、PHPで実装すると手間がかかる処理を簡単に利用できます。フォームに回答があった際に、あらかじめ設定した内容を自動返信する機能はもちろん、管理画面から特定の回答者を選んで個別にメールを送信することも可能です。
そのため、問い合わせ対応や顧客とのやり取りを「formrun」だけでスムーズに完結できます。PHPで一から開発する必要がなく、専門知識がなくても高機能なメール連携をすぐに利用できる点が大きなメリットです。
▼formrunのメール機能でメール対応をスムーズにした事例記事はコチラをご覧ください。
>> フォーム一覧やメール機能にて顧客の動きや社内での対応を可視化!複数のプロジェクトを持つマネージャーにとってformrunが最適な理由とは?(一般社団法人日本デジタルトランスフォーメーション推進協会 様)
受信者のリスト管理を効率化できる
「formrun」でフォームから受け付けた回答は、自動的にデータベース化され、管理画面上で一元管理できます。
一方、PHPで自作する場合は、データベースの設計や管理画面の開発まで自分で行う必要があり、運用負担が大きくなりがちです。
さらに「formrun」では、集まったデータを「未対応」「対応中」などのステータスで管理したり、担当者を割り当てたりすることが可能です。これにより、メールやフォームからの問い合わせ対応状況が可視化され、対応漏れを防止できます。
加えて、受信者リストは Salesforceやkintoneなどの外部ツールとも連携 できるため、顧客管理や案件管理を行う業務フロー全体がスムーズにつながります。結果として、顧客管理の負担も大幅に軽減できます。
PHPメールの実装手順を理解してビジネスに活用しよう

PHPによるメール送信には、mail関数、mb_send_mail関数、PHPライブラリを使う方法など、複数の選択肢があります。
用途に応じて適切な方法を選ぶことが重要であり、特に日本語を含むメールでは文字コードの扱いが複雑になるため、文字化け対策は安定した運用に欠かせません。
エラーコードの意味を理解し、ヘッダインジェクションなどのセキュリティ対策を講じることで、安全なメール送信を実現できるでしょう。
なお、セキュリティ性に優れたメールフォームを設置したいなら、フォーム作成ツール「formrun(フォームラン)」の利用がおすすめです。
「formrun(フォームラン)」には、以下の特徴があります。
自動返信や個別メール送信などの豊富なメール機能
購読者のリスト管理を効率化できる
申込フォームをドラッグ&ドロップ操作で作成できる
SalesforceやkintoneなどのCRMやSlack・Chatworkなどの通知ツールとの連携が可能
ISMS・Pマーク取得済みの万全のセキュリティ
▼「formrun(フォームラン)」を活用すれば、直感的な操作で自社業務に即したフォームを簡単に作成できます。




