PHPでメール送信する際の知識ポイントを詳しく解説

不言
リリース: 2023-03-25 12:56:02
オリジナル
1786 人が閲覧しました

この記事では、PHP でメールを送信するための関連する知識ポイントと詳細な使用法をまとめています。必要な友人はそこから学ぶことができます。

電子メールの送信は、ユーザーのアクティブ化やパスワードの取得などの Web サイトの一般的な機能です。多くの場合、ユーザーのメールボックスに電子メールを送信する必要があります。この記事では、まず電子メールの送信に関連する概念を確認し、次に PHP を使用して電子メールを送信するためのサンプル コードを示します。

テキスト メッセージを送信する

テキスト メッセージは機能的には電子メールに似ており、通知やセキュリティ検証によく使用されます。テキスト メッセージを送信するには (基本的に) プロバイダーに料金を支払う必要があるため、SMS プロバイダーには、ユーザーがアクセスできる明確なドキュメントと使いやすいインターフェイスを提供するインセンティブがあります。一般的に、テキスト メッセージを送信する人は次のとおりです。

Alibaba Big Fish、Aggregated Data などのサプライヤーを探しています

アカウントを登録し、appid と appkey を取得します

テンプレートを申請します。

インターフェースドキュメントを表示してアプリケーションに統合します


APIを呼び出してテキストメッセージを送信します。


プロセスはシンプルでわかりやすく、アクセスして使用するのも非常に便利で、基本的には1〜2時間以内に接続してテストできます。ユーザーは、通信プロセス中にメッセージのエンコードやアドレス指定などの詳細を考慮する必要がありません。欠点は、料金を支払わなければならないことです。

電子メールは通常無料のサービスであり、関連するサポートが整備されていないことも理解する必要があります。さまざまなプログラミング言語で電子メールを送信するためのクラス ライブラリが多数あり、ソースの観点からは、ローカル マシンからの送信とサードパーティの電子メール サービス プロバイダーからの送信の 2 つのカテゴリに基本的に分類できます。電子メールの送信プロセスを理解するために、まず関連する概念をいくつか紹介しましょう。

関連概念

インターネットに触れる人のほとんどは電子メールの使用経験がありますが、基本的に電子メール クライアント、Web ページ、プロバイダーの概念に限定されています。開発者として、このセクションの次の概念を理解すると、電子メール通信の詳細をよりよく習得できるようになります。

MUA: メール ユーザー エージェント、メール ユーザー エージェント。ユーザーエージェントとは開発においてよく使われる言葉で、主に人間の意図を理解し、ユーザーに代わってリソースを要求するツールを指します。たとえば、ブラウザは最も一般的に使用されるユーザー エージェントであり、HTTP/HTTPS プロトコル形式で Web サーバーに要求を送信し、応答を解析してユーザーに表示します。電子メール ユーザー エージェントは、一般に Foxmail や Outlook などのツールです。ユーザーは電子メールを作成した後、形式に従って電子メールの内容をカプセル化し、メール サーバーと通信します。

MTA: Mail Transfer Agent、ユーザーの電子メールの送受信を支援するプログラム。よく言われるメール サーバーとは、sendmail、postfix、QMail などのオープン ソース プログラムを指します。

MRA: メール取得エージェント (メール収集エージェント) は、ローカルのメール サーバーからユーザーのメールを取得します。メール クライアントは一般的な MRA です。

SMTP: シンプルメール転送プロトコル、シンプルメール転送プロトコル。ユーザー、メール サーバー、およびメール サーバーはすべて、このプロトコルを使用して相互にメールを転送します (デフォルトはプレーン テキストであり、SSLTLS 暗号化を使用できます)。

POP3/IMAP: ポスト オフィス プロトコル バージョン 3/インターネット メッセージ アクセス プロトコル、ポスト オフィス プロトコル バージョン 3 またはネットワーク情報取得プロトコル。クライアントがサーバーからメールを取得するために使用するプロトコル。

ユーザー A (163 メールボックス) がユーザー B (Gmail メールボックス) にレターを送信します。ユーザー B がレターを受け取るプロセスには、上記の概念が含まれます。プロセスと概念的な関係は、次の簡略化された図で表すことができます:

用户A --发送邮件--> 用户B
 M|S         M|I
 U|M         R|M
 A|T         A|A
 |P         |P
 v          v
MTA(163)--转发(SMTP)->MTA(gmail)
ログイン後にコピー

注: 上の図は、電子メールを送信する一般的なプロセスを示しています。他の MSA、MDA、ESMTP、SMTPS などがプロセス全体に現れる場合があります。メールの送受信には影響しませんのでご了承ください。以下に記載する略語や概念については別途記載しますので、ご自身でご確認ください。

postfix

Linux上でメールを送信するためのソフトウェアは主にsendmailとpostfixであり、システム内で上記の概念におけるMTA/MDA(Mail Delivery Agent、メール配信エージェント)の役割を果たします。これは、ユーザーがアウトバウンド電子メールを送信したり、ユーザーのメールボックス (デフォルトの場所 /var/spool/mail/username) に配信された電子メールを受信したりするのに役立ちます。

sendmailは非常に評判の高い老舗のメールソフトです。しかし、Wietse (Wietse Zweitze Venema) はこれに満足できず、後置を考え出しました。 postfix コマンドは、sendmail と (ほぼ) 互換性がありますが、より効率的で安全です (サフィックス修正の起源)。現在、ほとんどの Linux ディストリビューションのデフォルトの電子メール送受信ソフトウェアです。sendmail の代わりに postfix を使用することをお勧めします。何年も前にこのブログに sendmail の設定方法に関する記事がありました。当時私は若くて無知だったので、時間をかけてその記事を改訂する予定でした)。

postfix のメイン設定ファイルは /etc/postfix/main.cf です。設定ファイルには非常に詳しくコメントが付けられており、オプションは基本的に一目瞭然です。最も重要な構成は、myhostname、myorigin、inet_interfaces、inet_protocols、および mydestination (外部ネットワークからレターを受信する予定の場合) です。 inet_interfaces が localhost として構成されている場合、inet_protocols の値は ipv4 である必要があることに注意してください。そうでない場合は、「postfix: Fatal:parameter inet_interfaces: no local interface found for ::1」のようなエラー メッセージが表示される場合があります。

メールに関連するいくつかの一般的な後置コマンドは次のとおりです:

mail または mailx、メールを送信します。 tlanyan ユーザーは root に電子メールを送信します: mail -s "Greetings" root@localhost -r tlanyan@localhost、ターミナルに「A nice day!」と入力し、Enter キーを押してテキスト編集を終了し、電子メールを送信します。送られた。 root アカウントにログインすると、/var/spool/mail/root に新しい電子メールがあることが示されます。電子メールの詳細を表示するには、tail または他のコマンドを使用します。


postquque,查看邮件发送队列。postqueue -p可取代sendmail中的mailq命令,postqueue -f刷新队列(强制尝试发送队列中的邮件)。

postcat,查看未发送邮件的信息。例如postcat -q xxxx(xxxx是postqueue或者mailq显示的未发送队列ID)可查看邮件的详细信息,postcat -b -q xxxxx只查看邮件正文。

postsuper,超级用户才可使用的邮件管理程序。postsuper -d xxxx,删除队列ID为xxxxx的邮件;postsuper -h xxxxx,暂停队列ID为xxxx的邮件发送,等。

以上介绍对于发送邮件基本已足够。注意,mail命令发送的邮件能投递的前提是postfix正在运行(ps aux | grep postfix | grep -v grep输出不为空)。

有了postfix,配置好后可以对外发送邮件,也能收取外网发送过来的邮件,但限于命令行操作。想用foxmail等客户端收发邮件,需要让服务器支持POP3/IMAP协议。开源的dovecot可以实现这个功能。dovecot服务于收邮件而非发送,了解其对开发中的帮助不大。如果想搭建一套完整的邮件系统(包括网页端支持、垃圾邮件过滤、病毒查杀、传输加密等),建议参考或使用国产开源的 EwoMail。

了解postfix对开发中发送邮件帮助有多大?说实话,几乎没有帮助。原因是为了防止垃圾邮件泛滥,各大云服务器厂商屏蔽了25端口(Google Cloud连465都干掉了)。亚马逊云通过申请还有放行的可能(但有速率和每日额度限制),其他厂商几乎不会让你使用自己的域名从本机直接发送邮件。封禁25端口,必须使用第三方的邮件服务,几乎是业界的标准做法。

聪明的人可能想到,使用465加密端口(基于SMTPS,SMTP over SSL协议)或587端口(SMTP over STARTTLS协议)发送邮件,是不是就能绕开限制了?阿里云/腾讯云等厂商并不封禁465端口,发送邮件可以使用该端口而无需申请。但注意465和587端口是客户端和邮件服务器通讯使用的端口,邮件服务器之间通讯使用25端口。你可以通过465端口连接到Gmail邮箱对外发送邮件,但无法让postfix使用465端口投递邮件到hotmail邮件服务器。

总结来说,sendmail/postfix作为垃圾和欺诈邮件泛滥前的邮件服务器软件,对业界贡献很大。随着云服务器的盛行,几乎无法以指向本机的域名向外发送邮件,sendmail/postfix除了在本机内发送提醒邮件,用处已然不大。要对外发送邮件,要么自建机房,要么使用第三方邮件系统。

PHP的mail函数

作为PHP开发中,了解sendmail/postfix还是有点用处。mail函数默认使用sendmail/postfix发送邮件,了解相关配置,就能知道为啥能工作/为啥不能工作。

简单来说,要让PHP自带的mail函数正常工作,需要做以下事情:

申请域名,在DNS解析中设置MX记录,指向本机(非合法主机(FQDN, Fully Qualified Domain Name)发送的邮件都会被当做垃圾邮件直接丢弃);

安装sendmail/postfix,配置软件并运行;

配置防火墙、安全组,放行端口。

发送效率低、非面向对象的调用方式,配置麻烦以及云服务器厂商的封锁,是使用mail函数的最大阻碍。所以做PHP以来,本人并未直接用过mail函数。

PHP发送邮件

发个邮件要了解这么多,会让人觉得很心累。说好的PHP是最好的语言呢?

PHP发送邮件也可以很简单,推荐方式就是使用Swift Mailer或PHPMailer等类库。引入这些类库后,注册第三方邮箱(比如Gmail、QQ等),填好用户名密码,配置好STMP地址和端口,就能像发送短信一样轻松发送邮件。当然这些类库也支持使用sendmail/postfix发送邮件,但我想你不会再这样做了。

以Swift Mailer为例,直接上代码说明使用PHP发送邮件也是一个非常简单的事情!

首先,在项目中引入Swift Mailer:

composer require "swiftmailer/swiftmailer:^6.0"
ログイン後にコピー

然后准备好邮件内容(以文本文件为例,不带附件):

$message = (new Swift_Message('Test Message'))
  ->setFrom(['tlanyan@tlanyan.me' => 'tlanyan'])
  ->setTo(['tlanyan1@tlanyan.me'])
  ->setBody('Hello, this is a test mail from Swift Mailer!');
ログイン後にコピー

接着,设置好邮件传输方式(使用Gmail邮箱):

$transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))
  ->setUsername('username')
  ->setPassword('password');
ログイン後にコピー

或者使用sendmail/postfix的方式(不推荐):

$transport = (new Swift_SendmailTransport());
ログイン後にコピー

最后,使用transport构造mailer实例,发送邮件:

$mailer = new Swift_Mailer($transport);
$result = $mailer->send($message);
ログイン後にコピー

老板再也不用担心发送邮件收不到了,So easy!

总结

本文先回顾了发送邮件的相关概念,说明不推荐使用内置的mail函数原因,最后给出了使用第三方类库发送邮件的代码示例。

相关推荐:
几种PHP发送HTTP请求的方式分享

PHP は SMS メールやその他多くの実用的な PHP コード共有を送信します



以上がPHPでメール送信する際の知識ポイントを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート