OpenLDAP - SquirrelMail Auth With LDAP 設定

1、前言

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



此次實作所安裝的 SquirrelMail Plugin 功能說明:
  • Calendar: 內建行事曆模組,使 SquirrelMail 具備行事曆功能。
  • Change LDAP Password: 讓使用者能自行修改 LDAP 密碼 (需配合 slapd.conf 內 ACL 設定)。
  • Check Quota: 讓 SquirrelMail 能顯示使用者郵件信箱使用容量。
  • Addressbook Import-Export: 讓使用者能輕易將 Outlook Express 的通訊錄匯入 SquirrelMail 內。
  • View As HTML:使用者撰寫 Mail 時可切換圖片模式 (HTML) 或文字模式 (TEXT)。





文章目錄

1、前言
2、實作環境
3、安裝及設定
4、設定使用者郵件空間限制 (Mail Qouta)
5、轉換格式從 MailBox 至 MailDir
          步驟1.下載 2md Perl Script
          步驟2.開始進行 MailBox 轉換為 MailDir
6、SquirrelMail 安裝及設定
          步驟1.安裝 SquirrelMail 套件
          步驟2.修改 PHP 設定檔 (php.ini)
          步驟3.修改相關設定
          步驟4-1.載入內建 Plugin - Calendar (行事曆)
          步驟4-2.安裝 Plugin - Change LDAP Password
          步驟4-3.安裝 Plugin - Check Quota
          步驟4-4.安裝 Plugin - Addressbook Import-Export
          步驟4-5.安裝 Plugin - View As HTML
          步驟5.使用 LDAP Address Book
7、參考
8、Me FAQ
          Q1.無法使用 2md perl script?
          Q2.SquirrelMail 無法顯示登入介面並出現錯誤訊息?
          Q3.SquirrelMail 無法顯示測試介面並出現錯誤訊息?
          Q4.SquirrelMail 登入後出現錯誤訊息?
          Q5.無法登入 change password 頁面並出現錯誤訊息?
          Q6.無法登入 change password 頁面並出現錯誤訊息?
          Q7.按下 change password 後出現錯誤訊息?
          Q8.按下 change password 後出現 LDAP bind failed.?
          Q9.按下 change password 後出現 LDAP bind failed.?
          Q10.中文化後語系錯亂?
          Q11.搜尋 LDAP Address Book 中文字全都變成問號 (?)?
          Q12.搜尋 LDAP Address Book Call to undefined function: iconv()?
          Q13.搜尋不到 LDAP Address Book 資料?
          Q14.SquirrelMail 中文翻譯不完全?
          Q15.下載 SquirrelMail 中文檔名附件會變成亂碼?
          Q16.點選收件夾無法顯示,其它資料夾可正常顯示?





2、實作環境

  • FreeBSD 6.1-STABLE
  • Squirrelmail-1.4.8
  • Squirrelmail Plugins
  • Base Calendar
  • Change LDAP Password Version Version 1.8
  • Check Quota Version 1.4 re-release
  • Addressbook Import-Export Version 1.0
  • View As HTML 3.7a-1.4.x





3、安裝及設定

本篇文章將分為三部份作說明

1. 設定使用者郵件空間限制 (Mail Qouta)。
2. 轉換格式從 MailBox 至 MailDir。
3. 安裝及設定 Web Mail (SquirrelMail) 含 Plugins 安裝及介面中文化:
     1. 安裝 SquirrelMail Plugins (Change LDAP Password、Check Quota、Addressbook Import-Export、View As HTML)
     2. 中文化 SquirrelMail Plugins (Change LDAP Password、Check Quota、Addressbook Import-Export、View As HTML)
     3. 如何使用 LDAP Address Book





4、設定使用者郵件空間限制 (Mail Qouta)

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

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

Maillog 顯示使用者 E-Mail Address (weithenn@weithenn.org) 磁碟空間已滿。
Sep  2 13:18:35 ldap postfix/local974: 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)

Maillog 顯示系統退信給該郵件之寄件者 (weithenn@gmail.com)。
Sep  2 13:18:40 ldap postfix/smtp977: 81A145C21: to=<weithenn@gmail.com>, relay=gmail-smtp-in.l.google.com64.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@gmail.com) 收到系統退信內容關鍵字。
 <weithenn@weithenn.org>: maildir delivery failed: error writing message: Disc quota exceeded





5、轉換格式從 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,轉換完成後因為是使用管理者帳號 root 執行,因此記得把權限改為該使用者。
2md /home/mail/weithenn /home/user/weithenn/Maildir //進行 MailBox to MailDir
 123..........10        //代表 MailBox 總共轉換 10 封信到 Maildir
chown -R weithenn /home/user/weithenn/Maildir






6、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 至於如何安裝就不在多說了。
cd /usr/ports/mail/squirrelmail     //切換到安裝路徑
make install clean                   //安裝套件並清除暫存檔案




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

必須修改 PHP 設定檔 (php.ini) 否則屆時將造成連接登入視窗發生錯誤,順便將上傳附件最大容量限制改為 10MB (也就是屆時使用者可夾帶的 E-Mail 附件大小,預設為 2M)。
vi /usr/local/etc/php.ini
 file_uploads = On
 session.auto_start = 1
 upload_max_filesize = 10M    //設定上傳附件最大為 10MB

修改原因 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 吧。

直接修改設定檔 (config.php):
vi /usr/local/www/squirrelmail/config/config.php
 $squirrelmail_default_language = 'zh_TW';   //指定語系
 $default_charset       = 'big5';            //指定文字編碼格式

互動模式 (./configure):
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 >>      //輸入您要設定的項目

互動模式設定語系及字元編碼: (此次實作選擇步驟如下)
10. Languages
      Default Language : zh_TW
      Default Charset : big5
S Save data
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 //下載  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 (請依個人喜好擇一即可)
修改 config.php 內容如下:
vi /usr/local/www/data/squirrelmail/config/config.php
 $ldap_server0 = 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 編碼格式,因此無法順利顯示查到中文資訊 (都變成 ????),依下列步驟修著改即可,但記得確定系統是否安裝了 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=*)"
  6. 或輸入條件後按下【搜尋】即 Search base="ou=People,dc=weithenn,dc=org" filter="(cn=您輸入的條件 ex.葉大雄)"





7、參考







8、Me FAQ

Q1.無法使用 2md perl script?

Error Message:
執行 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;
 $ARGV0 or die "Usage: $0 Module::Name\n";
 my $mod = $ARGV0;
 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 Message:
連結到 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 Message:
連結到 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 Message:
連結到 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 Message:
登入 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 Message:
登入 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 Message:
登入 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 Message:
登入 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 Message:
登入 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 slapd12185: conn=59 fd=25 ACCEPT from IP=192.168.1.10:58274 (IP=0.0.0.0:389)
Sep  9 16:41:24 ldap slapd12185: conn=59 op=0 BIND dn="" method=128
Sep  9 16:41:24 ldap slapd12185: conn=59 op=0 RESULT tag=97 err=0 text=
Sep  9 16:41:24 ldap slapd12185: conn=59 op=1 SRCH base="dc=weithenn,dc=org" scope=2 deref=0 filter="(uid=wei)"
Sep  9 16:41:24 ldap slapd12185: conn=59 op=1 SRCH attr=dn
Sep  9 16:41:24 ldap slapd12185: conn=59 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Sep  9 16:41:24 ldap slapd12185: conn=59 op=2 BIND dn="uid=wei,ou=People,dc=weithenn,dc=org" method=128
Sep  9 16:41:24 ldap slapd12185: conn=59 op=2 BIND dn="uid=wei,ou=People,dc=weithenn,dc=org" mech=SIMPLE ssf=0
Sep  9 16:41:24 ldap slapd12185: conn=59 op=2 RESULT tag=97 err=0 text=
Sep  9 16:41:24 ldap slapd12185: conn=59 op=3 SRCH base="dc=weithenn,dc=org" scope=2 deref=0 filter="(uid=wei)"
Sep  9 16:41:24 ldap slapd12185: conn=59 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
Sep  9 16:41:24 ldap slapd12185: conn=59 op=4 MOD dn="uid=wei,ou=People,dc=weithenn,dc=org"
Sep  9 16:41:24 ldap slapd12185: conn=59 op=4 MOD attr=userpassword
Sep  9 16:41:24 ldap slapd12185: conn=59 op=4 RESULT tag=103 err=0 text=
Sep  9 16:41:24 ldap slapd12185: conn=59 op=5 UNBIND
Sep  9 16:41:24 ldap slapd12185: 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 Message:
當載入內建的 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 Message:
搜尋 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 Message:
搜尋 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 Message:
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 Message:
為何 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 Message:
使用 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 Message:
  • 收發信皆可正常使用。
  • 使用 IE 登入 SquirrelMail 後收件夾無法顯示,但點選其它像是 Drafts、Sent、Trash 又可正常顯示?
  • 信都收下來了但 Maildir 資料夾卻顯示還有 135MB?
  • Maillog 顯示 IMAP 為中斷模式 (DISCONNECTED)? 正常點選應該是要 LOGIN、LOGOUT?
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 後點選收件夾便可正常顯示了。
  • 取消在 Outlook Express 內【在伺服器保留郵件備份】的勾選
  • 至 Maildir 內將收件夾的 cur 內清空也可 (ex./home/user/weithenn/Maildir/cur;rm *)