站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

OpenLDAP-SquirrelMail Auth With LDAP 設定

前言

[MailBox] vs [MailDir],如下表格為比較二者的優缺點如何選擇就看您的環境及喜好了,本次實作為採用 [MailDir]

比較項目MailBoxMailDir
各種 MTA 支援度Sendmail、Qmail、PostfixQmail、Postfix
儲存方式使用者 Mail 儲存於一個 檔案使用者 Mail 儲存於 目錄 中一封郵件一個檔案
儲存空間由於儲存於一個檔案中因此當大小超過 1GB 或 2GB 時問題便出現目錄方式管理所以無此問題
收信效率不同的程式無法同時寫入同一個檔案的。因此當一封 Mail 程式發送 Mail 到同一帳號下時,則必須要等 A 發送工作完成後,另一發送過程 B 才能開始不需要等待剛進行的發送過程結束; 新的發送過程就可以開始因此效率較好
搜尋速度因為只有一個檔案,因此搜尋速度較快因為儲存方式為目錄且一封 Mail 就一個檔案因此搜尋速度上較慢

此次實作所安裝的 [SquirrelMail Plugin] 功能說明

實作環境

安裝及設定

本篇文章將分為三部份作說明分別是 E-Mail 空間配額 (Mail Qouta)、轉換格式從 MailBox 至 MailDir、SquirrelMail 安裝及設定 (含 Plugins 安裝及介面中文化)

E-Mail 空間配額 (Mail Qouta)

此次實作使用 Maildir 來儲存使用者郵件配合 File System Quota 設定來達到對使用者郵件進行配額的限制,至於如於實作 File System Quota 則不在多說,請參考本站內文章 Quota-管理硬碟空間配額

當使用者空間額滿時 (Quota 限制發生時) 若有人從外部寄 Mail 給該使用者帳號時系統會先顯示該使用者磁碟空間已滿,並發信給該外部寄件者說明因為該使用者信箱空間已滿所以無法將信寄給此使用者帳號。

 Sep  2 13:18:35 ldap postfix/local[974]: C8FFD5C1F: to=<weithenn@weithenn.org>, relay=local, delay=1, delays=0.89/0/0/0.12, dsn=5.2.2,
 status=bounced (maildir delivery failed: error writing message: Disc quota exceeded)
 Sep  2 13:18:40 ldap postfix/smtp[977]: 81A145C21: to=<weithenn@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.167.114]:25, delay=5,
 delays=0/0.15/0.74/4.1, dsn=2.0.0, status=sent (250 2.0.0 OK 1157174320 t5si2500394pyc)
 <weithenn@weithenn.org>: maildir delivery failed: error writing message: Disc quota exceeded

轉換格式從 MailBox 至 MailDir

在尚未導入 OpenLDAP 之前本來的使用者郵件格式為 MailBox,而此次實作為採用 MailDir 因此必須將原本的 MailBox 格式轉換為 MailDir (總不能跟使用者說我們砍掉重練了 *:p*),直接找網路上人家寫好的 Perl Script 來使用 [Ragnar - mailbox 2 maildir converter] 即可

步驟1.下載 2md Perl Script

依如下步驟抓取 2md Perl Script

 #fetch http://home.uninet.ee/~ragnar/2md/2md-1.11                //下載 2md perl script
 #mv 2md-1.11 2md;chomd 755 2md;cp 2md /usr/local/sbin/;rehash    

步驟2.開始進行 MailBox 轉換為 MailDir

請依如下方式將 MailBox 轉換為 MailDir

 #2md /home/mail/weithenn /home/user/weithenn/Maildir             //進行 MailBox to MailDir
 [123]..........10                                                //代表 MailBox 總共轉換 10 封信到 Maildir
 #chown -R weithenn /home/user/weithenn/Maildir                   //因為使用 root 進行此一動作因此記得把權限改為該使用者

SquirrelMail 安裝及設定

此次實作在 User Webmail 方面則採用支援 MailDir 格式的 [SquirrelMail - Webmail for Nuts!],這是一套採用 PHP 撰寫的 Standards - Based Webmail 套件,它支援 IMAP and SMTP Protocols 並採用 Gettext 來進行語系轉換、提供大量的 Theme 設定 (使用 CSS) 因此有這多變的外觀。

步驟1.安裝 SquirrelMail 套件

在安裝 SquirrelMail 前之記得安裝 Web Server 及 PHP Language 至於如何安裝就不在多說了,請參考站內文章 Mysql Apache PHP-黃金架站組合

 #cd /usr/ports/mail/squirrelmail     //切換到安裝路徑
 #make install clean                  //安裝套件並清除安裝過程中產生不必要檔案 (會自動相依安裝 php4-extention)

步驟2.修改 PHP 設定檔 (php.ini)

必須修改 PHP 設定檔 (php.ini) 否則屆時將造成連接登入視窗發生錯誤,順便將上傳附件最大容量限制改為 10MB (也就是屆時使用者可夾帶的 E-Mail 附件大小)

 #vi /usr/local/etc/php.ini
 file_uploads = On
 session.auto_start = 1
 upload_max_filesize = 10M           //設定上傳附件最大容量限制為 10MB (預設為 2M)

修改原因 php.ini 請參考如下 SquirrelMail 說明

 For SquirrelMail to work properly you will need to make sure the following option is set in your php.ini file:
 file_uploads = On
 If you have problems with SquirrelMail saying "you must login" after you just have, the following php.ini option may help:
 session.auto_start = 1

步驟3.修改相關設定

SquirrelMail 預設安裝的路徑於 /usr/local/www/squirrelmail 而設定方式有二種您可採用直接修改設定檔 (config.php) 或互動模式 (./configure),請依個人喜好自行擇一即可,本次實作為將預設的語系及字元編碼修改為 zh_TW 及 BIG5 吧。

 #vi /usr/local/www/squirrelmail/config/config.php
 $squirrelmail_default_language = 'zh_TW';           //指定語系
 $default_charset       = 'big5';                    //指定文字編碼格式
 #cd /usr/local/www/squirrelmail
 #./configure
 SquirrelMail Configuration : Read: config_default.php (1.4.0)
 ---------------------------------------------------------
 Main Menu --
 1.  Organization Preferences
 2.  Server Settings
 3.  Folder Defaults
 4.  General Options
 5.  Themes
 6.  Address Books
 7.  Message of the Day (MOTD)
 8.  Plugins
 9.  Database
 10. Languages
 D.  Set pre-defined settings for specific IMAP servers
 C   Turn color on
 S   Save data
 Q   Quit
 Command >>                                          //輸入您要設定的項目

互動模式設定語系及字元編碼: (此次實作選擇步驟如下)

  1. 10. Languages
    1. Default Language : zh_TW
    2. Default Charset : big5
  2. S Save data
  3. Q Quit

當然設定完語系及字元編碼後,換成設定您的 IMAP 及 SMTP 當然相關設定及 Plugins 也都可以設定。設定完成後記得連結設定測試頁,連結此頁面後系統會將您的相關設定顯示出來若有設定不正確的地方也會列出

 http://your_server_fqdn/squirrelmail/src/login.php

步驟4-1.載入內建 Plugin - Calendar (行事曆)

使用互動模式來載載內建的 Plugin - Calendar (行事曆),步驟如下

  1. #cd /usr/local/www/data/squirrelmail ; ./configure
  2. 選擇 8. Plugins 進入 Plugins 頁面,系統顯示可載入的 Available Plugins 列表
  3. 選擇 6. Calendar 可看到 Installed Plugins 1. Calendar 即表示已載入 Calendar Plugins
  4. 選擇 S Save data 儲存設定
  5. 選擇 Q Quit 離開互動模式

此時再度登入 SquirrelMail 後應可看到 Calendar Plugins (行事曆) 載入完成,若要取消 Plugins 則同載入 Plugins 一樣的方式操作即可,也就是看到 Calendar 變成 Available Plugins 取消 Calendar Plugins。

步驟4-2.安裝 Plugin - Change LDAP Password

由於 [Plugin - Change LDAP Password] 並沒有內建,我們可至 [SquirrelMail - Download Plugins] 下載,連上後可看到許多類別的外掛,此次安裝的外掛在 [Change Password] 類別下

 #cd /usr/local/www/data/squirrelmail/plugins                              //切換到外掛放置路徑
 #fetch http://www.squirrelmail.org/plugins/compatibility-2.0.4.tar.gz     //Requires: Compatibility plugin and ldap. 
 #tar -xzvf compatibility-2.0.4.tar.gz -C .                                //解開 plugin
 #fetch http://www.squirrelmail.org/plugins/change_ldappass-1.8.tar.gz     //下載 plugin
 #tar -zxvf change_ldappass-1.8.tar.gz -C .                                //解開 plugin
 #cd change_ldappass                                                       //切換至 plugin 資料夾
 #cp config.php.sample config.php                                          //複製範例檔案來修改以符合機器環境
 #vi config.php                                                            //修改設定檔內容
 $ldap_server = "ldap.weithenn.org";                                       //指定 LDAP Server
 $ldap_password_field = "userpassword";
 $ldap_user_field = "uid";
 $ldap_base_dn = "dc=weithenn,dc=org";

設定檔設定好相關環境設定後,我們必須把 [Plugin - Change LDAP Password] 載入,載入方式如下:

  1. #cd /usr/local/www/data/squirrelmail ; ./configure
  2. 選擇 8. Plugins 進入 Plugins 頁面,系統顯示可載入的 Available Plugins 列表
  3. 選擇 compatibility、change_ldappass 可看到 Installed Plugins compatibility、change_ldappass 即表示已載入 Compatibility、Change LDAP Password Plugin
  4. 選擇 S Save data 儲存設定
  5. 選擇 Q Quit 離開互動模式

登入 SquirrelMail 後切換至環境設定應該可看到 Change Password 項目,而切換至該頁面後使用者應可更改密碼了 (此 Plugin 也支援一起更改 Samba 密碼,因為尚未完成 Samba 架設因此目前不討論此部份)

步驟4-2-1.Change LDAP Password Plugin 介面中文化

由於 Change LDAP Password Plugin 載入後為英文介面 (愛國的使用者們極力反彈?),因此下列內容為說明將 Change LDAP Password Plugin 進行中文化修改,此次為將英文字【Change Password】改為中文字【變更密碼】,相關設定檔位於 change_ldappass 下的 setup.php 中。

 #cd /usr/local/www/data/squirrelmail/plugins/change_ldappass
 #vi setup.php 
   global $optpage_blocks;
     $optpage_blocks[] =
        array(
              'name' => _("Change Password"),                                                                               //預設值
              'name' => _("變更密碼"),                                                                                      //修改後
              'url'  => '../plugins/change_ldappass/options.php',
              'desc' => _("This connects to your local Password Server to change your login password for all services."));  //預設值
              'desc' => _("變更您收發郵件的密碼"));                                                                         //修改後
   textdomain('squirrelmail');
 }

再來就是連結至 Change Password 後頁面中文化,預設為使用 /usr/local/www/data/squirrelmail/plugins/change_ldappass/locale/change_ldappass.po 語系檔,我們可下載由 [ChinSan] 中文化完成的語系檔 [ChinSan - change_ldappass.po] 並執行下列步驟來進行中文化 Change Password 頁面。

 #cd /usr/local/www/data/squirrelmail/plugins/change_ldappass/locale    //切換至該 Plugin 存放語系檔路徑
 #mkdir zh_TW ; cd zh_TW                                                //建立翻譯資料夾
 #mkdir LC_MESSAGES ; cd LC_MESSAGES                                    //建立翻譯資料夾
 #fetch http://people.freebsd.org/~chinsan/doc/change_ldappass.po       //下載中文化語系檔
 #msgfmt -v change_ldappass.po                                          //模擬載入中文化語系檔
 24 個已翻譯的訊息.                                                     //可看到此翻譯檔共翻譯幾個英文訊息至中文
 #msgfmt -v -c -o change_ldappass.mo change_ldappass.po                 //由文字模式翻譯檔產生二元碼翻譯檔

步驟4-3.安裝 Plugin - Check Quota

由於 [Plugin - Check Quota] 並沒有內建,我們可至 [SquirrelMail - Download Plugins] 下載,連上後可看到許多類別的外掛,此次安裝的外掛在 [Visual Additions] 類別下

 #cd /usr/local/www/data/squirrelmail/plugins                                //切換到外掛放置路徑
 #fetch http://www.squirrelmail.org/plugins/check_quota-1.4-re-1.2.7.tar.gz  //下載 check quota plugin
 #tar -xzvf check_quota-1.4-re-1.2.7.tar.gz -C .                             //解開 Plugin
 #cd check_quota                                                             //切換至 Plugin 資料夾
 #cp config.php.sample config.php                                            //複製範例檔案來修改以符合機器環境
 #vi config.php                                                              //修改設定檔內容
 $cq_check_quota_type = 1;                                                   //0: IMAP / 1: UNIX
 $cq_quota_binary = "/usr/local/bin/sudo /usr/bin/quota";                    //設定sudo及quota執行檔路徑

修改完成後因為要讓 Web Server 可以執行 Check Quota 指令因此必須執行以下動作

 #ps aux |grep httpd       //確定 Web Server 執行帳號為 www
 www      38386  0.0  0.6 15964 12028  ??  S     1:20下午   0:03.26 /usr/local/sbin/httpd -DSSL
 www      38387  0.0  0.5 15016 11096  ??  S     1:20下午   0:03.90 /usr/local/sbin/httpd -DSSL
 www      38388  0.0  0.6 15932 12012  ??  S     1:20下午   0:03.71 /usr/local/sbin/httpd -DSSL
 www      38389  0.0  0.6 15944 12024  ??  S     1:20下午   0:04.87 /usr/local/sbin/httpd -DSSL
 www      38390  0.0  0.6 15828 11912  ??  S     1:20下午   0:04.39 /usr/local/sbin/httpd -DSSL

修改 sudoers 檔案,將 Web Server 執行帳號 www 加入設定

 #visudo                   //修改 sudoers 檔案加入此行
 www  ALL=NOPASSWD: /usr/bin/quota -v *

設定檔設定好相關環境設定後,我們必須把 [Plugin - Check Quota] 載入,載入方式如下:

  1. #cd /usr/local/www/data/squirrelmail ; ./configure
  2. 選擇 8. Plugins 進入 Plugins 頁面,系統顯示可載入的 Available Plugins 列表
  3. 選擇 check_quota 可看到 check_quota 即表示已載入 Check Quota Plugin
  4. 選擇 S Save data 儲存設定
  5. 選擇 Q Quit 離開互動模式

修改完成後登入 SquirrelMail 後應該可看到 Quota 使用情況

步驟4-3-1.Check Qouta Plugin 介面中文化

由於 Check Qouta Plugin 載入後為英文介面,因此下列內容為說明將 Check Qouta Plugin 進行中文化修改,Check Qouta Plugin 預設使用 /usr/local/www/data/squirrelmail/plugins/change_quota/locale/check_quota.po 語系檔,您可下載由 Weithenn 中文化完成的語系檔 [Weithenn - check_quota.po] 並執行下列步驟來進行中文化 Check Qouta 頁面。

 #cd /usr/local/www/data/squirrelmail/plugins/change_quota/locale                 //切換至該 Plugin 存放語系檔路徑
 #mkdir zh_TW;cd zh_TW                                                            //建立翻譯資料夾
 #mkdir LC_MESSAGES;cd LC_MESSAGES                                                //建立翻譯資料夾
 #fetch http://weithenn.googlepages.com/check_quota.po                            //下載中文化語系檔
 #msgfmt -o check_quota.mo check_quota.po                                         //由文字模式翻譯檔產生二元碼翻譯檔

步驟4-4.安裝 Plugin - Addressbook Import-Export

由於 [Plugin - Addressbook Import-Export] 並沒有內建,我們可至 [SquirrelMail - Download Plugins] 下載,連上後可看到許多類別的外掛,此次安裝的外掛在 [ Addressbook] 類別下

 #cd /usr/local/www/data/squirrelmail/plugins                                     //切換到外掛放置路徑
 #fetch http://www.squirrelmail.org/plugins/abook_import_export-1.0-1.4.4.tar.gz  //下載 addressbook import export plugin
 #tar -xzvf abook_import_export-1.0-1.4.4.tar.gz -C .                             //解開 plugin
 #cd abook_import_export                                                          //切換至 plugin 資料夾
 #cp config_default.php config.php                                                //複製範例檔案來修改以符合機器環境
 #vi config.php                                                                   //修改設定檔內容
 $aie_csv_maxsize=5120;                                                           //限制匯入 CSV 大小 5 MB
 $aie_input_charsets = array(                                                     //指定接收匯入 CSV 編碼格式
    'big5',
    'utf-8');

設定檔設定好相關環境設定後,我們必須把 [Plugin - Addressbook Import-Export] 載入,載入方式如下:

  1. #cd /usr/local/www/data/squirrelmail ; ./configure
  2. 選擇 8. Plugins 進入 Plugins 頁面,系統顯示可載入的 Available Plugins 列表
  3. 選擇 abook_import_export 可看到 abook_import_export 即表示已載入 Addressbook Import-Export Plugin
  4. 選擇 S Save data 儲存設定
  5. 選擇 Q Quit 離開互動模式

修改完成後登入 SquirrelMail 後應該可看到 Addressbook Import-Export 介面

步驟4-4-1.Addressbook Import-Export Plugin 介面中文化

由於 Addressbook Import-Export Plugin 載入後為英文介面,因此下列內容為說明將 Addressbook Import-Export Plugin 進行中文化修改,Addressbook Import-Export Plugin 預設使用 /usr/local/www/data/squirrelmail/plugins/abook_import_export/abook_import_export.po 語系檔,您可下載由 Weithenn 中文化完成的語系檔 [Weithenn - abook_import_export.po] 並執行下列步驟來進行中文化 Addressbook Import-Export 頁面,需要注意的是根據此 plugin 內 INSTALL 所寫翻譯檔存放路徑需與 squirrelmail.po 必須在同一目錄下才能生效。

 #cd /usr/local/www/data/squirrelmail/plugins/abook_import_export                       //切換至該 Plugin 存放語系檔路徑
 #fetch http://weithenn.googlepages.com/abook_import_export.po                          //下載中文化語系檔
 #msgfmt -o abook_import_export.mo abook_import_export.po                               //由文字模式翻譯檔產生二元碼翻譯檔
 #mv abook_import_export.mo /usr/local/www/data/squirrelmail/locale/zh_TW/LC_MESSAGES/  //移動至與 squirrelmail.po 必須在同一目錄
 #mv abook_import_export.po /usr/local/www/data/squirrelmail/locale/zh_TW/LC_MESSAGES/  //移動至與 squirrelmail.po 必須在同一目錄

步驟4-5.安裝 Plugin - View As HTML

由於 [Plugin - View As HTML] 並沒有內建,我們可至 [SquirrelMail - Download Plugins] 下載,連上後可看到許多類別的外掛,此次安裝的外掛在 [ Message View] 類別下

 #cd /usr/local/www/data/squirrelmail/plugins                                           //切換到外掛放置路徑
 #fetch http://www.squirrelmail.org/plugins/view_as_html-3.7a-1.4.x.tar.gz              //下載 view as html plugin
 #tar -xzvf view_as_html-3.7a-1.4.x.tar.gz -C .                                         //解開 plugin

此 Plugin 不需另外修改設定,僅須將 [Plugin - View As HTML] 載入即可,載入方式如下:

  1. #cd /usr/local/www/data/squirrelmail ; ./configure
  2. 選擇 8. Plugins 進入 Plugins 頁面,系統顯示可載入的 Available Plugins 列表
  3. 選擇 view_as_html 可看到 view_as_html 即表示已載入 View As HTML Plugin
  4. 選擇 S Save data 儲存設定
  5. 選擇 Q Quit 離開互動模式

修改完成後登入 SquirrelMail 後應該可看到 View As HTML 介面,多出可切換圖片模式 (HTML) 或文字模式 (TEXT) 的超連結

步驟4-5-1.View As HTML Plugin 介面中文化

由於 View As HTML Plugin 載入後為英文介面,因此下列內容為說明將 View As HTML Plugin 進行中文化修改,View As HTML Plugin 預設使用 /usr/local/www/data/squirrelmail/plugins/view_as_html/view_as_html.po 語系檔,您可下載由 Weithenn 中文化完成的語系檔 [Weithenn - view_as_html.po] 並執行下列步驟來進行中文化 View As HTML 頁面。

 #cd /usr/local/www/data/squirrelmail/plugins/view_as_html/locale                         //切換至該 Plugin 存放語系檔路徑
 #mkdir zh_TW;cd zh_TW                                                                    //建立翻譯資料夾
 #mkdir LC_MESSAGES;cd LC_MESSAGES                                                        //建立翻譯資料夾
 #fetch http://weithenn.googlepages.com/view_as_html.po                                   //下載中文化語系檔
 #msgfmt -o view_as_html.mo view_as_html.po                                               //由文字模式翻譯檔產生二元碼翻譯檔

步驟5.使用 LDAP Address Book

設定 SquirrelMail 也可以使用 LDAP Address Book,看您是要直接修改設定檔 config.php 或使用互動模式 conf.pl (請依個人喜好擇一即可)

 #cd /usr/local/www/data/squirrelmail/config/config.php
 $ldap_server[0] = array(
    'host' => 'ldap.weithenn.org',                       //指定 LDAP Host
    'base' => 'ou=People,dc=weithenn,dc=org',            //指定 Search LDAP Base 
    'name' => 'LDAP 公用通訊錄',                         //指定 SquirrelMail 顯示的 LDAP Name
    'port' => 389,                                       //指定 LDAP Host 使用的 Port
    'charset' => 'utf-8'                                 //指定 LDAP 使用的文字編碼方式
 );

此次實作我們將 SquirrelMail 預設文字編碼設定為 Big5,但 LDAP 的 LDIF 資訊檔案皆為 UTF-8 編碼格式,因此無法順利顯示查到中文資訊 (都變成 ????),在 Google 上找到 [酷學園 squirrelmail1.4.4 抓 ldap address book 中文亂碼的問題] 有討論到此一問題照著改即可,但記得確定系統是否安裝了 PHP Extension iconv 才能順利轉換編碼。

因為預設搜尋條件是 CN (我的環境 CN 是使用者中文名稱),因此修改如下 (行數或許與您的不相同)

 #vi /usr/local/www/data/squirrelmail/functions/abook_ldap_server.php
 264         //$expr = $this->charset_encode($expr);                    //預設值
 265         $expr =  iconv("big5","utf-8",$expr);                      //修改後,輸入搜尋條件為 Big5 透過 iconv 轉換為 UTF-8 後跟 LDAP 查詢

因為 SquirrelMail 預設編碼為 Big5,LDAP 為 UTF-8 因此即使查詢到資料後 SquirrelMail 無法順利顯示中文資訊 (都變成 ????),因此修改如下 (行數或許與您的不相同)

 #vi /usr/local/www/data/squirrelmail/functions/abook_ldap_server.php
 310         // $fullname = $this->charset_decode($row['cn'][0]);       //預設值
 311         $fullname = iconv("utf-8","big5",$row['cn'][0]);           //修改後,將 LDAP 查到的 UTF-8 中文資訊透過 iconv 轉換成 Big5 在傳給 SquirrelMail 顯示

上述二個地方修改完成後即可開始使用 LDAP Address Book (預設搜尋條件為使用 CN)

  1. 登入【SquirrelMail】
  2. 點選 【編寫郵件 (Compose)】
  3. 進入後按下【通訊錄】按鈕,進入【搜尋通訊錄】頁面
  4. 使用下拉選單選擇【LDAP 公用通訊錄】
  5. 您可使用【列出全部 (*)】即 Search base="ou=People,dc=weithenn,dc=org" filter="(cn=*)"
    1. 或輸入條件後按下【搜尋】即 Search base="ou=People,dc=weithenn,dc=org" filter="(cn=您輸入的條件 ex.葉大雄)"

參考

[ LDAP Server – OpenLDAP 安裝 Openwebmail 亦可接受LDAP Server 的帳號與密碼]

[ Open WebMail 進階說明]

[Mbox vs Maildir - 两者原理和区别]

[OpenWebMail 與 SASL2 認證設定]

[筍子工作雜記 » Maildir convert to mailbox]

[筍子工作雜記 » mailbox convert Maildir]

[mailbox 2 maildir converter]

[程式設計俱樂部- 如何移除已安裝的 perl 模組?]

[Date/Parse.pm not found?]

[SquirrelMail - Webmail for Nuts!]

[lloyd - squirrelmail安装备忘]

[陶然 - squirrelmail安装备忘]

[摩托學園討論區 :: 觀看文章 - 如何進行軟體的中文化?]

[Po 翻譯測試 - GnomeHK]

[台灣PHP聯盟 - 關於 gettext (一、簡介) - 中文處理 ]

[FreeBSD Chinese HOWTO Chapter 5. 中文的訊息-翻譯 PO 檔注意事項]

[daniel marczisovszky - open source projects]

[LDAP Addressbook HOWTO]

[Setting up Squirrelmail]

Me FAQ

Q1.無法使用 2md perl script?

Error Meaage:

執行 2md perl script 出現如下錯誤訊息

 #2md /home/mail/weithenn /home/user/weithenn/Maildir
 Can't locate Date/Parse.pm in @INC at /usr/local/sbin/2md line 131.

Ans:

查看 2md perl script 後發現 131 行內容為

 131 use Date::Parse;

所以應該是目前系統中沒有裝這個 Perl Module 導致無法呼叫因而產生錯誤,請依如下方式來安裝該 Perl Module

 #perl -MCPAN -e "install Date::Parse"     //安裝 Date::Parse Perl Module
 #perl –MCPAN –e shell                   //為進入 CPAN Perl Shell 模式
 #perldoc perllocal                        //查看目前所安裝的 Perl Module

完成後若想移除該 Perl Module 詳細內容可參考 [程式設計俱樂部- 如何移除已安裝的 perl 模組?] 下列步驟為簡述,將下列程式片段存成 remove_mod.pl 後鍵入指令 perl remove_mod.pl Date::Parse 即可移除已安裝的 Date::Parse Perl 模組

 #!/usr/local/bin/perl -w
 use ExtUtils::Packlist;
 use ExtUtils::Installed;
 $ARGV[0] or die "Usage: $0 Module::Name\n";
 my $mod = $ARGV[0];
 my $inst = ExtUtils::Installed->new();
 foreach my $item (sort($inst->files($mod))) {
 print "removing $item\n";
 unlink $item;
 }
 my $packfile = $inst->packlist($mod)->packlist_file();
 print "removing $packfile\n";
 unlink $packfile;

Q2.SquirrelMail 無法顯示登入介面並出現錯誤訊息?

Error Meaage:

連結到 SquirrelMail 登入網頁 (http://server_ip/squirrelmail/src/login.php) 後並沒有出現登入視窗卻出現如下錯誤訊息

 Fatal error: Call to undefined function: preg_replace() in /usr/local/www/data-dist/squirrelmail/functions/global.php on line 165

Ans:

修改 php.ini 的 session.auto_start = 1 選項並重新啟動 Web Server (此例為 Apache) 後便可順利連結登入視窗。

Q3.SquirrelMail 無法顯示測試介面並出現錯誤訊息?

Error Meaage:

連結到 SquirrelMail 測試網頁 (http://server_ip/squirrelmail/src/configtest.php) 沒出現測試內容卻出現如下錯誤訊息

 Fatal error: Call to undefined function: session_id() in /usr/local/www/data-dist/squirrelmail/functions/global.php on line 403

Ans:

修改 php.ini 的 session.auto_start = 1 選項並重新啟動 Web Server (此例為 Apache) 後便可順利連結登入視窗。

Q4.SquirrelMail 登入後出現錯誤訊息?

Error Meaage:

連結到 SquirrelMail 登入畫面 (http://server_ip/squirrelmail/src/login.php) 登入後視窗卻出現如下錯誤訊息

 Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the
 session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this
 functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

Ans:

照上述意思可以了解要不就把 register_globals 設定為 enabled,要不就是把 session.bug_compat_42 or session.bug_compat_warn 設定為 off 此次實作為將 session.bug_compat_42 設定為 off

 #vi /usr/local/etc/php.ini
 session.bug_compat_42 = 0    //0 = off (預設為 1 = on) 

Q5.無法登入 change password 頁面並出現錯誤訊息?

Error Meaage:

登入 SquirrelMail 後切換至環境設定按下 change password 項目後,出現如下錯誤訊息

 Warning: main(../plugins/compatibility/functions.php) [function.main]: failed to open stream: No such file or directory in
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 44
 Warning: main() [function.include]: Failed opening '../plugins/compatibility/functions.php' for inclusion (include_path='.:') in
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 44
 Fatal error: Call to undefined function: compatibility_check_sm_version() in 
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 46

Ans:

此錯誤訊息為系統沒安裝 Compatibility Plugin 所導致,請依如下步驟下載 Compatibility Plugin 並載入該 Plugin 即可

 #cd /usr/local/www/data/squirrelmail/plugins
 #fetch http://www.squirrelmail.org/plugins/compatibility-2.0.4.tar.gz   
 #tar -xzvf compatibility-2.0.4.tar.gz -C .

Q6.無法登入 change password 頁面並出現錯誤訊息?

Error Meaage:

登入 SquirrelMail 後切換至環境設定按下 change password 項目後,出現如下錯誤訊息

 Warning: main(../src/validate.php) [function.main]: failed to open stream: No such file or directory in 
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 59
 Warning: main() [function.include]: Failed opening '../src/validate.php' for inclusion (include_path='.:') in
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 59
 Warning: main(../src/load_prefs.php) [function.main]: failed to open stream: No such file or directory in 
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 68
 Warning: main() [function.include]: Failed opening '../src/load_prefs.php' for inclusion (include_path='.:') in 
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 68
 Fatal error: Call to undefined function: set_my_charset() in 
 /usr/local/www/data-dist/squirrelmail/functions/imap_utf7_local.php on line 100

Ans:

此錯誤為系統顯示在 src 資料夾下找不到相關檔案 (validate.php 及 load_prefs.php),將在 include 資料夾內的 validate.php 及 load_prefs.php 檔案複製到 src 下就 OK 了

Q7.按下 change password 後出現錯誤訊息?

Error Meaage:

登入 SquirrelMail 後切換至環境設定按下 change password 後出現如下錯誤訊息

 Fatal error: Call to undefined function: ldap_connect() in
 /usr/local/www/data-dist/squirrelmail/plugins/change_ldappass/options.php on line 148

Ans:

在 Google 上找到 [Change ldap password] 有人反應是因為 PHP LDAP extension is missing,因此就打了 php -m 檢查一下系統所安裝的 php-extension 結果發現系統真的沒安裝到 LDAP php-extension,在安裝 LDAP php-extension 之後請記得重新啟動您的 Web Server (此例為 restart apache) 才會生效,安裝完成後按下 change password 後便沒出現錯誤訊息。

 #cd /usr/ports/lang/php4-extensions/   //切換至安裝 php-extension 路徑
 #make config                           //選擇 LDAP Extension
 #make install clean                    //安裝 php-extension (LDAP Extension)
 #php -m                                //查看系統所安裝的 php-extension 
 [PHP Modules]
 ctype
 gettext
 ldap                                   //LDAP php-extension 安裝完成
 mbstring
 mhash
 openssl
 pcre
 posix
 session
 standard
 xml

Q8.按下 change password 後出現 LDAP bind failed.?

Error Meaage:

登入 SquirrelMail 後切換至環境設定按下 change password 後出現如下錯誤訊息

 LDAP bind failed.

Ans:

在 Google 上找到 [SquirrelMail - ProtocolError] 會發生此問題即是 SquirrelMail 跟 OpenLDAP 溝通的 Protocol 錯誤所產生的,因為 SquirrelMail 預設是走 LDAPv2 而此次實作所架設的 OpenLDAP 是走 LDAPv3 因此溝通不良,解決方式有二

  1. 使 SquirrelMail 支援 LDAPv3 Protocol
  2. 使 OpenLDAP 支援 LDAPv2 Protocol (此次解決方式)

此次採用第二種解決方式,也就是使 OpenLDAP 支援 LDAPv2 Protocol,詳細內容請參考 [OpenLDAP Faq-O-Matic: How to configure slapd(8) with LDAPv2 support (for legacy clients)?] 以下為簡述解決方式

 #vi /usr/local/etc/openldap/slapd.conf       //修改 openldap 設定檔
 allow bind_v2                                //允許 LDAPv2 Protocol
 修改後記得重新啟動 slapd 服務即可

Q9.按下 change password 後出現 LDAP bind failed.?

Error Meaage:

登入 SquirrelMail 後切換至環境設定按下 change password 後出現如下錯誤訊息

 LDAP bind failed.

Ans:

在 Google 上找到 [can't connect ldap database - Dev Archives] 原因在於將 SquirrelMail 設定檔中將 userpassword 改成 userPassword,因為我以為此設定檔要跟 slapd.conf 內 ACL 設定一樣 access to attrs=userPassword,結果為把 P 改回預設的小寫 p 就可成功變更密碼了

 $ldap_password_field = "userpassword";      //正確設定
 $ldap_password_field = "userPassword";      //錯誤設定

Password Changed Successfully 時的 ldap.log 內容如下

 Sep  9 16:41:24 ldap slapd[12185]: conn=59 fd=25 ACCEPT from IP=192.168.1.10:58274 (IP=0.0.0.0:389)
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=0 BIND dn="" method=128
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=0 RESULT tag=97 err=0 text=
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=1 SRCH base="dc=weithenn,dc=org" scope=2 deref=0 filter="(uid=wei)"
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=1 SRCH attr=dn
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=2 BIND dn="uid=wei,ou=People,dc=weithenn,dc=org" method=128
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=2 BIND dn="uid=wei,ou=People,dc=weithenn,dc=org" mech=SIMPLE ssf=0
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=2 RESULT tag=97 err=0 text=
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=3 SRCH base="dc=weithenn,dc=org" scope=2 deref=0 filter="(uid=wei)"
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=4 MOD dn="uid=wei,ou=People,dc=weithenn,dc=org"
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=4 MOD attr=userpassword
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=4 RESULT tag=103 err=0 text=
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 op=5 UNBIND
 Sep  9 16:41:24 ldap slapd[12185]: conn=59 fd=25 closed

我的 slapd.conf 內 ACL 設定如下

 增加 access control 部份,讓合法的使用者能讀取 LDAP 資料庫並能修改自身密碼,但不能讀寫他人的密碼。
 access to attrs=userPassword
     by self write
     by anonymous auth
     by dn.base="cn=Manager,dc=weithenn,dc=org" write
     by * none
 為了讓 nss_ldap 能夠動作,必須開 anonymous 讀取的權限,但是限制他不能從任何 IP 讀取。
 access to *
     by self write
     by users read
     by anonymous peername.IP=127.0.0.1 read
     by anonymous peername.IP=192.168.1.0%255.255.255.0 read
     by dn.base="cn=Manager,dc=weithenn,dc=org" write
     by * none

Q10.中文化後語系錯亂?

Error Meaage:

當載入內建的 Plugin - Calendar (行事曆)後,因為預設翻譯為 日曆 而切換到指定日期的按鈕叫 進行 (Go),個人覺得這樣翻譯怪怪的因此便修改 squirrelmail.po 後執行 msgfmt 來轉換翻譯檔,但怪現象來了網頁有時會變成英文有時變成沒修改前的日曆有時又變成修改後的行事曆?

 msgfmt -v -o -c squirrelmail.mo squirrelmail.po

Ans:

想說 SquirrelMail 都是利用 PHP 設定檔來進行呼叫轉換等等,因此我修改翻譯檔後索性把 Web Server (此例為 Apache) 重新啟動之後這種怪現象便沒在發生,雖然不知這樣到底對不對但倒是解決了此次的問題。

Q11.搜尋 LDAP Address Book 中文字全都變成問號 (?)?

Error Meaage:

搜尋 LDAP Address Book 但中文資訊全都變成問號 (????)

Ans:

因為我們把 SquirrelMail 預設編碼設為 Big5 ,但 LDAP 的 LDIF 資訊皆為 UTF-8 編碼格式,不知是不是因為這關系造成部份問題,就利用網路上找到的資訊 [酷學園 squirrelmail1.4.4 抓 ldap address book 中文亂碼的問題] 照著改就好了,但記得確定是否安裝了 PHP Extension iconv 才能順利轉換編碼。

 #vi /usr/local/www/data/squirrelmail/functions/abook_ldap_server.php
 310         // $fullname = $this->charset_decode($row['cn'][0]);  //預設值
 311         $fullname = iconv("utf-8","big5",$row['cn'][0]);      //將 LDAP 查到的 UTF-8 中文資訊轉換成 Big5 在傳給 SquirrelMail

Q12.搜尋 LDAP Address Book Call to undefined function: iconv()?

Error Meaage:

搜尋 LDAP Address Book 但出現如下錯誤訊息

 Fatal error: Call to undefined function: iconv() in /home/web/squirrelmail/functions/abook_ldap_server.php on line 311

Ans:

原因在於系統沒有裝 PHP Extension 的 iconv ,因此無法順利轉換編碼

 #cd /usr/ports/lang/php4-extensions            //切換至 php4-extension 路徑
 #make config                                   //出現安裝 extension 選單
 [X] ICONV        iconv support     
 #make FORCE_PKG_REGISTER=yes install clean     //安裝 icon extension

確定 iconv php-extension 是否安裝完成

 #php -m
 [PHP Modules]
 ctype
 gettext
 iconv     //確定 php 支援 iconv 功能了
 ldap

記得重新啟動 Web Server (此例為 Apache)

 #/usr/local/etc/rc.d/apache.sh restart

Q13.搜尋不到 LDAP Address Book 資料?

Error Meaage:

LDAP 內明明有該使用者資訊,但卻都搜尋不到? 訊息如下所示

 找不到符合您搜尋條件的人員

Ans:

因為預設搜尋條件是 CN (我的環境 CN 是使用者中文名稱)

 #vi /usr/local/www/data/squirrelmail/functions/abook_ldap_server.php
 264         //$expr = $this->charset_encode($expr);   //預設值
 265         $expr =  iconv("big5","utf-8",$expr);     //輸入搜尋條件為 Big5 但轉換成 UTF-8 在去查 LDAP

Q14.SquirrelMail 中文翻譯不完全?

Error Meaage:

為何 locale/zh_TW/LC_MESSAGES/squirrelmail.po 明明就有翻譯該英文項目,但登入 SquirrelMail 後還是只能看到英文,例如下列翻譯 View Messages: 但登入後不是看到 讀取郵件:

 msgid "Viewing Messages: %s to %s (%s total)"
 msgstr "讀取郵件: <B>%s</B> to <B>%s</B> (共 %s 封)" 

Ans:

不知我這樣做到底對不對? 但確定修改完 squirrelmail.po 後便能正確將 Viewing Messages: 轉換成 讀取郵件:

 #
 #, fuzzy     //刪除此行
 msgid "Viewing Messages: %s to %s (%s total)"
 msgstr "讀取郵件: <B>%s</B> to <B>%s</B> (共 %s 封)" 

修改完 squirrelmail.po 我們還是需要將文字模式翻譯檔轉換為二元碼翻譯檔

 #msgfmt -v -c -o squirrelmail.mo squirrelmail.po     //文字翻譯檔轉換為二元碼翻譯檔
 #/usr/local/etc/rc.d/apache.sh restart               //重新啟動 Apache

Q15.下載 SquirrelMail 中文檔名附件會變成亂碼?

Error Meaage:

使用 IE 登入 SquirrelMail 後收到中文檔名的附件按下 Download 後原來的中文檔名檔案下載後變成亂碼檔名,但若使用 FireFox 則不會有此一問題。

Ans:

造成這問題還是因為 IE 而導致的,我們必須修改如下檔案來幫 IE 的使用者轉換編碼就不會發生此問題。詳細內容請參考 [- Mail服务器 - 如何解决SquirrelMail下载附件时,不能识别中文文件名(页 1) - ChinaUnix.net]

 #vi /usr/local/www/data/squirrelmail/src/download.php
 102 $filename = charset_encode($filename,$default_charset,false);  //加在這行下面
 103 $filename = iconv("big5","utf-8",$filename);                   //加入此行

Q16.點選收件夾無法顯示,其它資料夾可正常顯示?

Error Meaage:

 Feb  6 15:22:50 ldap imapd: DISCONNECTED, user=ta-wei, ip=[127.0.0.1], headers=1171613, body=0, rcvd=283, sent=1962578, time=5
 Feb  6 15:22:58 ldap imapd: LOGIN, user=ta-wei, ip=[127.0.0.1], protocol=IMAP
 Feb  6 15:22:58 ldap imapd: LOGOUT, user=ta-wei, ip=[127.0.0.1], headers=0, body=0, rcvd=87, sent=394, time=0

Ans:

下面二種方式 (請依個人喜好擇一即可) 處理完後在登入 SquirrelMail 後點選收件夾便可正常顯示了。

Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com