この記事は主にメール送信に関する PHP レビューを紹介しています。必要な友人にぜひ共有してください。https://tlanyan.me /php- review...
PHPレビューシリーズの目次
テキスト メッセージを送信する
電子メールは通常無料のサービスであり、関連するサポートが整備されていないことも理解する必要があります。さまざまなプログラミング言語で電子メールを送信するためのクラス ライブラリが多数あり、ソースの観点からは、ローカル マシンからの送信とサードパーティの電子メール サービス プロバイダーからの送信の 2 つのカテゴリに基本的に分類できます。電子メールの送信プロセスを理解するために、まず関連する概念をいくつか紹介しましょう。
関連概念
: メール ユーザー エージェント、メール ユーザー エージェント。ユーザーエージェントとは、開発においてよく使われる言葉で、主に人間の意図を理解し、ユーザーに代わってリソースを要求するツールを指します。たとえば、ブラウザは最も一般的に使用されるユーザー エージェントであり、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)
postfix
Linuxでメールを送信するためのソフトウェアは主にsendmailとpostfixで、システム内で上記の概念におけるMTA/MDA(Mail Delivery Agent、メール配送エージェント)の役割を果たします。これは、ユーザーがアウトバウンド電子メールを送信したり、ユーザーのメールボックス (デフォルトの場所 /var/spool/mail/username) に配信された電子メールを受信したりするのに役立ちます。
postfix のメイン設定ファイルは /etc/postfix/main.cf
です。設定ファイルには非常に詳細なコメントが付けられており、オプションは基本的に一目瞭然です。最も重要な構成は、myhostname
、morigin
、inet_interfaces
、inet_protocols
、および mydestination
です。 code> (外部ネットワークからレターを受信する予定の場合)。 inet_interfaces
が localhost
として構成されている場合、inet_protocols
の値は ipv4 である必要があり、それ以外の場合は postfix: Fatal のような値になることに注意してください。 : パラメータ inet_interfaces が表示される場合があります。 ::1
のローカル インターフェイスが見つかりませんというエラー メッセージが表示されます。 /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
的错误提示。
与邮件相关的几个常用postfix命令是:
mail
或mailx
,发送邮件。tlanyan
用户向root
发送邮件:mail -s "Greetings" root@localhost -r tlanyan@localhost
,接着终端中输入A nice day!
,然后回车,按ctrl+D
结束正文编辑,邮件就已经发送出去。登录到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开发中,了解sendmail/postfix还是有点用处。mail
mail
または mailx
(メールを送信します)。ユーザー tlanyan
が root
に電子メールを送信します: mail -s "Greetings" root@localhost -r tlanyan@localhost
に を入力します。端末で「良い一日を!
」と入力して Enter を押し、ctrl+D
を押してテキスト編集を終了すると、電子メールが送信されます。 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 のメールの送信を一時停止します。 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 はローカル マシン内でリマインダー メールを送信する以外にはほとんど役に立ちません。外部に電子メールを送信するには、独自のコンピューター室を構築するか、サードパーティの電子メール システムを使用する必要があります。 🎜mail
関数は、デフォルトで sendmail/postfix を使用して電子メールを送信します。関連する設定を理解していれば、機能する理由と機能しない理由がわかります。 🎜🎜🎜🎜🎜🎜🎜簡単に言えば、PHP 独自のメール機能を適切に動作させるには、次のことを行う必要があります: 🎜🎜🎜🎜 ドメイン名を申請し、DNS 解決で MX レコードを設定し、ローカル マシンをポイントします。 (正規でないホスト (FQDN、完全修飾ドメイン名) はスパムとして直接破棄されます); 🎜🎜🎜🎜 sendmail/postfix をインストールし、ソフトウェアを設定して実行します 🎜🎜🎜🎜 ファイアウォール、セキュリティ グループ、およびリリース ポートを設定します。 。 🎜发送效率低、非面向对象的调用方式,配置麻烦以及云服务器厂商的封锁,是使用mail
函数的最大阻碍。所以做PHP以来,本人并未直接用过mail
函数。
发个邮件要了解这么多,会让人觉得很心累。说好的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
函数原因,最后给出了使用第三方类库发送邮件的代码示例。
感谢阅读,欢迎评论指正!
http://cn.linux.vbird.org/lin...
http://doc.ewomail.com/ewomai...
http://php.net/manual/en/func...
https://swiftmailer.symfony.com
相关推荐;
以上がPHP レビュー: 電子メールの送信の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。