プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

Roundcube で 1MB 超の添付ファイルが送れない

こちらの記事で書いたように、メールクライアントとして Roundcube を使っています(Roundcube は QNAP NAS 上で docker で動かしています)。

いままで、順調に使えていたのですが、先日添付ファイルを送ろうとしたら、エラーが表示されて、添付ファイルをアップロードすることができないという事態が発生しました。

取り急ぎは、元のメールアカウントの Web メールを使って送信したので、事なきを得たのですが、このままだとせっかく Roundcube を使っている意味がありません。

ということで、原因の調査をしてみたので、ことの顛末をメモっておきます。現在の環境は以下の通りです。

  • Roundcube: 1.5.3
  • QNAP TS-251+
  • QTS: 5.0.1.2425
  • Container Station: 2.6.7.44

制限が発生する添付ファイルのファイルサイズ

この現象に遭遇する以前から、添付ファイルは問題なく送れています。今回送ろうとしたのが、 Roundcube に切り替えてからは初の accessのファイル ( .accdb ) だったので、考えられる原因は2つあります。

  • ファイル種類の制限
  • ファイルサイズの制限

最初は前者かと思い、いろいろと調べていたのですが、どうもそれらしい制限が見当たりません。

ここまではブラウザとして Chrome を使っていたのですが、試に Firefox でやってみたところ、下記の画像のように『 Request Entitiy too large 』と表示されました。

あぁ、ファイルサイズが原因っぽいですね。

ということで、新規メールの作成を使ってテストしてみます。PDFファイルは何度も過去に送ったことのあるので、 PDF ファイルでいろいろなサイズの添付ファイルを試してみたところ、だいたい 1MB を超えるとアップロードに失敗するようです。

やっぱりこれっぽいですね。

現状の設定の確認

どこか設定を間違えていないか確認します。 Roundcube は docker-compose で立ち上げているのですが、それには

  roundcubemail:
    (略)
    environment:
      (略)
      - ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE=30M

と添付ファイルのサイズは 30MB まで OK と指定してあります。

念のため、 php info を確認すると

[ユーザ名@NAS名 application]$ docker exec -it myrc /bin/bash
root@74a3150b44ab:/var/www/html# php --info | grep -i max_size
post_max_size => 30M => 30M
root@74a3150b44ab:/var/www/html# 
root@74a3150b44ab:/var/www/html# php --info | grep -i max_filesize
upload_max_filesize => 30M => 30M

post_max_size , upload_max_filesize とも 30MB になってます。Roundcube 側の設定はここまで見る限り問題なさそうです。

こういう時はログを手がかかりに調べるのが常套手段なので、 NAS の Roundcube コンテナのコンソールを見て、標準出力に出てるログを確認してみます。

あれ?何にも出てません。

さて、こまったぞ。

原因

当初は、 Roundcube 自体の問題かと思い、いろいろと調べてたんですが、なかなか原因がわかりません。そのうち、(どういう経緯かは覚えていませんが)ふと、プロキシサーバーのサイズ制限、といった話題を目にしました。

ん?今の docker-compose で立ち上げた Roundcube は https 化するのにリバースプロキシとして https-portal を使ってた、ということを思い出しました。

ひょっとしたら、これかも。と思い調べてみると、見事ありました。

file size upload limit introduced by https-portal? · Issue #115 · SteveLTN/https-portal · GitHub

https-portal はデフォルトでボディサイズを制限しているとのことです。なるほどね。

で、 https-portal でひっかっかてるんだったら、 Roundcube 側にログがでないのもうなずけます。ということで、 https-portal のログを調べてみると、それっぽいのがあります。

ほぼ、これが原因と考えてよいでしょうね。

解決方法

じゃあ、上の記事を参考にして、設定を変更しようと思ったのですが、具体的にどうすればいいのかな? docker-compose.yml で設定変更できないかな?と思い、もうちょっと調べると、下記の記事が見つかりました。

Where to change docker nginx file upload limit? · Issue #173 · SteveLTN/https-portal · GitHub

どうも、 docker-compose.yaml の envirionment に書けば、反映されるようです。

ということで、 Container Station を開いて、『アプリケーションの編集』を押します。

docker-compose.yml が表示されるので、この内容に対して、

services:
  https-portal:
    (中略)
    environment:
    (中略)
      CLIENT_MAX_BODY_SIZE: 0

(後略)  

のように CLIENT_MAX_BODY_SIZE を追加します( 0 はサイズチェックを行わないになります)。

編集後、『適用』ボタンを押します。

しばらくすると、コンテナが再起動するので、起動後、もう一度新規メール作成を選び、 1MB を超える添付ファイルを選択したら、問題なく添付できました!もちろん、送信も問題なくできます。

ずばり、これが原因だったんですね。

参考

ちなみに、最初は Chrome で試してたんですが、この時は『サーバーエラー』とだけ出てきていたので、何のことかさっぱりわかりませんでした。

で、試に Firefox でやってみたところ、上述のように『 Request Entitiy too large 』と表示されたという次第です。 にしても、(何かほかの理由原因が潜んでいるのかもしれませんが)ブラウザでエラーメッセージが変わるはやめてほしいです。