ホームページ > php教程 > php手册 > PHP の高度な機能に関するディスカッションの電子メール関連

PHP の高度な機能に関するディスカッションの電子メール関連

WBOY
リリース: 2016-06-21 09:09:51
オリジナル
844 人が閲覧しました

上級

電子メールの送受信は、現在オンラインで通信するための最も重要な方法の 1 つです。私たちは、PHP プログラムが、一部の商用 Web サイトの登録手順で使用される方法、つまり、パスワード (またはアクティベーション コード) の送受信も実装できることを期待しています。データ確認メール。一方で、この方法はユーザー情報をフィードバックする効果的な方法でもあります。もちろん、これらの機能を実現するにはメール サーバーが不可欠です。現在、より一般的なメール サーバー (正確にはメール転送エージェント MTA) には、sendmail、qmail、postfix などがあります。 Pop、smtp、imap、その他のサービスの設定方法については、この記事の範囲を超えていますので、他の記事を参照してください。では、PHP を使って何ができるのでしょうか?

1. 単純な電子メールの送信

PHP 関数ライブラリには、単純な電子メールの送信に使用できるメール関数があります。関数のプロトタイプは次のとおりです:

boolean mail(string $to, string $subject, string $message) , string [ $Additional]);

$to は電子メール送信アドレスを指定し、$subject は電子メールのタイトルを指定し、$message は電子メールの内容を指定し、$Additional は電子メールの追加ヘッダーを指定します。例:

< ?php
mail( "ywg_263 @263.net", "message from php", "hello, xiaoyz! " );
?>


「phpからのメッセージ」というタイトルでメッセージを送信できます"hello, xiaoyz" to ywg_263@263.net !" メールの場合、メール受信者 $to は複数のメール アドレスにすることができます。つまり、同じメールを複数の人に同時に送信できます。メール アドレスはカンマで区切られます。例は次のとおりです:

$emails = Array( "xiaoyz@birdy.dhs.org", "xiaoyz@hotmail.com" );
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を示しています) ):

受信: localhost (localhost [127.0.0.1]) から
by mx01.263.net (Postfix)、SMTP ID E7C8B1DC38A78
for ; 2001 年 12 月 8 日土曜日 20:08 :45 +0800 (CST)
受信: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 はテキスト形式でもあります)。例は次のとおりです:

$to = "ywg_sn@sina.com";
$subject = "phpからのhtmlメッセージ";
$message = "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信息格式大致如下:

To: ywg_sn@sina.com
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,即,则代码片断如下:

$fp = fopen( $attach, "r" );
$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信息大致如下:

Return-Path:
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 ; Sun, 9 Dec 2001 16:08:44 +0800 (CST)
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.

----=_NextPart_000_0049_01C180CC.87D17760
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline





hello, xiaoyz!

------=_NextPart_000_0049_01C180CC.87D17760
Content-Type: text/html; name="index.html"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="index.html"


html attachment

hello, xiaoyz!


------=_NextPart_000_0049_01C180CC.87D17760--



Content-Type ヘッダーに注目してください。multipart/mixed は、このメールが複数の部分で構成されていることを示しており、各部分間の境界が「----=_NextPart_000_0049_01C180CC.87D17760」として指定されていることがわかります。電子メールは、情報ヘッダー部分、プレーン テキスト部分、HTML 部分の 3 つの境界文字によって 3 つの部分に分割されます。 Content-Disposition は、添付ファイルをどのように表示するかをメール プログラムに指示します。 Content-Disposition が Attachment に設定されている場合、メール プログラムは HTML ファイルのコンテンツを表示しませんが、Inline に設定されている場合は HTML ファイルのコンテンツが直接表示されます。通常の状況では、添付ファイルがテキスト形式である場合 (HTML もテキスト形式である場合)、Content-Disposition はインラインに設定され、それ以外の場合は Content-Disposition は Attachment に設定されます。さて、読者は電子メールのコンポーネントとその意味を明確に理解できたと思います。もちろん、PHP を使用してすべての情報を生成することもできます。フォーム送信の状況について説明します。コードは次のとおりです:

from:

to:

subject:

attach:

message:<テキストエリア名="メッセージ" >



if( isset ($send) )
{
//境界線を定義します
$boundary = uniqid( "" );

//メールヘッダーを生成します
$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=$filename

Content-Disposition: filename= $filename
Content-Transfer-Encoding:base64

$content

--$boundary--";

mail( $to, $subject, $body, $header );

}

?>

最初に uniqueid 関数の境界文字を通じて一意の値を取得し、次にアップロードされたファイルの MIME タイプを取得します。次に、アップロードされたファイルを Base64 エンコードしてセグメント化し、最後にそれらを結合してメール関数の $body と $header を取得します。そしてメール関数を呼び出します。ここまで来れば、非常に優れた素晴らしい登録確認プログラムを作成できることは間違いありません。最後に、著者は本人確認における電子メールの代替手段について説明します。これは実際には非常に簡単で、データベースを使用してユーザーからのさまざまなアプリケーション通知を保存することです。具体的には、ユーザーが登録フォームに記入して送信するたびに、ユーザーの登録情報がデータベースに記録されるだけでなく、データベースに申請通知も生成されます。たとえば、ユーザー abc が group1 グループへの参加を申請します。データベース クエリを通じて、group1 グループに 2 人のグループ管理者 admin1 と admin2 がいることが判明するため、fromwho フィールドは abc、towho フィールドはそれぞれ admin1 と admin2、読み取りフィールドは 0 であることを示す 2 つのレコードをデータベースに追加する必要があります。グループ管理者がこの通知をまだ見ていないことを示します。グループ管理者がログインすると、アプリケーション通知が取得され、未表示の通知がある場合は、管理者が承認するためのウィンドウ インターフェイスがポップアップ表示されます。管理者が申請を承認すると、abc の権限は正式なメンバーに更新され、申請が拒否された場合は、abc の申請通知とユーザー レコードが削除されます。さて、ここでやめましょう。引き続き PHP の高度な機能に関するディスカッション シリーズに注目してください。



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