2026年7月9日
2026年7月9日
RoundcubeでWebメールクライアントを構築する方法(Postfix+Dovecotに追加・安全な公開設定)
Roundcubeは、ブラウザーからIMAPのメールボックスを読み書きできるオープンソースのWebメールです。すでに動いているPostfix+Dovecotのメールサーバーに追加すると、メールアプリを設定できない環境からでもメールを使えるようになります。この記事では、Ubuntu/Debian上でNginxとPHP-FPMを使う例で、導入方法の選び方、データベースの準備、config.inc.php の設定、Webサーバーの設定、公開前に済ませたい安全対策、更新の手順までを説明します。WordPressと同じサーバーに置く場合の分け方にも触れます。
始める前に確認すること
Roundcubeはメールを保存する仕組みを持たず、IMAPサーバー(Dovecot)に接続してメールを表示し、SMTPサーバー(Postfix)に接続して送信します。そのため、先に次の状態になっている必要があります。
- メールアプリから、IMAP(993番)での受信とSMTP(587番)での認証付き送信ができる。
mail.example.comなどのホスト名に、正式なTLS証明書がある。- PHP、Webサーバー、MariaDB/MySQLなどのデータベースが用意できる。
RoundcubeはWebに公開する認証画面を持つアプリケーションで、過去には実際の攻撃に使われた脆弱性も報告されています。公開する以上、更新を続けることが運用の前提になります。更新の手間をかけられない場合は、Webメール付きのメールサービスを使うほうが安全なこともあります。
導入方法を選ぶ
主な方法は2つです。
- **ディストリビューションのパッケージ(
apt install roundcube)**: 導入が簡単で、セキュリティ修正もパッケージの更新として届きます。ただし、新しい機能が入るのは遅く、ファイルの配置がDebian独自になります。 - 公式サイトの配布ファイル(complete版): 公式の最新版を使え、ドキュメントどおりの配置になります。更新は自分で行う必要があります。
この記事では、公式の配布ファイルを使う方法で説明します。Roundcubeは1.6系が広く使われています(2026年10月現在)。新しい系列が出ていることもあるため、公式サイトでサポート中の版と、必要なPHPのバージョンを確認してから入手します。
PHPの拡張モジュールは、少なくとも次のものを入れておきます。
sudo apt install php-fpm php-mysql php-intl php-mbstring php-xml php-zip php-gd php-curl
データベースを用意する
作業前に既存のデータベースをバックアップしておきます。Roundcube専用のデータベースとユーザーを作ります。パスワードは自分で生成した長いものに置き換えます。
CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'roundcube'@'localhost' IDENTIFIED BY 'your-db-password';
GRANT ALL PRIVILEGES ON roundcubemail.* TO 'roundcube'@'localhost';
FLUSH PRIVILEGES;
WordPressと同じデータベースサーバーを使う場合も、データベースとユーザーは分けます。片方のアプリケーションに問題が起きたとき、もう片方のデータまで読まれたり壊されたりすることを防ぐためです。
配布ファイルを展開したら、付属のSQLで表を作ります。
cd /var/www/roundcube
mysql -u roundcube -p roundcubemail < SQL/mysql.initial.sql
config.inc.php を設定する
config/config.inc.php.sample をコピーして config/config.inc.php を作り、主な項目を設定します。全項目の既定値と説明は config/defaults.inc.php に書かれているため、変えたい項目を探すときはそちらを読み、変更する項目だけを config.inc.php に書きます。
<?php
$config = [];
$config['db_dsnw'] = 'mysql://roundcube:your-db-password@localhost/roundcubemail';
// IMAP は 993 番(暗黙の TLS)、SMTP は 587 番(STARTTLS)
$config['imap_host'] = 'ssl://mail.example.com:993';
$config['smtp_host'] = 'tls://mail.example.com:587';
$config['smtp_user'] = '%u'; // ログインしたユーザー名で SMTP 認証する
$config['smtp_pass'] = '%p'; // ログイン時のパスワードを使う
$config['des_key'] = 'replace-with-24-random-chars';
$config['product_name'] = 'Webメール';
$config['plugins'] = ['archive', 'zipdownload'];
$config['enable_installer'] = false;
$config['ip_check'] = true;
imap_hostとsmtp_hostは、1.6系で導入された名前です。古い版の解説で見かけるdefault_hostやsmtp_serverは、1.6系では使いません。- 接続先をIPアドレスや
localhostにすると、証明書のホスト名と一致せず、TLSの検証に失敗します。証明書に含まれるmail.example.comを指定します。 des_keyは、セッション中のパスワードを暗号化するための鍵です。openssl rand -base64 18などで生成したランダムな値に置き換え、ほかの環境と使い回しません。ip_checkを有効にすると、ログイン中にIPアドレスが変わったセッションを無効にします。携帯回線などでIPアドレスがよく変わる利用者が多い場合は、ログインし直しが増える点に注意します。
設定ファイルには、データベースのパスワードと des_key が入ります。所有者とパーミッションを絞り、Webサーバーから直接ダウンロードされない場所であることを次の手順で確認します。
sudo chown -R root:www-data /var/www/roundcube
sudo chmod 640 /var/www/roundcube/config/config.inc.php
sudo chown -R www-data:www-data /var/www/roundcube/temp /var/www/roundcube/logs
Webサーバーを設定する
比較的新しいRoundcubeには、公開用のファイルだけをまとめた public_html ディレクトリが含まれています。ドキュメントルートをここに向けると、config/・logs/・temp/ などがWebから見えない位置になります。
server {
listen 443 ssl;
http2 on;
server_name webmail.example.com;
ssl_certificate /etc/letsencrypt/live/webmail.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/webmail.example.com/privkey.pem;
root /var/www/roundcube/public_html;
index index.php;
client_max_body_size 25m;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}
http2 on; はNginx 1.25.1以降の書き方です。それより古い版では listen 443 ssl http2; と書きます。PHP-FPMのソケットのパスは、インストールされているPHPのバージョンによって違うため、/run/php/ の中身を見て合わせます。HTTP(80番)はHTTPSに転送するだけにします。
client_max_body_size は添付ファイルの上限に関わります。PHPの upload_max_filesize と post_max_size、Postfixの message_size_limit もあわせて確認しないと、どこか1か所の上限で送信が失敗します。添付は送信時にエンコードされて大きくなるため、Postfixの上限には余裕を持たせます。
設定したら、ブラウザーで https://webmail.example.com/ を開いてログインし、受信・送信・フォルダーの表示を確かめます。
WordPressと同じサーバーに置く場合
WordPressの公開ディレクトリの下(/wordpress/webmail/ など)には置かず、webmail.example.com のような別のサブドメインと別のドキュメントルートにします。さらに、PHP-FPMのプールを分けて別のユーザーで動かすと、WordPressのプラグインに脆弱性があってもRoundcubeの設定ファイルを読まれにくくなります。
公開前に済ませたい安全対策
- インストーラーを消す: 配布ファイルに含まれる
installerディレクトリは、設定が終わったら削除し、enable_installerをfalseにします。残しておくと、設定の確認画面が外部から見える状態になりかねません。 - ログイン試行の制限: Roundcubeは、ログインの失敗を
logs/以下のログ(または設定によってsyslog)に記録します。fail2banにはRoundcube用のフィルターが用意されているため、ログの場所を合わせて有効にすると、総当たりを繰り返すIPアドレスを遮断できます。Dovecot側の認証失敗の遮断も合わせて行います。 - 二要素認証: プラグインで追加できます。プラグインは公式のプラグイン一覧やComposerで探せますが、提供者や更新の状況はさまざまです。Roundcubeの版に対応しているか、最近も更新されているかを確認してから入れます。
- アクセス元の制限: 社内だけで使うなら、Nginxの
allow/denyやVPNで接続元を絞ると、攻撃を受ける範囲を大きく減らせます。 - 個人情報の扱い: Webメールにはメールの本文や連絡先が表示されます。アクセスログやエラーログにも利用者のアドレスが残るため、ログの保存期間と閲覧できる人を決めておきます。
更新の手順
公式の配布ファイルで入れた場合は、新しい版を別の場所に展開し、付属のスクリプトで既存の環境に上書きします。作業前にRoundcubeのディレクトリとデータベースをバックアップします。
cd /tmp/roundcubemail-1.6.x # 展開した新しい版のディレクトリ
sudo bin/installto.sh /var/www/roundcube
このスクリプトは、ファイルの置き換えとデータベースの表の更新を行います。更新後は config/defaults.inc.php の変更点を確認し、ログインと送受信を一通り試します。セキュリティ修正の告知を見逃さないよう、公式サイトのお知らせやリリース情報を購読しておきます。
うまくいかないときの確認順
- ログインできない:
logs/errors.logにIMAPへの接続エラーが出ていないかを見ます。証明書の検証失敗なら接続先のホスト名、認証失敗ならDovecotのログ(journalctl -u dovecot)を確認します。 - 送信できない:
smtp_hostの指定と、Postfixのmail.logのpostfix/submissionの行を見ます。SMTP認証が通っていない場合は、smtp_userとsmtp_passの指定を確認します。 - 画面が真っ白、または500エラー: PHP-FPMのエラーログと、PHPの拡張モジュールの不足を確認します。
まとめ
- RoundcubeはIMAP・SMTPに接続する画面の役割で、PostfixとDovecotが先に動いている必要があります。
- 1.6系では接続先を
imap_hostとsmtp_hostで指定し、証明書のホスト名と一致させます。 - ドキュメントルートを
public_htmlに向け、設定ファイルやログをWebから見えない位置にします。 - WordPressとは別のサブドメイン・別のデータベース・別のPHP-FPMプールに分けます。
- インストーラーの削除、fail2banでの総当たり対策、継続的な更新が公開の条件です。