ホームページ  >  記事  >  php教程  >  PHP を使用して qmail メール サーバー管理システムを開発する

PHP を使用して qmail メール サーバー管理システムを開発する

WBOY
WBOYオリジナル
2016-06-21 09:05:251328ブラウズ

服务器|邮件服务器

电子邮件在网络中占有很重要的地位。目前,在企业中运行的邮件服务器均用各自独立的管理系统来实现账号创建、口令修改、邮箱扩容、删除邮箱等功能。当邮箱用户达到一定数量时,邮件管理员的日常维护工作显得极为繁重,这就需要将一部分管理任务(如账号申请)实现自动化处理;同时将一部分任务(如口令修改)由多个分组管理员来负责,从而使邮件管理员从繁琐的维护工作中解脱出来,真正对邮件服务器起到监管作用。

邮件服务器及开发环境的选择
目前很多邮件服务器不提供开发接口,因此在企业内部实现开发邮件管理系统的首要问题是,寻找一种能够与开发语言相结合的开放式邮件系统。
由于对稳定性要求很高,因此大型电子邮件系统一般都使用Unix作为服务器的操作系统。例如,Hotmail使用的是FreeBSD和Solaris系统。
Linux自带的邮件由于在系统结构上存在一定缺陷,难以承受大用户量的访问。qmail是GNU下一款著名的自由软件,是新一代Unix邮件系统,支持Maildir存储方式。它把每个邮件作为一个单独的文件保存在用户个人的邮件目录下。qmail支持虚拟域(Virtual Domain)和虚拟用户(Virtual User)。当前国内流行的免费电子邮件系统大都采用qmail作为基本服务器软件,提供多级目录以支持较大的用户数。
从开发的角度看,PHP+Linux的开发模式已被许多开发人员采用。利用PHP来调用qmail提供的控制程序,实现对邮件系统的各种管理工作。为实现对大量用户的有效控制,还可引入数据库管理。本文将介绍一个PHP +Oracle+qmail+Linux的开发实例。

总体设计
整个系统分为邮箱管理和邮件收发两部分。申请邮箱时,先填写一些必要的信息,然后系统会自动地创建邮箱并允许用户立即使用。当用户忘记密码后,可采用目前互联网的通用做法,通过回答用户自定义的问题来修改邮箱密码。出于安全考虑,在用户三次回答错问题后,系统将该账号的“修复邮箱密码”功能锁定30分钟。
邮件管理依据不同的需求,将用户权限分为以下3种级别:
◆ 普通用户 能够在浏览器中收发电子邮件、修改邮箱密码、修改自定义问题和答案,并进行邮箱的查询。
◆ 分组管理员 除拥有普通用户的功能外,可以修改本组内所有账号的密码,解除本科室账号的“修复邮箱密码”功能锁定。
◆ 邮箱管理员 可以修改全部邮箱口令、删除邮箱、修改邮箱容量、查看邮箱的申请情况,解除全部账号的“修复邮箱密码”功能锁定。
邮件的收发采用PHP提供的标准POP3函数,可获得邮件清单、查看邮件的详细内容、发送带多个附件的邮件,并提供邮件删除、回复等功能。
数据库主要由以下几个表组成:
◆ email_info 存放所有电子邮箱的相关信息,如账号、人员姓名、科室、联系电话、自定义问题、自定义问题的答案、锁定标记等。
◆ email_register_info 存放用户申请电子邮件时填写的信息,如账号、密码、申请时间、科室、申请的当前步骤(主要是为了防止用户恶意跳过某些步骤而设定的)。
◆ email_change_log 记录用户电子邮箱的变化情况,以备日后需要时检查。主要记录有邮件的申请时间、删除时间、邮箱账号、对邮箱操作的人员姓名、IP地址等信息。

技术难点分析
PHP调用qmail的控制程序
在Linux环境中,每一个程序都有相应的用户和组的概念。PHP程序在服务器中执行时,默认的用户是nobody,没有权利执行qmail的控制程序。在Linux里面有个sudo命令,允许其它用户以root身份执行一些命令。修改/etc/sudoers文件,增加以下部分:


PHP源码:
--------------------------------------------------------------------------------

nobody ALL=/var/vpopmail/bin/vadduser (增加用户)
nobody ALL=/var/vpopmail/bin/vdeluser (删除用户)
nobody ALL=/var/vpopmail/bin/vpasswd (修改口令)
nobody ALL=/var/vpopmail/bin/vchkpw (检查用户口令是否正确)
nobody ALL=/var/vpopmail/bin/vsetuserquota (修改邮箱最大容量)
nobody ALL=/var/vpopmail/bin/vmoduser (修改用户信息)
root ALL=(ALL) ALL

--------------------------------------------------------------------------------


qmail 制御プログラムを呼び出すとき、ユーザーはいくつかの情報を手動で入力する必要があります。自動化を実現したい場合は、Linuxのリダイレクト技術を利用して、ユーザーが事前に入力した情報をファイルに保存し、リダイレクト技術を利用してシェルスクリプトに転送する必要もあります。
PHP は、外部コマンドを実行するための system() 関数と exec() 関数を提供します。 system() 関数は、指定されたコマンドを実行し、結果を出力して返します。 exec() 関数は system() に似ていますが、結果を出力しません。プログラム制御を使用する場合は、exec()関数を使用し、実行後の状態から制御プログラムが正しく実行されたかどうかを判断し、エラーが発生した場合はメール管理者に通知する必要があります。次のコードは、説明する例として「ユーザーの追加」関数を使用しています:

PHP ソース コード:
--------------------------- ---------------------------------------------------- -------

require("/home/httpd/phplib/qmail.inc");
$qmail_date = "v1";
$qmail_email = "から pw_name を選択します。 $qmail_date;
$qmail_email->query($sql);
while ($qmail_email->next_record())
{
$qmail_user = $qmail_email->f("pw_name"); 12345";
$str_command = " sudo /var/vpopmail/bin/vadduser " .$qmail_user.;
$str_command = $str_command."@mail.com".$passwd." -q 10000000 /home/n";
@exec($str_command,$ str,&$result);
if ($result != 0 )
{
echo "コマンド文字列は :".$str_command." 、コマンドは失敗しました!!!
";
$error_info = "vadduser コマンドの実行に失敗しました";
$address = "From:computer@mail.comnReply-To:computer@mail.comn" ;
mail("webmaster@mail.com", $error_info , $message,$address );
}
}
$qmail_email->free();

------------------------------------- -------- -------------------------------------- --------

その他 パスワードの変更、メールボックス容量の変更、メールボックスの削除などの機能は、プログラムの実装において非常に似ているため、あまり詳しく説明しません。


電子メールの添付ファイルのアップロードとダウンロード

PHP 自体がアップロード機能を提供しますが、実際の状況に応じて、いくつかの設定やエラー処理を適宜行うことができます。ユーザーは、php.ini ファイルを変更することで、アップロードされるファイルの最大容量を拡張できます。同時に、Web ページのフォームに添付ファイルを追加することで、1 つの添付ファイルのサイズを 5MB に制限できます。ネットワーク速度が比較的遅い場合は、Web ページのタイムアウト変数を設定する必要があります。そうしないと、アップロードに時間がかかりすぎてタイムアウトになってしまいます。サーバー側のハンドラーコードは次のとおりです:


PHP ソースコード:

-------------------------------- --------------------------------------------------


if (! file_exists($mail_att)) //ファイルが正常にアップロードされたかどうかを判断します

{ //エラー処理と表示

}
copy ($mail_att, $mail_att.".att");添付ファイルの名前を変更し、「場所を指定」にコピーします。
for ($i = 1; $i {
$file_name = "send_att".$i; //アップロードされたファイルの元の名前を取得します
$file_tmp = "send_att_tmp"。 $i ; //アップロードされたファイルのサーバー上の一時ファイル名を取得します
$file_size = "send_att_size".$i; //アップロードされたファイルのサイズを取得します
$file_mime = "send_att_mime".$i;アップロードされたファイルの種類を取得します
}

-------------------------------------- ----------- ----------------------------------

提供する場合添付ファイルのダウンロードでは、ここでは一般的な方法、つまりユーザーが指定したファイルの URL は使用されません。このアプローチは理論的には安全ではないため、ユーザーはリンクを通じてファイルを直接ダウンロードする可能性があります。逆に、ブラウザがアクセスできないディレクトリからファイルを読み取り、ユーザーがダウンロードできるようにする場合は、同様のセキュリティ問題は発生しません。プログラムのコアコードは次のとおりです:

PHP ソースコード:
--------------------------------- ------------ -------------------------------------- --

if (file_exists($attach_filepos) ) //ファイルが存在するかどうかを判断します
{

$size = filesize($attach_filepos) //ファイルのサイズを取得します

//ユーザーの元のファイル名をダウンロード用のユーザー。
header("Content-Disposition:attachment; filename=".$attach_filename);
header("Content-length: ".$size);
header("Content-type: application/x-zip-compressed");
readfile($attach_filepos); //ダウンロードされたファイルを読み取り、ダウンロードのためにユーザーに提供します。
}

---------------------------------------------- -- ----------------------------------

結論

このシステムは、PHP と Oracle を技術的に完全に組み合わせたデータベースですを組み合わせて、qmail ユーザーの管理と日常のメールボックス サーバーのメンテナンスを実現します。現在、社内でこのシステムを1年以上運用しており、効果は非常に高いです。これにより、メール管理者の日常的なメンテナンス作業が軽減される一方で、メールの設定に詳しくないユーザーでもオンラインでメールを送受信できるようになります。このシステムには、認証、グループ管理、電子メールの送受信、漢字エンコードなどの機能もあります。紙面の都合上、それぞれについては説明しません。




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