上級
電子メールの送受信は、現在オンラインで通信するための最も重要な方法の 1 つです。私たちは、PHP プログラムが、一部の商用 Web サイトの登録手順で使用される方法、つまり、パスワード (またはアクティベーション コード) の送受信も実装できることを期待しています。データ確認メール。一方で、この方法はユーザー情報をフィードバックする効果的な方法でもあります。もちろん、これらの機能を実現するにはメール サーバーが不可欠です。現在、より一般的なメール サーバー (正確にはメール転送エージェント MTA) には、sendmail、qmail、postfix などがあります。 Pop、smtp、imap、その他のサービスの設定方法については、この記事の範囲を超えていますので、他の記事を参照してください。では、PHP を使って何ができるのでしょうか? ----=_NextPart_000_0049_01C180CC.87D17760 ------=_NextPart_000_0049_01C180CC.87D17760
1. 単純な電子メールの送信
PHP 関数ライブラリには、単純な電子メールの送信に使用できるメール関数があります。関数のプロトタイプは次のとおりです:
boolean mail(string $to, string $subject, string $message) , string [ $Additional]);
$to は電子メール送信アドレスを指定し、$subject は電子メールのタイトルを指定し、$message は電子メールの内容を指定し、$Additional は電子メールの追加ヘッダーを指定します。例:
mail( "ywg_263 @263.net", "message from php", "hello, xiaoyz! " );
?>
「phpからのメッセージ」というタイトルでメッセージを送信できます"hello, xiaoyz" to ywg_263@263.net !" メールの場合、メール受信者 $to は複数のメール アドレスにすることができます。つまり、同じメールを複数の人に同時に送信できます。メール アドレスはカンマで区切られます。例は次のとおりです:
mail( implode(",", $emails ), "message from php", "hello, xiaoyz!" );
?>
このメソッドは、作者が取り組んだフォーラム プログラムの登録部分で使用されていますが、最終的には修正された形式になります。が採用されましたが、これについては後で詳しく説明します。主な要件は、ユーザーが登録するときに、フォーラムの正式なメンバーになる前にグループ管理者の確認を受ける必要があるということです。私が使用する方法は、ユーザーが登録を完了してフォームを送信するときに、最初に記入します。ユーザーの各種登録情報データベースにユーザーの必要情報を登録すると同時に、ユーザーが登録しているグループのグループ管理者全員にメールでユーザーの必要情報が送信されます(グループ管理者がいない場合はサイト管理者にメールが送信され、その旨が通知されます)グループにはグループ管理者がいません), もちろん、読者は、誰かが悪意を持って多くの ID を登録した場合、データベースに大量のジャンク情報が発生するのではないかと疑問に思うかもしれません。このような配慮が必要なので、このゴミを排除するための戦略を立てて管理インターフェースを提供する必要があるのですが、簡単な方法としては、一定期間後に正式会員になっていないIDをすべて削除するということが前提となります。グループ管理者が一定期間内にこれらの ID を承認することが必要です。承認しないと、誤って削除される可能性があります。読者は、上記のコードが機能するかどうかを試してみてください。メッセージが正常に送信されない場合は、メール サーバーの SMTP サービスを再構成することを検討してください。さて、上記のフォームで送信されるメールは単純なテキスト形式になります。HTML 形式でメールを送信したい場合は、MIME 形式でメールを送信する方法を知る必要があります。
2. MIME メール送信
MIME (Multi-Purpose Internet Mail Extensions、Multi-Purpose Internet Mail Extensions) プロトコルは、バイナリの添付ファイルをメッセージ本文に含めることができるように、テキストベースのインターネット メール システムを拡張します。 MIME 情報は、通常のインターネット テキスト メールで構成されます。テキスト メールには、いくつかのヘッダーと、フォーマットされたメッセージ本文 (ASCII コードのサブセットで表される添付ファイル) が含まれています。
メール機能で送信されたメールを受け付けた後のMIME情報は以下の通りです(localhost
(localhost[127.0.0.1])はローカルマシン上のpostfixが提供するSMTPサービスが使用されていることを示し、userid 48はApacheを示しています) ):
by mx01.263.net (Postfix)、SMTP ID E7C8B1DC38A78
for
受信:birdy.dhs.org (Postfix、ユーザーID 48から)
id 706F3C4923A; Sun, 9 Dec 2001 03:52:26 +0800 (CST)
宛先: ywg_263@263.net
件名: php からのメッセージ
メッセージ ID: <20011208195226.706F3C4923A@birdy.dhs.org>
日付: Sun, 9 Dec 2001 03:52:26 +0800 (CST)
From: apache@birdy.dhs.org (Apache ユーザー)
hello, xiaoyz!
Received、To、Subject、Message-ID、Date、From の各部分がすべて情報ヘッダーであることがわかります (To と Subject 情報ヘッダーは $to と $ に対応します) Content-Type ヘッダーが指定されていない場合、デフォルトは「Content-Type: text/plain;Charset='us-ascii'」です。 。この場合、もちろん、この方法を使用して HTML 形式で電子メールを送信することができます (注: HTML はテキスト形式でもあります)。例は次のとおりです:
$subject = "phpからのhtmlメッセージ";
$message = "hello, xiaoyz!
";
$additional = "From: ywg_263@263.net\nReply-To:ywg_263@263.net\n
X-Mailer:PHP\nX-Priority:2\nContent-Type: text/html; charset=\"GB2312\"\n
Content-Transfer-Encoding: 7bit\nMIME-Version: 1.0";
mail( $to, $subject, $message, $additional );
?>
其中有几个新的信息头:From表示邮件来源地址,Reply-To表示邮件回复地址,X-Mailer表示邮件发送程序,X-Priority表示邮件优先级,Content-Transfer-Encoding表示编码方式。用Outlook Express接受此邮件,我们发现它确实是一封HTML邮件,查看各信息头(在Outlook Express中选择该邮件,点右键,查看“属性”中的“详细信息”),正如上面所述。至此,我们已经可以发送各种文本格式的MIME邮件了,那么又该如何发送各种二进制格式的MIME邮件呢?比如图片;同时又该如何发送具有混合格式的MIME邮件呢?比如HTML和图片,请看第三部分和第四部分。
3. 二进制格式邮件发送
一个JPG图片的MIME信息格式大致如下:
Subject: jpg picture from xiaoyz
Content-Type: image/jpg; name='picture.jpg'
Content-Transfer-Encoding: base64
Content-Description: xiaoyz's picture
From: 'xiaoyz'
...这里是JPG图片的base64编码...
其中,name表示附件的名称,Content-Description表示附件的描述,一般显示为附件的标题。显然,我们必须把从表单提交的JPG图片文件进行base64编码,这个具体该如何实现呢?假定文件上传标签的名称为attach,即,则代码片断如下:
$content = fread($fp, filesize($attach)); //读取文件内容
$content = chunk_split( base64_encode($content) ); //进行base64编码,并在每76个字符后面加上\r\n
?>
然后只要把HTML格式邮件发送示例中的$to, $subject, $additional信息头部分换成这里对应的信息头,并将其中的$message换成这里的$content,就可以发送JPG图片的附件了,事实上任何类型的文件皆可通过这种方式进行发送。现在我们来看混合格式即多部分信息邮件。
4. 混合格式邮件发送
一个带HTML格式附件的邮件的MIME信息大致如下:
Delivered-To: ywg_sn@sina.com
Received: (qmail 20639 invoked from network); 9 Dec 2001 08:04:25 -0000
Received: from unknown (HELO smtp.263.net) (202.96.44.19)
by 202.106.187.149 with SMTP; 9 Dec 2001 08:04:25 -0000
Received: from localhost (localhost [127.0.0.1])
by smtp.263.net (Postfix) with SMTP id B431D1DEBCAAA
for
Message-ID: <004f01c18089$938e83b0$a32869a2@xiaoyz>
From:
To:
Subject: multipart MIME
Date: Sun, 9 Dec 2001 16:14:08 +0800
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_NextPart_000_0049_01C180CC.87D17760"
X-Priority: 3
This is a multi-part message in MIME format.
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Content-Type: text/html; name="index.html"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="index.html"
hello, xiaoyz!
------=_NextPart_000_0049_01C180CC.87D17760--
//メールヘッダーを生成します
$header = "From: $fromnContent-type: multipart/mixed;boundary=" $boundary"nX-Mailer :PHPnX-Priority:3";
//アップロードされたファイルのMIMEタイプを取得します
if( $attach_type)
$mimetype = $attach_type;
else
$mimetype = "application/unknown" ;
//アップロードされたファイルの名前を取得します
$filename = $attach_name;
$filename = $attach_name;
//アップロードされたファイルをエンコードして分割します
$fp = fopen($attach, "r");
$content = fread($fp , filesize($content));
$content = chunk_split(base64_encode($content) );
//メール本文を生成します
$body ="
--$boundary
Content-type: text/plain; charset=iso -8859-1
Content-transfer-encoding: 8bit
--$boundary
Content-Type: $mimeType name=$filenameContent-Disposition: filename= $filename
Content-Transfer-Encoding:base64
$content
--$boundary--";
mail( $to, $subject, $body, $header );
}?>