作者 主題: webmail 的另一種選擇 Horde/IMP  (閱讀 41602 次)

0 會員 與 1 訪客 正在閱讀本文。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5389
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
webmail 的另一種選擇 Horde/IMP
« 於: 2005-04-25 18:09 »
最近, 我們公司的 mail server 負荷一直很重, 觀察了一陣子, 猜測可能的原因是:
1. 太多人了, 使用者已經超過 1100 人.
2. 多數的員工沒有固定電腦, 都透過 webmail 使用. 信件都是放在 server 上頭.
3. 傳統的 mbox 使用的儲存格式, 在檔案超過一定大小後, 常常發生信送進來時與讀信程式互相 lock 的問題.
4. openwebmail 實在有點兒慢.
5. 員工多... 表示上線的人也多, 通常會有數百人在線上使用. web server 的 loading 也大.

所以, 我們為了解決這個問題, 在考慮使用多台的 web server 來分散 loading 的同時, 也考慮到 openwebmail 是直接讀取信件檔的方式來運作, 加上只支援 mbox 的信件格式. 在分散多台機器的處理上頭, 對於信件的讀取, 是一個很大的問題.

為了解決上述第 3 個問題, 所以考慮改用 maildir 格式來處理, 如此下來, 可以大幅降低收送信件時的 lock 問題, 也可以避免信件過多時, 檔案太大時, 每次讀一封信就要幾乎要讀一整個檔案.

另外, 為了解決上述的第 5 個問題, 要使用 LVS 的方式來分散處理.

所以, 直接讀取信件檔案, 且只支援 mbox 的 openwebmail 就不列入繼續使用的考慮範圍內.

後來, 我們採用了 Horde 的 IMP 方式來處理. 由於是透過 IMAP 來讀信, 所以, 當然不用考慮信件格式的支援. 而且, 這個程式本身就支援使用資料庫來處理 session 的問題, 也更容易在 LVS 下頭使用.

所以, 如果你有類似的問題, 或許也可以考慮使用 IMP.
使用的結果, 並不覺得有比不上 OpenWebMail 的地方, 整個畫面看起來也很漂亮, 4.0 的版本也完全沒有中文上的問題. 更重要的是... 它是用 php 寫的, 我們改起來比較容易些.

mbox 轉成 maildir 可以用這個程式:
http://batleth.sapienti-sat.org/projects/mb2md/

horde 的網址:
http://www.horde.org/

上頭有簡單的安裝說明, 並不會太複雜.

phantom

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 2185
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #1 於: 2005-04-25 18:18 »
Squirrelmail 也不錯. 我也是用 MailDir format. 好像也可使用 LVS.
http://www.squirrelmail.org/

至於 mbox to Maildir. For Debian user, 可以直接 apt-get install mb2md (stable 還沒有).
害我當初還找了半天. 結果近在眼前.
:-)
Linux 非萬能, 沒 Linux 萬萬不能.
root = God
apt-get install ultimate-horsepower

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5389
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
webmail 的另一種選擇 Horde/IMP
« 回覆 #2 於: 2005-04-25 18:31 »
Squirrelmail 有考慮過. 但是.... 總覺得很 "陽春".... 就版面的設計與功能來看,似乎都與我們原本用的 OWM 有段差距.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5389
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
webmail 的另一種選擇 Horde/IMP
« 回覆 #3 於: 2005-04-25 21:13 »
對了, 有個比較不好的地方是..... 相關的文件太少了.
有很多的設定都需要懂點 php 才比較容易設定. 多數的設定檔都是直接使用 php 的變數來設定. (相關的 php 檔案內會有說明)

過幾天如果有空, 再來寫寫心得.

PS. 由於 Horde 3 才出來沒多久, 之前有些 module 不能直接用, 目前除了 address book, task, note, calendar, filter, virtual disk 外, 好像其它的都不能用. (也夠多了) 我們需要的, 只有 password 的修改模組不能用, 要改一下才能用... 有空再說吧.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5389
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
webmail 的另一種選擇 Horde/IMP
« 回覆 #4 於: 2005-05-09 10:01 »
這是有關 passwd 模組的修改.
這個修改可以在 ldap 與 poppassd 下頭可以變更密碼.

另外, 可以自製一個 passwd.png 放 passwd/themes/graphics/ 下頭, 會出現在選單裡頭.

預設應該不會啟用這個 module, 必須修改 horde/config/registry.php 裡頭有關 passwd 這個  application 的 status 改為 active.

代碼: [選擇]
diff -Nur passwd.orig/config/backends.php passwd/config/backends.php
--- passwd.orig/config/backends.php 2005-05-09 09:43:31.476455008 +0800
+++ passwd/config/backends.php 2005-05-01 23:42:16.116712000 +0800
@@ -67,7 +67,7 @@
  */
 
 $backends['poppassd'] = array(
-    'name' => 'Example poppassd server',
+    'name' => 'TeaTime poppassd server',
     'preferred' => '',
     'password policy' => array(),
     'driver' => 'poppassd',
@@ -77,120 +77,3 @@
     )
 );
 
-$backends['servuftp'] = array(
-    'name' => 'Example servuftp server',
-    'preferred' => '',
-    'password policy' => array(),
-    'driver' => 'servuftp',
-    'params' => array(
-        'host' => 'localhost',
-        'port' => 106,
- 'timeout' => 30
-    )
-);
-
-$backends['expect'] = array(
-    'name' => 'Example expect script',
-    'preferred' => '',
-    'password policy' => array(),
-    'driver' => 'expect',
-    'params' => array(
-        'program' => '/usr/bin/expect',
-        'script' => 'scripts/passwd_expect',
-        'params' => '-telnet -host localhost -output /tmp/passwd.log'
-    )
-);
-
-$backends['smbpasswd'] = array(
-    'name' => 'Example smbpasswd server',
-    'preferred' => '',
-    'password policy' => array(),
-    'driver' => 'smbpasswd',
-    'params' => array(
-        'program' => '/usr/bin/smbpasswd',
-        'host' => 'localhost'
-    )
-);
-
-$backends['ldap'] = array(
-    'name' => 'Example LDAP server',
-    'preferred' => 'www.example.com',
-    'password policy' => array(
-        'minLength' => 3,
-        'maxLength' => 8
-    ),
-    'driver' => 'ldap',
-    'params' => array(
-        'host' => 'localhost',
-        'port' => 389,
-        'basedn' => 'o=example.com',
-        'uid' => 'uid',
-        'realm' => '', // this will be appended to the username when
-                       // looking for the userdn.
-//        'userdn' => 'uid=' . Auth::getAuth() . ',o=example.com',
-        'encryption' => 'crypt'
-    )
-);
-
-$backends['sql'] = array (
-    'name' => 'Horde Authentication',
-    'preferred' => '',
-    'password policy' => array(
-        'minLength' => 3,
-        'maxLength' => 8,
-        'maxSpace' => 0,
-        'minUpper' => 1,
-        'minLower' => 1,
-        'minNumeric' => 1
-    ),
-    'driver' => 'sql',
-    'params' => array(
-        'phptype'    => 'mysql',
-        'hostspec'   => 'localhost',
-        'username'   => 'horde',
-        'password'   => '',
-        'encryption' => 'md5-hex',
-        'database'   => 'horde',
-        'table'      => 'horde_users',
-        'user_col'   => 'user_uid',
-        'pass_col'   => 'user_pass'
-    )
-);
-
-$backends['vmailmgr'] = array(
-    'name' => 'vmailmgt Example',
-    'preferred' => '',
-    'password policy' => array(),
-    'driver' => 'vmailmgr',
-    'params' => array(
-        'vmailinc' => '/your/path/to/the/vmail.inc'
-    )
-);
-
-$backends['vpopmail'] = array (
-    'name' => 'vpopmail Authentication',
-    'preferred' => '',
-    'password policy' => array(
-        'minLength' => 3,
-        'maxLength' => 8,
-        'maxSpace' => 0,
-        'minUpper' => 0,
-        'minLower' => 0,
-        'minNumeric' => 0
-    ),
-    'driver' => 'vpopmail',
-    'params' => array(
-        'phptype'    => 'mysql',
-        'hostspec'   => 'localhost',
-        'username'   => '',
-        'password'   => '',
-        'encryption' => 'crypt',
-        'database'   => 'vpopmail',
-        'table'      => 'vpopmail',
-        'name'    => 'pw_name',
-        'domain'  => 'pw_domain',
- 'passwd' =>  'pw_passwd',
- 'clear_passwd' => 'pw_clear_passwd',
- 'use_clear_passwd' => true
-    )
-);
diff -Nur passwd.orig/lib/Driver/ldap.php passwd/lib/Driver/ldap.php
--- passwd.orig/lib/Driver/ldap.php 2003-02-16 04:16:29.000000000 +0800
+++ passwd/lib/Driver/ldap.php 2005-04-22 22:43:30.000000000 +0800
@@ -86,7 +86,7 @@
         $this->_connect();
 
         // construct search
-        $search = $this->_params['uid'] . '=' . $user;
+        $search = '('.$this->_params['uid'] . '=' . $user . ')';
         if (!empty($this->_params['realm'])) {
             $search .= '@' . $this->_params['realm'];
         }
diff -Nur passwd.orig/lib/base.php passwd/lib/base.php
--- passwd.orig/lib/base.php 2003-01-21 09:28:32.000000000 +0800
+++ passwd/lib/base.php 2005-04-22 21:33:38.000000000 +0800
@@ -20,17 +20,26 @@
 // Find the base file path of PASSWD
 @define('PASSWD_BASE', dirname(__FILE__) . '/..');
 
+// Load the Horde Framework core, and set up inclusion paths.
+require_once HORDE_BASE . '/lib/core.php';
+
 // Registry
-require_once HORDE_BASE . '/lib/Registry.php';
+//require_once HORDE_BASE . '/lib/Registry.php';
 $registry = &Registry::singleton();
-$registry->pushApp('passwd');
+//$registry->pushApp('passwd');
+if (is_a(($pushed = $registry->pushApp('passwd', !defined('AUTH_HANDLER'))), 'PEAR_Error')) {
+    if ($pushed->getCode() == 'permission_denied') {
+        Horde::authenticationFailureRedirect();
+    }
+    Horde::fatal($pushed, __FILE__, __LINE__, false);
+}
 $conf = &$GLOBALS['conf'];
 
 // Set the error reporting level in accordance with the config settings.
-error_reporting($conf['debug_level']);
+//error_reporting($conf['debug_level']);
 
 // Set the maximum execution time in accordance with the config settings.
-set_time_limit($conf['max_exec_time']);
+//set_time_limit($conf['max_exec_time']);
 
 // set the umask according to config settings
 if (isset($conf['umask'])) {
@@ -38,16 +47,19 @@
 }
 
 // Horde base libraries
-require_once HORDE_BASE . '/lib/Horde.php';
-require_once HORDE_BASE . '/lib/Auth.php';
-require_once HORDE_BASE . '/lib/Secret.php';
-require_once HORDE_BASE . '/lib/Text.php';
-require_once HORDE_BASE . '/lib/Help.php';
+//require_once HORDE_BASE . '/lib/Horde.php';
+//require_once HORDE_BASE . '/lib/Auth.php';
+//require_once HORDE_BASE . '/lib/Secret.php';
+//require_once HORDE_BASE . '/lib/Text.php';
+//require_once HORDE_BASE . '/lib/Help.php';
 
 // Passwd base library
 require_once PASSWD_BASE . '/lib/Passwd.php';
 
+@define('PASSWD_TEMPLATES', $registry->get('templates'));
+
 // Browser detection library
+/*
 require_once HORDE_BASE . '/lib/Browser.php';
 $browser = new Browser();
 if (isset($session_control)) {
@@ -68,9 +80,29 @@
         break;
     }
 }
+*/
+$session_control = Util::nonInputVar('session_control');
+switch ($session_control) {
+case 'netscape':
+    if ($browser->isBrowser('mozilla')) {
+        session_cache_limiter('private, must-revalidate');
+    }
+    break;
+
+    case 'cache_ssl_downloads':
+        header('Vary: User-Agent');
+        if ($browser->hasQuirk('cache_ssl_downloads')
+            && isset($GLOBALS['HTTP_SERVER_VARS']['HTTPS'])
+            && ($GLOBALS['HTTP_SERVER_VARS']['HTTPS'] == 'on')) {
+            session_cache_limiter('private, must-revalidate');
+        }
+        break;
+}
+
 
 // Code that should be run at the beginning of all Passwd pages
-session_name($conf['session_name']);
+//session_name($conf['session_name']);
+session_name(urlencode($conf['session']['name']));
 @session_start();
 
 // Don't allow access unless there is a Horde login
diff -Nur passwd.orig/main.php passwd/main.php
--- passwd.orig/main.php 2004-03-27 06:43:28.000000000 +0800
+++ passwd/main.php 2005-04-22 22:48:24.000000000 +0800
@@ -13,17 +13,20 @@
 include_once PASSWD_BASE . '/config/conf.php';
 include_once PASSWD_BASE . '/config/backends.php';
 
+$passwd_msg = '';
+
 // use a do-while to allow easy breaking if an error is found
 do {
     // has the user submitted the form yet?
-    $submit = Horde::getFormData('submit', false);
+//    $submit = Horde::getFormData('submit', false);
+    $submit = Util::getFormData('submit', false);
     if ( !$submit ) {
         // no so we don't need to do anything in this loop
         break;
     }
 
     // get the backend details
-    $backend_key = Horde::getFormData('backend', false);
+    $backend_key = Util::getFormData('backend', false);
     $driver = $backends[$backend_key]['driver'];
     $params = $backends[$backend_key]['params'];
     $passwordPolicy = array_key_exists('password policy',
@@ -32,53 +35,53 @@
         : array();
 
     // Get the username
-    $userid = Horde::getFormData('userid');
+    $userid = Util::getFormData('userid');
 
     // Check for users that can not change their passwords
     if (in_array($userid, $conf['user']['refused'])) {
-       Horde::raiseMessage(sprintf(_("You can't change password for user %s"),
-                           $userid), HORDE_ERROR);
+       $passwd_msg = (sprintf(_("You can't change password for user %s"),
+                           $userid));
        break;
     }
 
     // We must be passed the old (current) password, or its an error
-    $oldpassword = Horde::getFormData('oldpassword', false);
+    $oldpassword = Util::getFormData('oldpassword', false);
     if (!$oldpassword) {
-        Horde::raiseMessage(_("You must give your old password"),HORDE_WARNING);
+        $passwd_msg = (_("You must give your old password"));
         break;
     }
 
     // See if they entered the new password and verified it.
-    $newpassword0 = Horde::getFormData('newpassword0', false);
-    $newpassword1 = Horde::getFormData('newpassword1', false);
+    $newpassword0 = Util::getFormData('newpassword0', false);
+    $newpassword1 = Util::getFormData('newpassword1', false);
     if (!$newpassword0) {
-        Horde::raiseMessage(_("You must give your new password"),HORDE_WARNING);
+        $passwd_msg = (_("You must give your new password"));
         break;
     }
     if (!$newpassword1) {
-        Horde::raiseMessage(_("You must verify your new password"),
-                            HORDE_WARNING);
+        $passwd_msg = (_("You must verify your new password")
+                            );
         break;
     }
     if ($newpassword0 != $newpassword1) {
-        Horde::raiseMessage( _("Your new passwords didn't match"),HORDE_WARNING);
+        $passwd_msg = ( _("Your new passwords didn't match"));
         break;
     }
 
     if ($newpassword0 == $oldpassword) {
-        Horde::raiseMessage(_("Your new password must be different from your current password"), HORDE_WARNING);
+        $passwd_msg = (_("Your new password must be different from your current password"));
         break;
     }
 
     // check max/min lengths if specified in the backend config
     if (array_key_exists('minLength', $passwordPolicy) &&
         strlen($newpassword0) < $passwordPolicy['minLength']) {
-        Horde::raiseMessage(sprintf(_("Your new password must be at least %d characters long!"), $passwordPolicy['minLength']), HORDE_WARNING);
+        $passwd_msg = (sprintf(_("Your new password must be at least %d characters long!"), $passwordPolicy['minLength']) );
         break;
     }
     if (array_key_exists('maxLength', $passwordPolicy) &&
         strlen($newpassword0) > $passwordPolicy['maxLength']) {
-        Horde::raiseMessage(sprintf(_("Your new password is too long; passwords may not be more than %d characters long!"), $passwordPolicy['maxLength']), HORDE_WARNING);
+        $passwd_msg = (sprintf(_("Your new password is too long; passwords may not be more than %d characters long!"), $passwordPolicy['maxLength']) );
         break;
     }
 
@@ -113,34 +116,34 @@
     // check reamaining password policy options.
     if (array_key_exists('minUpper', $passwordPolicy) &&
         $passwordPolicy['minUpper'] > $upper) {
-        Horde::raiseMessage(sprintf(_("Your new password must contain at least %d uppercase characters."), $passwordPolicy['minUpper']), HORDE_WARNING);
+        $passwd_msg = (sprintf(_("Your new password must contain at least %d uppercase characters."), $passwordPolicy['minUpper']) );
         break;
     }
     if (array_key_exists('minLower', $passwordPolicy) &&
         $passwordPolicy['minLower'] > $lower) {
-        Horde::raiseMessage(sprintf(_("Your new password must contain at least %d lowercase characters."), $passwordPolicy['minLower']), HORDE_WARNING);
+        $passwd_msg = (sprintf(_("Your new password must contain at least %d lowercase characters."), $passwordPolicy['minLower']) );
         break;
     }
     if (array_key_exists('minNumeric', $passwordPolicy) &&
         $passwordPolicy['minNumeric'] > $num) {
-        Horde::raiseMessage(sprintf(_("Your new password must contain at least %d numeric characters."), $passwordPolicy['minNumeric']), HORDE_WARNING);
+        $passwd_msg = (sprintf(_("Your new password must contain at least %d numeric characters."), $passwordPolicy['minNumeric']) );
         break;
     }
     if (array_key_exists('minAlpha', $passwordPolicy) &&
         $passwordPolicy['minAlpha'] > $alpha) {
-        Horde::raiseMessage(sprintf(_("Your new password must contain at least %d alphabetic characters."), $passwordPolicy['minAlpha']), HORDE_WARNING);
+        $passwd_msg = (sprintf(_("Your new password must contain at least %d alphabetic characters."), $passwordPolicy['minAlpha']) );
         break;
     }
    if (array_key_exists('minAlphaNum', $passwordPolicy) &&
         $passwordPolicy['minAlphaNum'] > $alnum) {
-        Horde::raiseMessage(sprintf(_("Your new password must contain at least %d alphanumeric characters."), $passwordPolicy['minAlphaNum']), HORDE_WARNING);        break;
+        $passwd_msg = (sprintf(_("Your new password must contain at least %d alphanumeric characters."), $passwordPolicy['minAlphaNum']) );        break;
     }
     if (array_key_exists('maxSpace', $passwordPolicy) &&
         $passwordPolicy['maxSpace'] < $space) {
         if ($paswordPolicy['maxSpace'] > 0) {
-            Horde::raiseMessage(sprintf(_("Your new password must contain less than %d whitespace characters."), $passwordPolicy['maxSpace']), HORDE_WARNING);
+            $passwd_msg = (sprintf(_("Your new password must contain less than %d whitespace characters."), $passwordPolicy['maxSpace']) );
         } else {
-            Horde::raiseMessage(_("Your new password must not contain whitespace characters."), HORDE_WARNING);
+            $passwd_msg = (_("Your new password must not contain whitespace characters.") );
         }
         break;
     }
@@ -152,7 +155,7 @@
             (strcasecmp($newpassword0, strrev($userid)) == 0) ||
             (strcasecmp($newpassword0, $oldpassword) == 0) ||
             (strcasecmp($newpassword0, strrev($oldpassword)) == 0) ) {
-          Horde::raiseMessage(_("Your new password is too simple to guess!  Not changed!"), HORDE_WARNING);
+          $passwd_msg = (_("Your new password is too simple to guess!  Not changed!") );
             break;
         }
         // check for percentages similarity also.  This will catch very simple
@@ -160,7 +163,7 @@
         @similar_text($newpassword0, $oldpassword, $percent1);
         @similar_text($newpassword0, $userid, $percent2);
         if ( ($percent1 > 80) || ($percent2 > 80) ) {
-           Horde::raiseMessage(_("Your new password is too simple to guess!  Not changed!"), HORDE_WARNING);
+           $passwd_msg = (_("Your new password is too simple to guess!  Not changed!") );
             break;
         }
     }
@@ -170,7 +173,7 @@
     $daemon = &Passwd_Driver::factory($driver, $params);
 
     if ($daemon === false) {
-       Horde::raiseMessage(_("Password module is not properly configured"), HORDE_ERROR);
+       $passwd_msg = (_("Password module is not properly configured"));
     } else {
         $backend_userid = $userid;
 
@@ -185,10 +188,10 @@
                                         $newpassword0);
 
         if (!PEAR::isError($res)) {
-            Horde::raiseMessage(_("Password changed!"), HORDE_SUCCESS);
+            $passwd_msg = (_("Password changed!"));
         } else {
-            Horde::raiseMessage( _("Failure in changing password : ") .
-                    $res->getMessage(), HORDE_ERROR);
+            $passwd_msg = ( _("Failure in changing password : ") .
+                    $res->getMessage());
         }
     }
 } while (0);
@@ -230,10 +233,10 @@
 }
 
 $title = _("Change Password");
-require $registry->getTemplatePath() . '/common-header.inc';
-require_once $registry->getTemplatePath('horde') . '/javascript/open_help_win.js';
-require $registry->getTemplatePath() . '/main/javascript.inc';
-require $registry->getFileRoot() . '/status.php';
-require $registry->getTemplatePath() . '/main/main.inc';
+require PASSWD_TEMPLATES . '/common-header.inc';
+//require_once $registry->get('templates', 'horde') . '/javascript/open_help_win.js';
+require PASSWD_TEMPLATES . '/main/javascript.inc';
+require PASSWD_BASE . '/status.php';
+require PASSWD_TEMPLATES . '/main/main.inc';
 require PASSWD_BASE . '/templates/common-footer.inc';
 ?>
diff -Nur passwd.orig/templates/common-footer.inc passwd/templates/common-footer.inc
--- passwd.orig/templates/common-footer.inc 2002-06-30 04:47:22.000000000 +0800
+++ passwd/templates/common-footer.inc 2005-04-22 21:56:41.000000000 +0800
@@ -1,10 +1,3 @@
 <?php // $Horde&#58; passwd/templates/common-footer.inc,v 1.1.1.1.2.1 2002/06/29 20&#58;47&#58;22 ericr Exp $ ?>
-<?php if &#40;!empty&#40;$title&#41;&#41;&#58; ?>
-<script language="JavaScript" type="text/javascript">
-<!--
-if (parent.frames.horde_main) parent.document.title = '<?php echo addslashes&#40;$registry->getName&#40;&#41; . ' &#58;&#58; ' . $title&#41; ?>';
-//-->
-</script>
-<?php endif; ?>
 </body>
 </html>
diff -Nur passwd.orig/templates/common-header.inc passwd/templates/common-header.inc
--- passwd.orig/templates/common-header.inc 2004-03-27 06:43:28.000000000 +0800
+++ passwd/templates/common-header.inc 2005-05-01 23:51:27.658724000 +0800
@@ -1,7 +1,8 @@
 <?php
 
// $Horde&#58; passwd/templates/common-header.inc,v 1.1.1.1.2.3 2004/03/26 22&#58;43&#58;28 jan Exp $
-if &#40;isset&#40;$language&#41; && isset&#40;$nls['charsets'&#93;[$language&#93;&#41;&#41; &#123;
-    header&#40;'Content-type&#58; text/html; charset=' . $nls['charsets'&#93;[$language&#93;&#41;;
+global $language;
+if &
#40;isset&#40;$language&#41;&#41; &#123;
+    header&#40;'Content-type&#58; text/html; charset=' . NLS&#58;&#58;getCharset&#40;&#41;&#41;;
     
header&#40;'Vary&#58; Accept-Language'&#41;;
 
&#125;
 
?>

@@ -16,7 +17,7 @@
 <?php
 
 
/* Print the page title. */
-$page_title $registry->getName&#40;&#41;;
+$page_title $GLOBALS['registry'&#93;->get&#40;'name'&#41;;
 
if &#40;!empty&#40;$title&#41;&#41; $page_title .= ' &#58;&#58; ' . $title;
 
if &#40;!empty&#40;$refresh_time&#41; && &#40;$refresh_time > 0&#41; && !empty&#40;$refresh_url&#41;&#41; &#123;
     
echo "<meta http-equiv=\"refresh\" content=\"$refresh_time;url=$refresh_url\">\n";
@@ -
24,+25,@@
 
 
?>

 <title><?php echo $page_title ?></title>
-<link href="<?php echo $registry->getWebRoot&#40;'horde'&#41; ?>/css.php?app=passwd" rel="stylesheet" type="text/css" />
+<?php echo Horde&#58;&#58;stylesheetLink&#40;'horde', empty&#40;$print_view&#41; ? '' &#58; 'print'&#41; ?>
 </head>
 
 <body<?php if &#40;!empty&#40;$js_onLoad&#41;&#41; echo ' onload="' . $js_onLoad . '"'; if &#40;!empty&#40;$bodyStyle&#41;&#41; echo ' class="' . $bodyStyle . '"' ?>>
diff -Nur passwd.orig/templates/main/main.inc passwd/templates/main/main.inc
--- passwd.orig/templates/main/main.inc 2003-01-21 09:28:36.000000000 +0800
+++ passwd/templates/main/main.inc 2005-05-01 23:47:05.159779000 +0800
@@ -4,9 +4,9 @@
 include_once PASSWD_BASE . '/templates/menu/menu.inc'; ?>
 
 <form method="post" action="<?php echo Horde&#58;&#58;applicationUrl&#40;'main.php'&#41; ?>" name="passwd">
-<?php echo Horde&#58;&#58;formInput&#40;&#41; ?>
+<?php echo Util&#58;&#58;formInput&#40;&#41; ?>
 <?php if &#40;$conf['backend'&#93;['backend_list'&#93; == 'hidden'&#41;&#58; ?>
-<input type="hidden" name="backend" value="<?php echo $backend_key ?>" />
+<input type="hidden" name="backend" value="poppassd" />
 <?php endif; ?>
 
 <?php
@@ -38,25 +38,25 @@
 <
tr>
   <
td class="light" align="right"><b><?php echo _&#40;"Username&#58;"&#41; ?>
</b></td>
   <td><input type="text" name="userid" value="<?php echo $userid ?>"></td>
-  <td width="15"><?php echo &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; ? Help&#58;&#58;link&#40;'passwd', 'passwd-username'&#41; &#58; '&nbsp;' ?></td>
+  <td width="15">&nbsp;</td>
 </tr>
 
 <tr>
   <td class="light" align="right"><b><?php echo _&#40;"Old password&#58;"&#41; ?></b></td>
   <td><input type="password" name="oldpassword" value=""></td>
-  <td width="15"><?php echo &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; ? Help&#58;&#58;link&#40;'passwd', 'passwd-old-password'&#41; &#58; '&nbsp;' ?></td>
+  <td width="15">&nbsp;</td>
 </tr>
 
 <tr>
 <td class="light" align="right"><b><?php echo _&#40;"New password&#58;"&#41; ?></b></td>
 <td><input type="password" name="newpassword0" <?php echo $size ?> value=""></td>
-<td width="15"><?php echo &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; ? Help&#58;&#58;link&#40;'passwd', 'passwd-new-password'&#41; &#58; '&nbsp;' ?></td>
+<td width="15">&nbsp;</td>
 </tr>
 
 <tr>
 <td class="light" align="right"><b><?php echo _&#40;"Confirm new password&#58;"&#41; ?></b></td>
 <td><input type="password" name="newpassword1" <?php echo $size ?> value=""></td>
-<td width="15"><?php echo &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; ? Help&#58;&#58;link&#40;'passwd', 'passwd-confirm-password'&#41; &#58; '&nbsp;' ?></td>
+<td width="15">&nbsp;</td>
 </tr>
 
 <?php if &#40;$conf['backend'&#93;['backend_list'&#93; == 'shown'&#41;&#58; ?>
@@ -67,7 +67,7 @@
             <?php echo $backends_list ?>
         </select>
     </td>
-    <td width="15"><?php echo &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; ? Help&#58;&#58;link&#40;'passwd', 'passwd-server'&#41; &#58; '&nbsp;' ?></td>
+    <td width="15">&nbsp;</td>
 <?php endif; ?>
 
 <tr>
diff -Nur passwd.orig/templates/menu/menu.inc passwd/templates/menu/menu.inc
--- passwd.orig/templates/menu/menu.inc 2002-10-10 01:51:07.000000000 +0800
+++ passwd/templates/menu/menu.inc 2005-04-22 23:03:33.000000000 +0800
@@ -1,49 +1,20 @@
-<?php
-// $Horde&#58; passwd/templates/menu/menu.inc,v 1.4.2.2 2002/10/09 17&#58;51&#58;07 ericr Exp $
 
-include_once HORDE_BASE '/lib/Menu.php';
-
?>

+<div id="menu">
+ <script language="JavaScript" type="text/javascript" src="/horde/services/javascript.php?file=goto.inc&amp;app=kronolith"></script>
+ <script language="JavaScript" type="text/javascript" src="/horde/services/javascript.php?file=open_help_win.js&amp;app=horde"></script>
+ <ul>
+  <li><a href="/horde/imp/" onmouseout="window.status='';" onmouseover="window.status='Mail'; return true;"><img src="/horde/imp/themes/graphics/imp.png" alt="Mail" title="Mail" /><br />Mail</a></li>
+  <li><a href="javascript:open_help_win('kronolith');" onmouseout="window.status='';" onmouseover="window.status='Help'; return true;" accesskey="H"><img src="/horde/themes/graphics/help_index.png" alt="Help" title="Help" /><br /><span class="accessKey">H</span>elp</a></li>
+  <li><a href="/horde/login.php?logout_reason=logout" onmouseout="window.status='';" onmouseover="window.status='Log out'; return true;" target="_parent" accesskey="L"><img src="/horde/themes/graphics/logout.png" alt="Log out" title="Log out" /><br /><span class="accessKey">L</span>og out</a></li>
+  </ul>
+</div>
 
 <table border="0" cellpadding="2" cellspacing="0" width="100%">
 <tr>
     <td class="menu">
-
 <table border="0" width="100%">
 <tr>
-<?php
-
-
-
/* Additional site-specific menu items */
-if &#40;!empty&#40;$additional_items&#41;&#41; echo $additional_items;
-
-
/* Links to other Horde applications. */
-if &#40;isset&#40;$conf['menu'&#93;['apps'&#93;&#41; && is_array&#40;$conf['menu'&#93;['apps'&#93;&#41;&#41; &#123;
-    foreach &#40;$conf['menu'&#93;['apps'&#93; as $app&#41; &#123;
-        Menu&#58;&#58;printItem&#40;Horde&#58;&#58;url&#40;$registry->getInitialPage&#40;$app&#41;&#41;,
-                        $registry->getParam&#40;'name', $app&#41;, $registry->getParam&#40;'icon', $app&#41;, ''&#41;;
-    &#125;
-&#125;
-
-
/* Horde menu items */
-/* Online Help */
-if &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; &#123;
-    Menu&#58;&#58;printItem&#40;Help&#58;&#58;listLink&#40;'passwd'&#41;, _&#40;"Help"&#41;, 'help.gif', $registry->getGraphicsPath&#40;"horde"&#41;&#41;;
-&#125;
-
-
/* Problem reporting */
-if &#40;$conf['problems'&#93;['enabled'&#93;&#41; &#123;
-    include_once HORDE_BASE '/lib/Identity.php';
-    
$prob_identity = new Identity&#40;&#41;;
-    Menu&#58;&#58;printItem&#40;Horde&#58;&#58;url&#40;$registry->getWebRoot&#40;"horde"&#41; . '/problem.php?email=' . urlencode&#40;$prob_identity->getValue&#40;'from_addr'&#41;&#41; . '&name=' . urlencode&#40;$prob_identity->getValue&#40;'fullname'&#41;&#41; . '&return_url=' . urlencode&#40;Horde&#58;&#58;url&#40;$_SERVER['PHP_SELF'&#93;, true&#41;&#41;&#41;, _&#40;"Problem?"&#41;, 'problem.gif', $registry->getGraphicsPath&#40;"horde"&#41;&#41;;
-&#125;
-
-
/* Logout */
-Menu&#58;&#58;printItem&#40;Horde&#58;&#58;url&#40;$registry->getWebRoot&#40;'horde'&#41; . '/login.php?reason=logout'&#41;, _&#40;"Logout"&#41;, 'logout.gif', $registry->getGraphicsPath&#40;"horde"&#41;&#41;;
-
-
?>

-
 <td width="100%">&nbsp;</td><!-- spacer -->
-
 </tr>
 </table>
 
@@ -52,3 +23,12 @@
 </table>
 
 <br />
+
+<table border="0" cellpadding="0" cellspacing="5">
+<tr>
+    <td align="center" colspan="3" class="form-err">
+        <b><?php echo $passwd_msg?></b>
+    </td>
+</tr>
+
+<br />
diff -Nur passwd.orig/templates/menu/menu.inc.old passwd/templates/menu/menu.inc.old
--- passwd.orig/templates/menu/menu.inc.old 1970-01-01 08:00:00.000000000 +0800
+++ passwd/templates/menu/menu.inc.old 2005-04-22 21:43:40.000000000 +0800
@@ -0,0 +1,54 @@
+<?php
+// $Horde&#58; passwd/templates/menu/menu.inc,v 1.4.2.2 2002/10/09 17&#58;51&#58;07 ericr Exp $
+
+include_once 
'Horde/Menu.php';
+
?>

+
+<table border="0" cellpadding="2" cellspacing="0" width="100%">
+<tr>
+    <td class="menu">
+
+<table border="0" width="100%">
+<tr>
+<?php
+
+
+
/* Additional site-specific menu items */
+if &#40;!empty&#40;$additional_items&#41;&#41; echo $additional_items;
+
+
/* Links to other Horde applications. */
+if &#40;isset&#40;$conf['menu'&#93;['apps'&#93;&#41; && is_array&#40;$conf['menu'&#93;['apps'&#93;&#41;&#41; &#123;
+    foreach &#40;$conf['menu'&#93;['apps'&#93; as $app&#41; &#123;
+        Menu&#58;&#58;printItem&#40;Horde&#58;&#58;url&#40;$registry->getInitialPage&#40;$app&#41;&#41;,
+                        $registry->getParam&#40;'name', $app&#41;, $registry->getParam&#40;'icon', $app&#41;, ''&#41;;
+    &#125;
+&#125;
+
+
/* Horde menu items */
+/* Online Help */
+if &#40;$conf['user'&#93;['online_help'&#93; && $browser->hasFeature&#40;'javascript'&#41;&#41; &#123;
+    Menu&#58;&#58;printItem&#40;Help&#58;&#58;listLink&#40;'passwd'&#41;, _&#40;"Help"&#41;, 'help.gif', $registry->getGraphicsPath&#40;"horde"&#41;&#41;;
+&#125;
+
+
/* Problem reporting */
+if &#40;$conf['problems'&#93;['enabled'&#93;&#41; &#123;
+    include_once HORDE_BASE '/lib/Identity.php';
+    
$prob_identity = new Identity&#40;&#41;;
+    Menu&#58;&#58;printItem&#40;Horde&#58;&#58;url&#40;$registry->getWebRoot&#40;"horde"&#41; . '/problem.php?email=' . urlencode&#40;$prob_identity->getValue&#40;'from_addr'&#41;&#41; . '&name=' . urlencode&#40;$prob_identity->getValue&#40;'fullname'&#41;&#41; . '&return_url=' . urlencode&#40;Horde&#58;&#58;url&#40;$_SERVER['PHP_SELF'&#93;, true&#41;&#41;&#41;, _&#40;"Problem?"&#41;, 'problem.gif', $registry->getGraphicsPath&#40;"horde"&#41;&#41;;
+&#125;
+
+
/* Logout */
+Menu&#58;&#58;printItem&#40;Horde&#58;&#58;url&#40;$registry->getWebRoot&#40;'horde'&#41; . '/login.php?reason=logout'&#41;, _&#40;"Logout"&#41;, 'logout.gif', $registry->getGraphicsPath&#40;"horde"&#41;&#41;;
+
+
?>

+
+<td width="100%">&nbsp;</td><!-- spacer -->
+
+</tr>
+</table>
+
+    </td>
+</tr>
+</table>
+
+<br />

phantom

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 2185
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #5 於: 2005-05-09 15:21 »
唉... 被 apt-get install 給寵壞了...

今天想試試 Horde2 and Horde3.
Both package install without any problem. 不過可以因為我還不熟 Horde, 搞半天搞不定. 看樣子要多花一點時間 google 看有沒有相關文件.
http://www.horde.org 上的文件真的蠻"簡單"的...

先裝上了 Squirrelmail, 不到 20 分鐘就 ok 了. 目前相關的 package 有:
Postfix + courier-imap ( with UTF-8 ) + amavisd + Antivir + sasl + TLS + Squirrelmail...
Linux 非萬能, 沒 Linux 萬萬不能.
root = God
apt-get install ultimate-horsepower

phantom

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 2185
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #6 於: 2005-05-09 17:49 »
引述: "phantom"
唉... 被 apt-get install 給寵壞了...

今天想試試 Horde2 and Horde3.
Both package install without any problem. 不過可以因為我還不熟 Horde, 搞半天搞不定. 看樣子要多花一點時間 google 看有沒有相關文件.
http://www.horde.org 上的文件真的蠻"簡單"的...

先裝上了 Squirrelmail, 不到 20 分鐘就 ok 了. 目前相關的 package 有:
Postfix + courier-imap ( with UTF-8 ) + amavisd + Antivir + sasl + TLS + Squirrelmail...


果然是我沒有認真.
仔細看了 debian package 內含的 README & 其他的 DOC. Horde/IMP 可以正常使用了.
Linux 非萬能, 沒 Linux 萬萬不能.
root = God
apt-get install ultimate-horsepower

hsiao_peter

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #7 於: 2005-05-22 01:57 »
引述: "phantom"
引述: "phantom"
唉... 被 apt-get install 給寵壞了...

今天想試試 Horde2 and Horde3.
Both package install without any problem. 不過可以因為我還不熟 Horde, 搞半天搞不定. 看樣子要多花一點時間 google 看有沒有相關文件.
http://www.horde.org 上的文件真的蠻"簡單"的...

先裝上了 Squirrelmail, 不到 20 分鐘就 ok 了. 目前相關的 package 有:
Postfix + courier-imap ( with UTF-8 ) + amavisd + Antivir + sasl + TLS + Squirrelmail...


果然是我沒有認真.
仔細看了 debian package 內含的 README & 其他的 DOC. Horde/IMP 可以正常使用了.

環境: Redhat9+imp-3.2.1-1+horde-2.2.3-1+turba-1.2-1
mysql-3.23.58-1.9+httpd-2.0.40-21.11

請問一下我進入信箱後更改設定後不能儲存 會有 發生了一個嚴重的錯誤:

DB Error: connect failed

[位於行 108 共 /home/www/www/horde/lib/Prefs/sql.php 行]

細節請參考系統管理登錄.

在 /var/log/messages 找不到錯誤的紀錄 請問正確紀錄在哪
還有 資料庫里只有table 沒有紀錄 是不是要先登陸成管理員 ?如何登陸成管理員有特定帳號嗎?
謝謝!!!

LPJ

  • 懷疑的國中生
  • **
  • 文章數: 81
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #8 於: 2005-05-23 01:15 »
代碼: [選擇]
root@708room[/usr/ports/www/horde]#make install clean
===>  Installing for horde-3.0.4_1
===>   horde-3.0.4_1 depends on file: /usr/local/share/pear/Date.php - not found
===>    Verifying install for /usr/local/share/pear/Date.php in /usr/ports/devel/pear-Date
===>   pear-Date-1.4.3 depends on file: /usr/local/share/pear/PEAR.php - not found
===>    Verifying install for /usr/local/share/pear/PEAR.php in /usr/ports/devel/pear-PEAR
===>   pear-PEAR-1.3.5 depends on file: /usr/local/share/pear/Archive/Tar.php - not found
===>    Verifying install for /usr/local/share/pear/Archive/Tar.php in /usr/ports/archivers/pear-Archive_Tar
===>  Installing for pear-Archive_Tar-1.3.1
===>   pear-Archive_Tar-1.3.1 depends on executable: pear - not found
===>    Verifying install for pear in /usr/ports/devel/php4-pear
This port requires the CLI or the CGI version of PHP, but you have
already installed a conflicting PHP port without them.
*** Error code 1

Stop in /usr/ports/devel/php4-pear.
*** Error code 1

Stop in /usr/ports/archivers/pear-Archive_Tar.
*** Error code 1

Stop in /usr/ports/devel/pear-PEAR.
*** Error code 1

Stop in /usr/ports/devel/pear-Date.
*** Error code 1

Stop in /usr/ports/www/horde.

This port requires the CLI or the CGI version of PHP, but you have
already installed a conflicting PHP port without them.
以上錯誤訊息是要我要從新安裝PHP嗎?

hsiao_peter

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #9 於: 2005-05-24 23:04 »
引述: "phantom"
引述: "phantom"
唉... 被 apt-get install 給寵壞了...

今天想試試 Horde2 and Horde3.
Both package install without any problem. 不過可以因為我還不熟 Horde, 搞半天搞不定. 看樣子要多花一點時間 google 看有沒有相關文件.
http://www.horde.org 上的文件真的蠻"簡單"的...

先裝上了 Squirrelmail, 不到 20 分鐘就 ok 了. 目前相關的 package 有:
Postfix + courier-imap ( with UTF-8 ) + amavisd + Antivir + sasl + TLS + Squirrelmail...


果然是我沒有認真.
仔細看了 debian package 內含的 README & 其他的 DOC. Horde/IMP 可以正常使用了.

大大請問我是哪裡設錯  我的環境 環境: Redhat9+imp-3.2.1-1+horde-2.2.3-1+turba-1.2-1
mysql-3.23.58-1.9+httpd-2.0.40-21.11 +dovecot-0.99.14-1mdk

我換了rpm版本後 出現Auth_imap: Required IMAP functions were not found.
我找了一下  apache httpd.conf
[root@ns1 tmp]# cat /usr/share/ADVX/compat/httpd.conf|grep imap.so
LoadModule imap_module        modules/mod_imap.so
還有php.ini設定
[root@ns1 tmp]# cat /usr/share/doc/php-imap-4.3.10/README.imap
The php-imap package contains a dynamic shared object (DSO) for PHP.
To activate it, make sure a file /etc/php.d/26_imap.ini is present and
contains the line 'extension = imap.so'.
[root@ns1 tmp]# vi /etc/php.d/26_imap.ini
[root@ns1 tmp]# cat /etc/php.d/26_imap.ini
; the imap extension is now built against the shared c-client library,
; should this fail use the next line instead.
; extension = imap-static.so
extension = imap.so
也有開阿  請問我還漏了什麼   謝謝!!!

hsiao_peter

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
libwrap refused connection to poppassd
« 回覆 #10 於: 2005-06-28 13:55 »
後來檢查的結果有些 程式沒裝的結果造成
現在已經正常 不過裝了poppassd-ceti-1.8.5-rh9
發現有個問題 不能更改密碼
查/var/log/messages

Jun 28 13:14:23 www xinetd[5446]: libwrap refused connection to poppassd from 127.0.0.1
請問有哪個地方須注意嗎

hsiao_peter

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
問題找到了!!!
« 回覆 #11 於: 2005-06-28 22:58 »
/etc/hosts.allow 要設

cskp

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #12 於: 2006-08-17 10:12 »
turba中文如何解

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5389
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
webmail 的另一種選擇 Horde/IMP
« 回覆 #13 於: 2006-08-17 12:34 »
turba 中文? 沒碰過有什麼問題.
看你的資料庫吧, 如果是用 mysql, 也用 utf-8 編碼, 應該不會有中文問題.

ybao

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #14 於: 2006-09-24 23:19 »
如何讓 User Account 在 mysql 中, 並讓 postfix and imap servie 作認證,完成步驟或文件,有人做出來嗎?

tcwy

  • 憂鬱的高中生
  • ***
  • 文章數: 93
  • 性別: 男
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #15 於: 2006-12-15 13:25 »
Horde / IMP 這套 webmail 系統真的是不錯!畫面美觀,功能又齊備。

不過小弟遇到問題了!!!

寄出的郵件,內文中文不是亂碼,就是漏字!

而標題不會!

有聽過網友說改程式的編碼部分,只是沒見他說改哪一段!可否指點迷津呢?

安裝的版本:
Horde 3.1.3
IMP 4.1.3

anderson1127

  • 訪客
webmail 的另一種選擇 Horde/IMP
« 回覆 #16 於: 2006-12-23 00:47 »
嗯? twu2大與我的思考方向似乎相反 , 我是思考如何將maildir 轉成 mailbox
以方便Openwebmail 也能夠去讀取 maildir mail !!

不過問題很多, 我就放棄修改Openwebmail了 !! 因為沒太多時間做這一段... :oops:

這是我之前Google來的script , 號稱說可以把maildiir 的mail 轉成mailbox 格式
我沒試過,有興趣的人可以試看看有沒有問題!!

代碼: [選擇]
#! /bin/sh
#
# Get a directory name as input and convert all mail files inside
# to mbox format
#
# NOTE: processing of subdirectories not yet implemented correctly:
#       all mails in subfolders are put into the same mbox
#       (it would be better if an mbox file will be generated for
#       each subfolder)
# NOTE: calculation of message date in case of 'From:' doesn't recognise
#       time zones
#
# History:
# Feb 06 2001 Joerg Reinhardt
# - first edition
# Feb 07 2001 Joerg Reinhardt
# - added usage output
# Feb 12 2001 Joerg Reinhardt
# - mails not containing a 'From:' field but an 'X-From-Line:' or a
#   'Reply-To:' field are now recognised and also processed (e.g. put into
#   the mbox file); this works fine for all my mails
# - added progress information
# - warning about corrupt files is now written to stderr

# check for argument or help argument respectively
if [[ ($1 == "") ||
    ($1 == "-h") ||
    ($1 == "--help") ||
    ($1 == "-help") ]]; then
    echo "Usage: "$0" <Xfmail-mail-directory>";
fi;

# check if parameter is a directory
if [[ -d $1 ]]; then
# set target filename
    dirname=`echo $1 | awk '{while(substr($0,length($0),1)=="/"){$0=substr($0,1,length($0)-1);}print $0;}'`;
    mboxfile=$dirname'.mbox';

# check if directory is empty
    if [[ `find $dirname -type f` == "" ]]; then
   echo $dirname": directory empty."
   exit 1;
    fi;

# prevent automatic overwriting of target
    if [[ -e $mboxfile ]]; then \
   dialogtext="Write file "$mboxfile"?";
   if dialog --yesno "$dialogtext" 10 60; then
       clear;
       rm -vf $mboxfile;
   else
       clear; exit 1;
   fi;
    fi;

    echo "writing xfmail mail directory '$1' to '$mboxfile'.";


# collect files inside Xfmail mail-directory and produce MBOX format
# target file
    for i in `find $1/* -type f`; do
# output progress information
   echo -n -e \\r"                                                                               "
   echo -n -e \\rprocessing $i
# look for senders email address in the order
# 'From:'
# 'X-From-Line:'
# 'Reply-To:'
   shortfromflag='true';
   fromline=`grep 'From:' $i`;
# parse 'From:' field
   from=`echo $fromline | awk 'BEGIN{FS="<";}{if($0~/</) {pos=index($2,">");if(pos!=0) {print substr($2,1,pos-1);}} else {pos=index($0,":");print substr($0,pos+1);}}'`;
   if [[ $from == "" ]]; then
       shortfromflag='false';
       fromline=`grep 'X-From-Line:' $i`;
       from=`echo $fromline | awk 'BEGIN{FS="Line:";}{print $2;}'`;
       if [[ $from == "" ]]; then
      shortfromflag='true';
      fromline=`grep 'Reply-To:' $i`;
# parse 'Reply-To:' field
      from=`echo $fromline | awk 'BEGIN{FS="<";}{if($0~/</) {pos=index($2,">");if(pos!=0) {print substr($2,1,pos-1);}} else {pos=index($0,":");print substr($0,pos+1);}}'`;
      if [[ $from == "" ]]; then
          echo;
          echo "WARNING: "$i": no 'From:' nor 'X-From-Line:' nor 'Reply-To:' field found." >&2;
          continue;
      fi;
       fi;
   fi;
   if [[ $shortfromflag == "true" ]]; then
# parse date field
       dateline=`grep 'Date:' $i`;
       if [[ $dateline == "" ]]; then
# set dummy date if no date field found
      dateline="Date: Thu, 01 Jan 1970 00:00:00 +0000 (GMT)";
       fi;
       weekday=`echo $dateline | awk '{gsub(/,/,"",$2);print $2;}'`;
       day=`echo $dateline | awk '{print $3;}'`;
       month=`echo $dateline | awk '{print $4;}'`;
       year=`echo $dateline | awk '{print $5;}'`;
       time=`echo $dateline | awk '{print $6;}'`;
       diffGMT=`echo $dateline | awk '{print $7;}'`;
       timezone=`echo $dateline | awk '{print $8;}'`;

# output MBOX mail header
       echo "From " $from $weekday $month $day $time $year >> $mboxfile;
   else
# output long MBOX mail header found in 'X-From-Line:' field
       echo $from >> $mboxfile;
   fi;

# output mail itself
   cat $i >> $mboxfile;
    done;
    echo;
else
    echo $1": not a directory.";
fi;

anderson1127

  • 訪客
Re: webmail 的另一種選擇 Horde/IMP
« 回覆 #17 於: 2006-12-23 01:00 »
引述: "twu2"
最近, 我們公司的 mail server 負荷一直很重, 觀察了一陣子, 猜測可能的原因是:
1. 太多人了, 使用者已經超過 1100 人.
2. 多數的員工沒有固定電腦, 都透過 webmail 使用. 信件都是放在 server 上頭.
3. 傳統的 mbox 使用的儲存格式, 在檔案超過一定大小後, 常常發生信送進來時與讀信程式互相 lock 的問題.
4. openwebmail 實在有點兒慢.
5. 員工多... 表示上線的人也多, 通常會有數百人在線上使用. web server 的 loading 也大.

[恕刪]


其實這時後,我會有興趣做Cluster , 再利用DNS的Round Robin的Query
每次回答不一樣的前端IP,來當做簡易的Loadbalance !!

接著為了要改善讀取速度,我可能會採用tmpfs file system 來做暫存檔的加速
儲存mail 本身用NFS Server + 數片網路卡(如果能跑802.3ad就跑,不然STP也好)

總之,我會去試著implement 3-Tire架構來改善 !! 呃,記憶體要加大一點.... :oops:

tcwy

  • 憂鬱的高中生
  • ***
  • 文章數: 93
  • 性別: 男
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #18 於: 2007-01-25 11:43 »
引述: "tcwy"
Horde / IMP 這套 webmail 系統真的是不錯!畫面美觀,功能又齊備。

不過小弟遇到問題了!!!

寄出的郵件,內文中文不是亂碼,就是漏字!

而標題不會!

有聽過網友說改程式的編碼部分,只是沒見他說改哪一段!可否指點迷津呢?

安裝的版本:
Horde 3.1.3
IMP 4.1.3


自問自達 .. 原來是自己手殘 .. 在 php.ini 內的 mbstring 指定內部編碼為 utf-8, 取消之後就正常了。

f130142

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #19 於: 2007-03-20 15:41 »
twu2 大大您好
不好意思,照您之前的提示,安裝horde 3.133 l版
畫面有出來不過經由/horde/test.php  還是有這個memache的檔案沒有建立,可是我有下載
memcache-2.1.0.tgz 來做 pear install 動作,程序有完成可是還有出現
memcached Support (memcache): No
The memcache PECL module is needed only if you are using the memcached SessionHandler. See horde/docs/INSTALL for information on how to install PECL/PHP extensions.
這樣的文字,請問是不是我那步,沒做還是沒做對,謝謝 :D

f130142

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #20 於: 2007-03-20 15:43 »
是pecl install 的指令 :oops:

edwardleung

  • 俺是博士!
  • *****
  • 文章數: 1135
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #21 於: 2007-03-23 00:33 »
您們好,

請問應怎樣通過 Web based 設定與安裝 horde-3.1.4 才可正常運作呢 ?
不知網上有否 installation guide 可供參考呢 ?

Edward.

edwardleung

  • 俺是博士!
  • *****
  • 文章數: 1135
    • 檢視個人資料
webmail 的另一種選擇 Horde/IMP
« 回覆 #22 於: 2007-03-23 08:00 »
http://www.ita.org.mo/~edward/config.jpg

請問該設定那些項目才對呢 ?[/img]

f130142

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
請問一下前輩
« 回覆 #23 於: 2007-05-11 18:06 »
[client 192.168.10.252] PHP Fatal error:  Call to undefined function:  sasl_server_init() in /usr/share/horde/lib/Horde/Auth/sasl.php on line 61
找不到,是不是我漏了什麼,可以指點一下嗎,謝謝 :oops:

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5389
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
webmail 的另一種選擇 Horde/IMP
« 回覆 #24 於: 2007-05-11 18:58 »
可能少了 PEAR 的 Auth_SASL 吧.

f130142

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
謝謝twu大大
« 回覆 #25 於: 2007-05-23 15:09 »
謝謝您的回應,我先試一下先  :D

f130142

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
請問一下前輩
« 回覆 #26 於: 2007-05-23 15:12 »
這是我的log資料
[root@localhost ~]# tail -n 20 /var/log/httpd/error_log
[Tue May 22 16:46:06 2007] [notice] Digest: generating secret for digest authentication ...
[Tue May 22 16:46:06 2007] [notice] Digest: done
[Tue May 22 16:46:06 2007] [notice] LDAP: Built with OpenLDAP LDAP SDK
[Tue May 22 16:46:06 2007] [notice] LDAP: SSL support unavailable
[Tue May 22 16:46:06 2007] [notice] mod_python: Creating 4 session mutexes based on 256 max processes and 0 ma x threads.
[Tue May 22 16:46:06 2007] [notice] Apache/2.0.52 (CentOS) configured -- resuming normal operations
[Tue May 22 18:51:41 2007] [error] [client 192.168.10.252] File does not exist: /var/www/html/favicon.ico
[Tue May 22 19:18:53 2007] [error] [client 192.168.10.252] File does not exist: /var/www/html/favicon.ico
[client 192.168.10.252] PHP Warning:  dl(): Unable to load dynamic library '/usr/lib/php4/sasl.so' - /usr/lib/ php4/sasl.so: \xe7\x84\xa1\xe6\xb3\x95\xe9\x96\x8b\xe5\x95\x9f\xe5\x85\xb1\xe7\x94\xa8\xe7\x9b\xae\xe7\x9a\x84 \xe6\xaa\x94: \xe6\xb2\x92\xe6\x9c\x89\xe6\xad\xa4\xe4\xb8\x80\xe6\xaa\x94\xe6\xa1\x88\xe6\x88\x96\xe7\x9b\xae \xe9\x8c\x84 in /usr/share/horde/lib/Horde/Auth/sasl.php on line 57
[client 192.168.10.252] PHP Fatal error:  Call to undefined function:  sasl_server_init() in /usr/share/horde/ lib/Horde/Auth/sasl.php on line 61
可以幫我解釋一下嗎.謝謝

f130142

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
再問一個
« 回覆 #27 於: 2007-05-23 15:45 »
我上網download Auth_SASL-1.0.2.tgz
結果不能安裝
[root@localhost tmp]# pear install Auth_SASL-1.0.2.tgz
No handlers for package.xml version 2.0
請問一下是什麼問題 :)