ホームページ  >  記事  >  バックエンド開発  >  PHP レビュー: 電子メールの送信

PHP レビュー: 電子メールの送信

不言
不言オリジナル
2018-04-16 14:42:511600ブラウズ

この記事は主にメール送信に関する PHP レビューを紹介しています。必要な友人にぜひ共有してください。https://tlanyan.me /php- review...

PHPレビューシリーズの目次

    PHPの基礎
  • Webリクエスト
  • cookie
  • Webレスポンス
  • セッション
  • データベース操作
  • 暗号化と復号
  • Composer
  • 独自の Composer パッケージを作成する
  • 電子メールの送信は、ユーザーのアクティブ化やパスワードの取得などの Web サイトの一般的な機能であり、多くの場合、ユーザーのメールボックスに電子メールを送信する必要があります。この記事では、まず電子メールの送信に関連する概念を確認し、次に PHP を使用して電子メールを送信するためのサンプル コードを示します。

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

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

    Alibaba Big Fish、集約データなどのサプライヤーを探しています。
  1. アカウントを登録し、appid と appkey を取得します。
  2. テンプレートを適用します。
  3. アプリケーションに統合されたビューインターフェイスドキュメント。
  4. テキストメッセージを送信するためにAPIを呼び出します。
  5. プロセスはシンプルでわかりやすく、アクセスして使用するのも非常に便利です。基本的には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 です。設定ファイルには非常に詳細なコメントが付けられており、オプションは基本的に一目瞭然です。最も重要な構成は、myhostnamemorigininet_interfacesinet_protocols、および mydestination です。 code> (外部ネットワークからレターを受信する予定の場合)。 inet_interfaceslocalhost として構成されている場合、inet_protocols の値は ipv4 である必要があり、それ以外の場合は postfix: Fatal のような値になることに注意してください。 : パラメータ inet_interfaces が表示される場合があります。 ::1 のローカル インターフェイスが見つかりませんというエラー メッセージが表示されます。 /etc/postfix/main.cf,配置文件的注释非常全,选项基本是自解释的。最重要的几个配置是:myhostnamemyorigininet_interfacesinet_protocols以及mydestination(如果你打算收外网来信的话)。需要注意inet_interfaces配置为localhost时,inet_protocols的值应为ipv4,否则可能会出现类似postfix: fatal: parameter inet_interfaces: no local interface found for ::1的错误提示。

与邮件相关的几个常用postfix命令是:

  1. mailmailx,发送邮件。tlanyan用户向root发送邮件:mail -s "Greetings" root@localhost -r tlanyan@localhost,接着终端中输入A nice day!,然后回车,按ctrl+D结束正文编辑,邮件就已经发送出去。登录到root账号,会提示在/var/spool/mail/root中有新邮件。用tail或者其他命令可查看邮件的详细信息。

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

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

  4. 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

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

PHP レビュー: 電子メールの送信mail または mailx (メールを送信します)。ユーザー tlanyanroot に電子メールを送信します: mail -s "Greetings" root@localhost -r tlanyan@localhost を入力します。端末で「良い一日を!」と入力して Enter を押し、ctrl+D を押してテキスト編集を終了すると、電子メールが送信されます。 root アカウントにログインすると、/var/spool/mail/root に新しいメールがあることが示されます。 tail または他のコマンドを使用して、電子メールの詳細情報を表示します。

    postquque、メール送信キューを表示します。 postqueue -p は、sendmailmailq コマンドを置き換えることができます。postqueue -f はキューを更新します (強制的に再試行します)。キュー)のメール)を送信します。
  1. postcat をクリックすると、未送信のメールに関する情報が表示されます。たとえば、postcat -q xxxx (xxxx は postqueue または mailq で表示される未送信キュー ID) でメールの詳細情報を表示でき、postcat -b -q xxxxx でメールの詳細情報を表示できます。メール本文の閲覧のみ可能です。
  2. 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 は電子メールを送信するのではなく受信する役割を果たします。それを理解することは、開発にはあまり役立ちません。完全な電子メール システム (Web ページのサポート、スパム フィルタリング、ウイルス検出、送信暗号化などを含む) を構築したい場合は、国産のオープンソース EwoMail を参照または使用することをお勧めします。 🎜🎜開発中に電子メールを送信する際に postfix を知ることはどの程度役立ちますか?正直に言うと、ほとんど役に立ちません。その理由は、スパムの蔓延を防ぐために、大手クラウドサーバーメーカーがポート25をブロックしているためです(Google Cloudはポート465さえブロックしています)。 Amazon Cloud はアプリケーションを通じてリリースすることができます (ただし、レートと日次割り当て制限があります)。他のベンダーでは、このマシンから直接電子メールを送信するために独自のドメイン名を使用することはほとんど許可されません。業界では、ポート 25 をブロックしてサードパーティの電子メール サービスを使用することがほぼ標準的な方法となっています。 🎜🎜賢い人は、暗号化されたポート 465 (SMTPS、SMTP over SSL プロトコルに基づく) またはポート 587 (SMTP over STARTTLS プロトコル) を使用して電子メールを送信すれば制限を回避できると考えるかもしれません。 Alibaba Cloud/Tencent Cloud およびその他のメーカーは、ポート 465 をブロックしません。このポートを使用して、申請せずにメールを送信できます。ただし、 クライアントとメールサーバー間の通信には465 ポートと 587 ポートが使用され、 メールサーバー間の通信には25 ポートが使用されることに注意してください。ポート 465 経由で Gmail メールボックスに接続して電子メールを外部に送信することはできますが、Postfix にポート 465 を使用して電子メールを Hotmail メール サーバーに配信させることはできません。 🎜🎜 要約すると、sendmail/postfix は、スパムや詐欺メールが蔓延する前のメール サーバー ソフトウェアとして、業界に多大な貢献をしてきました。クラウド サーバーの普及により、ローカル マシンを指すドメイン名を使用して電子メールを送信することはほとんど不可能になり、Sendmail/postfix はローカル マシン内でリマインダー メールを送信する以外にはほとんど役に立ちません。外部に電子メールを送信するには、独自のコンピューター室を構築するか、サードパーティの電子メール システムを使用する必要があります。 🎜

PHP のメール関数

🎜 PHP 開発者として、sendmail/postfix を理解することは依然として役立ちます。 mail 関数は、デフォルトで sendmail/postfix を使用して電子メールを送信します。関連する設定を理解していれば、機能する理由と機能しない理由がわかります。 🎜🎜🎜🎜🎜🎜🎜簡単に言えば、PHP 独自のメール機能を適切に動作させるには、次のことを行う必要があります: 🎜🎜🎜🎜 ドメイン名を申請し、DNS 解決で MX レコードを設定し、ローカル マシンをポイントします。 (正規でないホスト (FQDN、完全修飾ドメイン名) はスパムとして直接破棄されます); 🎜🎜🎜🎜 sendmail/postfix をインストールし、ソフトウェアを設定して実行します 🎜🎜🎜🎜 ファイアウォール、セキュリティ グループ、およびリリース ポートを設定します。 。 🎜

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

PHP发送邮件

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

PHP发送邮件也可以很简单,推荐方式就是使用Swift MailerPHPMailer等类库。引入这些类库后,注册第三方邮箱(比如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函数原因,最后给出了使用第三方类库发送邮件的代码示例。

感谢阅读,欢迎评论指正!

参考

  1. http://cn.linux.vbird.org/lin...

  2. http://doc.ewomail.com/ewomai...

  3. http://php.net/manual/en/func...

  4. https://swiftmailer.symfony.com

相关推荐;

怎样选择适合自己php框架

php中传值与传引用的区别

以上がPHP レビュー: 電子メールの送信の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。