Top

webmail

roundcube

准备工作

数据库

假设mailserver的IP是192.168.0.111
先在某台主机(假设其IP为192.168.0.112)上安装MariaDB,配置可以从远程访问它(修改/usr/local/etc/mysql/conf.d/server.conf文件,屏蔽掉bind-address行)。
进入mysql,创建roundcubemail数据库:
create database roundcubemail;
创建roundcube用户并授权(假设roundcube安装在IP为192.168.0.114的主机上):
create user roundcube@192.168.0.114 identified by '123456';
grant all on roundcubemail.* to roundcube@192.168.0.114;

dovecot

nginx+php

建议安装最新版。
安装和配置方法参考freebsd ngxin php
目前在FreeBSD系统上roundcube有两个版本:php74和php80,选择适当的版本安装。
安装完毕后对nginx进行相应的设置。然后从浏览器访问以下网址进行设置:
http://hostname/installer/
第一页是检查环境,安装程序会检测到当前的PHP版本以及现有的PHP扩展。
必要的扩展有:
模块/扩展 包名称 说明
PCRE pcre & pcre2 Perl Compatible Regular Expressions library,与Perl兼容的正则表达式库
DOM php80-dom Document Object Model,文件对象模型
是W3C组织推荐的处理可扩展置标语言的标准编程接口
Session php80-session 会话
XML php80-xml xml共享扩展
Intl php80-intl 国际化支持拓展
JSON json-c Java Script Object Notation,Java脚本对象表示法
PDO php80-pdo & php80-pdo_mysql PHP Data Objects,PHP数据对象
Multibyte 未知
OpenSSL openssl Open Secure Sockets Layer,开放式安全套阶层
Filter php80-filter PHP过滤器,用于对来自非安全来源的数据(比如用户输入)进行验证和过滤
Ctype php80-ctype Ctype扩展函数,提供了一组函数用于校验字符串中的字符是否是正确的格式
可选扩展有:
模块/扩展 包名称 说明
cURL php80-curl 实现服务器之间的数据或文件传输
FileInfo php80-fileinfo 通过在文件的给定位置查找特定的魔术字节序列,来获取文件的MIME信息
Exif php80-exif Exchangeable image file format,可交换图像文件
Iconv php80-iconv 各种字符集之间的转换
LDAP php80-ldap 访问LDAP,需要openldap-client
GD php80-gd 创建新图像或处理已有的图像
Imagick php80-pecl-imagick 用来创建、编辑、合并位图图像的一套组件
Zip php80-zip 读取压缩文件
如果缺少某个扩展,可以用pkg search查找对应的包名,然后安装对应的包,重启php-fpm服务即可。
此页面可以刷新以再次检查环境。

接下来是检查可用的数据库,至少要有一项,一般是MySQL或SQLite。

然后是必须的第三方库和php设置,一般会遇到date.timezone: NOT OK的问题,不是必须的,可以不用管它。点NEXT按钮进入下一步。
第二页是创建配置文件,主要需要关注的有以下栏位: 最后插件部分可以都选上(除了debug_logger)。
插件名称 功能
acl IMAP文件夹访问控制列表管理(RFC4314、RFC2086)
additional_message_headers 可以在发送的消息中添加或删除额外的标题
archive 这将添加一个按钮,用于将所选邮件移动到存档文件夹。可以在“设置”面板中选择文件夹(以及可选的子文件夹结构)
attachment_reminder 提醒用户,如果合成的消息文本指示应该有文件,请附加文件
autologon 试用一些挂钩的示例插件
database_attachments 为临时附件文件处理提供数据库支持的存储。此插件的主要优点是与循环dns多服务器Roundcube安装兼容
debug_logger 出于调试目的增强了日志记录功能。由于内存、cpu和磁盘i/o开销有所增加,不建议在未经测试的生产系统上启用。
emoticons 添加表情符号支持的插件
enigma Roundcube的服务器端PGP加密
example_addressbook 添加一个新的通讯簿,其中只包含静态联系人列表
filesystem_attachments 核心插件,提供基本的、基于文件系统的附件临时文件处理。这包括存储当前正在撰写的邮件的附件,在重新打开带有附件的草稿时将附件写入磁盘,以及将附件写入磁盘以在当前html撰写中内联显示。
help 在任务栏中添加新项目(帮助)
hide_blockquote 这允许在消息中隐藏引用的长文本块
http_authentication HTTP基本认证
identicon 显示没有指定照片的联系人/地址的类似Github的标识图标
identity_select 回复邮件时,用户标识的选择基于标准头的内容,如From、to、Cc和Return Path。在此处,您可以添加SMTP服务器设置的标头(例如,delived To、Envelope To、X-Envelope-To、X-RCPT-To),以使标识选择更加准确。
jqueryui 插件将完整的jQuery UI库(包括平滑度主题)添加到Roundcube。这允许其他插件使用jQuery UI,而不必加载自己的版本。使用一个中央jQuery UI的好处是,我们不会遇到加载冲突jQuery库的问题。所有想要使用jQuery UI的插件都应该将此插件作为一项要求使用。
krb_authentication Kerberos身份验证
managesieve 增加了管理筛选脚本(传入邮件过滤器)的可能性。它是一个可点击的界面,可以在文本脚本上操作,并使用managesieve协议与服务器进行通信。在设置中添加过滤器选项卡。
markasjunk
new_user_dialog 创建新用户时,此插件将检查默认标识,并设置会话标志以防其不完整。屏幕上将出现一个覆盖框,直到用户查看/完成其身份。
new_user_identity 在新用户第一次访问时从LDAP填充其默认标识。
newmail_notifier 支持三种通知方式:
  • 基本-聚焦浏览器窗口并更改favicon
  • 声音-播放wav文件
  • 桌面-显示桌面通知(使用HTML5通知API功能)
password Roundcube的密码更改。插件增加了通过设置/密码选项卡使用多种方法(驱动程序)更改用户密码的可能性。
reconnect 多次尝试重新连接到服务器
redundant_attachments 此插件为临时上载的附件文件提供冗余存储。它们存储在数据库后端和本地文件系统中。它还提供memcache存储作为后备
show_additional_headers 概念验证插件,它将获取额外的标题并将其显示在消息视图中
squirrelmail_usercopy 从附近的Squirrelmail安装复制新用户标识和设置
subscriptions_option 可以启用或禁用imap订阅使用的插件。它在“服务器设置”下的“设置”页面上包含一个切换。也可以锁定首选项。
userinfo 向设置部分添加新选项卡以显示当前用户的一些信息的示例插件
vcard_attachments 检测vCard附件并允许将其添加到通讯簿。还允许将联系人的vCard附加到合成邮件
virtuser_file 该插件增加了根据文件中的查找表解析用户电子邮件/登录的可能性
virtuser_query 该插件增加了根据SQL数据库中的查找表解析用户电子邮件/登录的可能性
zipdownload 添加一个选项,当邮件有多个附件时,可以将所有附件下载到一个zip文件中的邮件中。还允许在一个zip文件中下载选定的邮件。支持mbox和maildir格式。
全部设置完毕后点击CREATE CONFIG按钮,会在页面上出现一个代码框,可以将其下载到本地,或保存到服务器的/tmp/目录下,也可以直接在服务器的/usr/local/www/roundcube/config/下创建config.inc.php文件,并将这些代码复制到该文件中。
然后按CONTINUE按钮。

Test config页上如果连接数据库正常,即可创建对应的数据表。
若遇到错误提示:
Mimetype to file extension mapping: NOT OK
可以修改/usr/local/etc/www/roundcube/confing/config.inc.php,在最后加入一行:
$config['mime_types']='/usr/local/www/roundcube/config/mime.types';
然后在/usr/local/etc/www/roundcube/confing/目录下执行:
fetch http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
注意:如果邮件服务器有类似fail2ban这样的软件,有可能会拦截webserver到mailserver之间的通信。
发送邮件功能未测试成功,提示认证失败。
查看maillog,发现是submission里面可能有错误:
Jul  4 07:27:25 mail postfix/submission/smtpd[58994]: connect from web[192.168.0.114]
Jul  4 07:27:25 mail postfix/submission/smtpd[58994]: disconnect from web[192.168.0.114] ehlo=1 quit=1 commands=2
逐个排查,发现注销掉以下行后可以正常发送邮件:
 -o smtpd_tls_security_level=encrypt
 -o smtpd_tls_auth_only=yes
最后测试结果是将smtpd_tls_security_level改为may,屏蔽掉-o smtpd_tls_auth_only=yes
修改密码功能需要设置password插件,其配置文件为/usr/local/www/roundcube/plugs/password/config.inc.php
README文件有以下段:
 Set 'password_dovecot_passwdfile_path' to your dovecot passwd-file location and
 'password_algorithm' (and related options) to the algorithm you want the passwords
 stored in the file to be using.
由于我搭建的环境是web服务器与邮件服务器不在同一个jail里面,尚未找到从web服务器读取并修改邮件服务器上用户密码文件的方法,故没有测试成功。
很多人更喜欢用mysql之类的数据库来存储账号密码的方式,可能就是因为通过访问对应的端口操作对相应的表来的更加容易一些吧。

关于roundcube设置,可以参考以下文章:
如何熟悉WebMail Roundcube的配置
如果web服务器和mail服务器在同一台主机里,要使用roundcube的password插件的话,需要修改两个文件:

/usr/local/www/roundcube/plugins/password/config.inc.php

以下参数:
$config['password_driver'] = 'dovecot_passwdfile';  //使用dovecot_passwdfile驱动
$config['password_algorithm'] = 'dovecot';
$config['password_dovecotpw'] = '/usr/local/bin/doveadm pw'; // for dovecot-2.x
$config['password_dovecotpw_method'] = 'BLF-CRYPT';  //dovecot默认的密码加密方式
$config['password_dovecotpw_with_method'] = true;
$config['password_dovecot_passwdfile_path'] = '/var/vmail/user-passwd'; //此处对应账号密码文件的完整路径

/usr/local/www/roundcube/plugins/password/drivers/dovecot_passwdfile.php

这个我觉得是个bug,原文件中有以下行:
$line = "$username:$password" . substr($line, $pos);
这一行应该是把用户名和新密码组合成一句,但是多了 . substr($line, $pos),就变成把旧的用户名和密码组合保留在同一行的行尾。这会造成客户端更改密码后无法登录。
解决方法是将. substr($line, $pos)删除掉,变成:
$line = "$username:$password";
注意,roundcube更新会冲掉这里修改过的配置,需要重新修改。