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

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

Jun 21, 2016 am 09:05 AM
command email php

服务器|邮件服务器

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

邮件服务器及开发环境的选择
目前很多邮件服务器不提供开发接口,因此在企业内部实现开发邮件管理系统的首要问题是,寻找一种能够与开发语言相结合的开放式邮件系统。
由于对稳定性要求很高,因此大型电子邮件系统一般都使用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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles