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での総当たり対策、継続的な更新が公開の条件です。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲