差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
mail [2021/05/27 11:14] skkmail [2024/09/04 16:44] (現在) skk
行 1: 行 1:
-= [[mail]]+= [[mail]] / LM: [2024-09-04 16:43:44] 
 +~~NOCACHE~~ 
 + 
 +メールサーバの設定についてのメモを置く場所.
  
 ====== 2 台の dovecot サーバでの冗長化構成(2021/05) ====== ====== 2 台の dovecot サーバでの冗長化構成(2021/05) ======
行 22: 行 25:
  
 ==== コマンド例 ====  ==== コマンド例 ==== 
-  * 全てのメールを移動 <code>+  * 全てのメールを移動  
 +<code>
 % imapsync --host1 mail2.sakaki.works --port1 143 --authmech1 LOGIN --user1 skk.bps@sakaki.works --password1 "Password" --host2 mail2.sakaki.works --port2 143 --authmech2 LOGIN --user2 skk.bps@sakaki.works --password2 "Password"  % imapsync --host1 mail2.sakaki.works --port1 143 --authmech1 LOGIN --user1 skk.bps@sakaki.works --password1 "Password" --host2 mail2.sakaki.works --port2 143 --authmech2 LOGIN --user2 skk.bps@sakaki.works --password2 "Password" 
 </code> </code>
  
-  * 特定のフォルダだけ移動.その際,フォルダ名を変えたい.<code>+  * 特定のフォルダだけ移動.その際,フォルダ名を変えたい. 
 +<code>
 % imapsync --host1 mail2.sakaki.works --port1 143 --authmech1 LOGIN --user1 skk.bps@sakaki.works --password1 "Password" --host2 mail2.sakaki.works --port2 143 --authmech2 LOGIN --user2 skk.bps@sakaki.works --password2 "Password" --folder コピー元対象フォルダ --f1f2 コピー元対象フォルダ=コピー先対象フォルダ  </code> % imapsync --host1 mail2.sakaki.works --port1 143 --authmech1 LOGIN --user1 skk.bps@sakaki.works --password1 "Password" --host2 mail2.sakaki.works --port2 143 --authmech2 LOGIN --user2 skk.bps@sakaki.works --password2 "Password" --folder コピー元対象フォルダ --f1f2 コピー元対象フォルダ=コピー先対象フォルダ  </code>
 +
 +
 +
 +===== postfix 基本設定 ===== 
 +(2007 年時点の設定参照)
 +
 +==== 変更点1 ====
 +SSL/TLS に対応した
 +
 +<code ini>
 +smtpd_tls_cert_file = /usr/local/etc/letsencrypt/live/ns.sakaki.works/cert.pem
 +smtpd_tls_key_file = /usr/local/etc/letsencrypt/live/ns.sakaki.works/privkey.pem
 +smtpd_tls_CAfile = /usr/local/etc/letsencrypt/live/ns.sakaki.works/fullchain.pem
 +smtpd_tls_session_cache_database = btree:/var/cache/postfix/smtpd_scache
 +smtpd_tls_session_cache_timeout = 3600s
 +smtpd_tls_received_header = yes
 +smtpd_tls_loglevel = 1
 +</code>
 +
 +==== 変更点2 ====
 +特定の From ドメインからのみ,特定の relay_host を利用するように設定した.個人メールアカウントは,さくら VPS から直接配送とし,会社のメールは,会社の SMTP サーバ(Amazon SES)に送る,という流れ.
 +
 +/usr/local/etc/postfix/main.cf は以下の通り.
 +
 +<code ini>
 +smtp_use_tls = yes
 +smtp_sender_dependent_authentication = yes
 +sender_dependent_default_transport_maps = hash:/usr/local/etc/postfix/sender_relay
 +smtp_sasl_auth_enable = yes
 +smtp_sasl_security_options = noanonymous
 +smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
 +smtp_always_send_ehlo = yes
 +smtp_tls_policy_maps = hash:/usr/local/etc/postfix/tls_policy
 +#smtp_tls_wrappermode = yes
 +#smtp_tls_security_level = encrypt
 +smtp_tls_security_level = may
 +smtp_tls_note_starttls_offer = yes
 +smtp_tls_cert_file = /usr/local/etc/letsencrypt/live/ns.sakaki.works/cert.pem
 +smtp_tls_key_file = /usr/local/etc/letsencrypt/live/ns.sakaki.works/privkey.pem
 +smtp_tls_CAfile = /usr/local/etc/letsencrypt/live/ns.sakaki.works/fullchain.pem
 +</code>
 +
 +まず,smtp_sender_dependent_authentication を設定することで,sender_dependent_default_tarnsport_maps が有効になるように. sender_dependent_default_transport_maps には,以下のような sender_relay 情報を記述.
 +
 +<code ini>
 +@bpsinc.jp                         smtps:email-smtp.us-west-2.amazonaws.com:587
 +</code>
 +
 +Amazon SES から発行されているユーザ名とパスワードは,tls_policy にて encrypt を指定した後,sasl_passwd に以下のように設定.
 +
 +sasl_passwd: \\
 +<code ini>
 +email-smtp.us-west-2.amazonaws.com    ユーザ名:パスワード
 +</code>
 +
 +
 +tls_policy: \\
 +<code ini>
 +email-smtp.us-west-2.amazonaws.com:587     encrypt
 +</code>
 +
 +sender_relay, sasl_passwd, tls_policy は,それぞれ postmap コマンドを通すのを忘れないように.
 +
 +
 +はまったのが,relay_host で SMTPS(465) で送信しようとすると,postfix の挙動全体で,\\
 +smtp_tls_wrappermode = yes\\
 +smtp_tls_security_level = encrypt\\
 +と書いた上で,25 番への relay ができないモードになってしまうと言う部分.これが,どうしても解決できずに,どこかで見た,submission ポートで送ってみたら,ちゃんと認証した上で送信してくれることが分かったので,この設定にしておくことに.
 +
 +
 +==== 参考情報 ====
 +  * FreeBSD 12 で自宅サーバ作成 メールサーバ編:https://qiita.com/Chun3/items/dc0e176c9de4f6b4bfb8
 +    * DNS 〜 dovecot まで,かなり充実した記事.
 +  * Amazon SES とポストフィックスの統合:https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/postfix.html
 +    * Amazon の書いてくれている文章.ここで submission port を利用していたので,465 に拘らずに行けることが分かった.
  
  
行 66: 行 146:
   zlib_save_level = 6   zlib_save_level = 6
 } }
 +</code>
 +
 +[2023-04-29] 
 +
 +追記:
 +
 +mdbox を見ても,テキストで保存されていた.
 +
 +plugin lda の中の mail_plugin にも zlib を追記しないと動かなかったかもしれない.
 +
 +<code>
 +protocol lda {
 +  deliver_log_format = msgid=%m: %$
 +  info_log_path = /var/log/dovecot-lda.log
 +  log_path = /var/log/dovecot-lda.log
 +  mail_plugins = sieve zlib
 +...
 </code> </code>
  
行 106: 行 203:
 doveadm の man の中に,色々なコマンドが書いてあり,doveadm-command という名前で man が準備されている. doveadm の man の中に,色々なコマンドが書いてあり,doveadm-command という名前で man が準備されている.
 基本的に root (または,mail ユーザ)でないと動作しない. 基本的に root (または,mail ユーザ)でないと動作しない.
 +
 +=== doveadm purge ===
 +== マニュアル ==
 +<code>% man doveadm-purge </code>
 +
 +== 基本 ==
 +メールに対しての refcount が 0 になってるものを実際にストレージ上から削除するコマンド.Disk I/O の少ないタイミングで実行される,と記述があったが,実際に実行されているかの確認は [2021-12-31] 現在,とれていない.
 +
 +[2024-09-04] 少なくとも利用しているファイル保存形式が mdbox の場合,メールクライアントからメールを大量に削除しただけでは,まだ,ストレージ自体の削減にはならないが,sudo doveadm purge -u hoge@hoge.com を実行した後は,ストレージが削減されているのを確認できた.doveadm mailbox で確認できるサイズよりもずっと多くのストレージが削減されているように見えている.base64 やファイルシステムのブロックサイズが影響するのか…?と妄想するが,確認はとれていない.
 +
 +== 具体例 ==
 +  * 特定ユーザのメールボックスを確認し,refcount が 0 なら削除する.
 +% sudo doveadm purge -u hoge@hoge.com
 +
 +  * 全ユーザのメールボックスを確認し,refcount が 0 なら削除する.
 +% sudo doveadm purge -A 
  
 === doveadm search === === doveadm search ===
行 226: 行 339:
  
 == 基本 ==  == 基本 == 
 +そのうち書きたい.多分,コマンドラインでサーバ間の sync を行うなども可能だと思われる.imapsync の代わりとして利用できそうな気がする.imapsync より高速だと思われる.
  
 == 具体例 == == 具体例 ==
行 236: 行 349:
 ===== dovecot replicator ===== ===== dovecot replicator =====
  
-doveadm user で出ザ全てを同期する特定ユ同期したくない場合は,dovecot.passwd.db (passwd-file) 対象ユーザに,以下のような記述をしてお+=== 基本 === 
 + 
 +[[https://doc.dovecot.org/configuration_manual/replication/|Replication with dsync]] に,基本的に全書かれてい.二つの dovecot サバ間で master/master 同期を行う,という機能ルボックスに何か変化があった場合,replicator というプロセスが走り,もう一つサーバに同期をかける.[2021-05-27] 現在,んらかの原因で replicator プロセスが暴走することがあり,ちょちょい core dump しているのが気になるが,原因は不明. 
 + 
 +=== 設定 ===  
 + 
 +以下の設定は,さくら VPS・オンプレマシンの両方に必要. 
 + 
 +/usr/local/etc/dovecot/dovecot.conf:  
 +<code ini> 
 +mail_plugins = $mail_plugins notify replicator 
 + 
 +service replicator { 
 +  process_min_avail = 1 
 +  vsz_limit = 512M 
 + 
 +  unix_listener replicator-doveadm { 
 +    mode = 0600 
 +  } 
 +
 + 
 +dsync_remote_cmd = ssh -i /root/id_rsa -l%{login} %{host} doveadm dsync-server -u%u 
 +plugin { 
 +#  mail_replica = remote:root@mail2.sakaki.works 
 +  mail_replica = tcp:mail2.sakaki.works:12345 
 +
 + 
 +service aggregator { 
 +  fifo_listener replication-notify-fifo { 
 +    user = mailuser 
 +  } 
 +  unix_listener replication-notify { 
 +    user = mailuser 
 +  } 
 +
 + 
 +replication_max_conns = 10 
 + 
 +plugin { 
 +  # When saving a new mail via IMAP or delivering a mail via LDA/LMTP, 
 +  # wait for the mail to be synced to the remote site. If it doesn''t finish 
 +  # in 2 seconds, return success anyway. 
 +  replication_sync_timeout = 10 
 +
 + 
 +doveadm_password = password 
 +</code> 
 + 
 +大事なは,mail_replica の辺りで,ssh を使う方法と TCP を使う方法が存在している. 
 + 
 +ssh 経由で行う場合は,root でのログインを有効しないと行けないので,sshd において,以下のような設定をしておきつつ,鍵をお互いの root/.ssh/authorized_keys に登録すると良い
  
 <code> <code>
-username:{plain}hogehoge:5000:5000::/home/mail/%d/%n::userdb_noreplicate=y+## Okay allow root login with public ssh key for 210.160.237.138 ## 
 +Match Address 210.160.237.138 
 +        PermitRootLogin yes
 </code> </code>
  
 +今回は tcp を利用した.この場合,doveadm_password にて,お互いに共通のパスワードを書いておく必要がある.また,dsync_remote_cmd は必要ないと思われるが,消すのがめんどくさいので残してある.
  
  
-master/master 同期を行うためには,さくら VPS・オンプレマシン両方同じ設定書いておく必要がある+dsync では,doveadm user で出てくるユーザ全てを同期してしま.特定ユーザのみ同期しくない場合は,dovecot.passwd.db (passwd-file) 対象ユーザ,以下のような記述ておく.
  
 +<code>
 +username:{plain}hogehoge:5000:5000::/home/mail/%d/%n::userdb_noreplicate=y
 +</code>
  
 +多くのページにて,userdb_ prefix がいらない,と書いてあった気がするが,結局つけなければ動作しなかった.
  
 +=== 参考情報 ===
 +  * Replication with dsync:https://doc.dovecot.org/configuration_manual/replication/ (manual)
 +  * Replication with dsync:https://wiki.dovecot.org/Replication (wiki)
 +    * 全ての情報が,この二つのページに集約されている.
 +  * https://orebibou.com/ja/home/201612/20161212_002/
 +    * 日本語情報.結構しっかりまとまっている.
  
 ===== dovecot FTS 設定 ===== ===== dovecot FTS 設定 =====
行 256: 行 432:
   * xapian は使いものにならなかった.5 日間ほど動かしておいてみたが,ストレージへのアクセスが 10MB/s 〜 20MB/s が続いているのにいつまでも終了せず.replicator との相性か?と思ったが,多分,単品で動かしても安定しないのでは…と思った.   * xapian は使いものにならなかった.5 日間ほど動かしておいてみたが,ストレージへのアクセスが 10MB/s 〜 20MB/s が続いているのにいつまでも終了せず.replicator との相性か?と思ったが,多分,単品で動かしても安定しないのでは…と思った.
   * solr は java のインストールなど時間がかかったが,安定して動作.   * solr は java のインストールなど時間がかかったが,安定して動作.
 +  * 全文検索は,PC のメールクライアントだと実感しにくい.imap に対して search コマンドを発行しているかどうか.
 +    * iPhone のメールアプリにおける検索は,imap search を発行している.検索してみると,爆速になっているのを実感できる.
 +    * Thunderbird は,基本的に Thunderbird が作成したインデックスで検索しているが,Ctrl-Shift-f で出てくる検索ボックスの中の,「サーバー上のメッセージを検索する」にチェックを入れると,imap search コマンドを発行するらしい.
 +    * doveadm search は,この全文検索を活用している(はず).
   * TODO:   * TODO:
     * 未:日本語 tokenizer 対応     * 未:日本語 tokenizer 対応
行 263: 行 443:
         * Solr 使った日本語向けの設定が日本語で書いてある.         * Solr 使った日本語向けの設定が日本語で書いてある.
              
 +=== solr インストール ===
  
-=== 参考情報 === +Apache Solr は,Java で動作する全文検索エンジンらしい.動作自体は,http://localhost:8983 など立ち上がり,そこにコマンドを http で送る形式の模様.
-  * dovecot 正式情報:Full Text Search (FTS) plugin:https://doc.dovecot.org/settings/plugin/fts-plugin/+
  
-===== サーバサイドのフォルダ分け =====  +以下のような形で,textproc/apache-solr をインールする.
-  * sieve と replicator の相性が悪い気がする. +
-  * sieve は記述言語の癖が大きいのと記述ミをするとメールがなくなる時があり,なかなか恐い. +
-  * imapfilter は,lua というプログラミング言語で記述するため,振り分けルールの中の記述自由度が高い.変数なども使える.記述を間違った際は,imapfilter が動作しないだけなので,メール紛失の危険が低い+
  
-===== postfix 基本設定 =====  +/usr/local/etc/solr.in.sh 中に,データベース情報を保存する先の指などができる模様.今回は特に変更せず,デフォルトのまま利用した.
-(2007 年時点参照)+
  
-==== 変更点1 ==== +<code> 
-SSL/TLS に対応した+% portmaster -D textproc/apache-solr 
 +% echo "solr_enable=\"YES\"" >> /etc/rc.conf 
 +% /usr/local/etc/rc.d/solr start 
 +</code>
  
-==== 変更点2 ==== +=== 設定 ===
-relay_host で SMTPS 対応しようとして,失敗した. +
-そのかわり,Amazon SES は 465(smtps) だけでなく,587(submission) でも動作することが分かった.+
  
 +fts_solr プラグインを入れることで,メールボックスにメールが到着した際に,java な solr プロセスを立ち上げてインデックスを作成している模様.
  
 +設定の中にある indexer-worker は,indexer-worker という名前のプロセスが立ち上がる.xapian を設定した際も立ち上がっていたので,FTS 全般で動作する親プロセスみたいなものだと思われる.process_limit を指定しているのは,xapian が阿呆みたいにプロセスを立ち上げまくって,HDD を苛め抜いていたので,制限をかけた名残.これが残ったままでも Solr 自体は快調に動いてる.
 +
 +text2decode は,xapian を設定している際に見かけた,添付ファイルや mime encode されたメールも処理できるようなスクリプトだと思われる.一応指定してあって問題はなさそう.
 +
 +dovecot.conf:
 +<code>
 +mail_plugins = $mail_plugins fts fts_solr
 +
 +plugin {
 +  fts = solr
 +  fts_solr = url=http://127.0.0.1:8983/solr/dovecot/
 +  fts_autoindex = yes
 +  fts_autoindex_exclude = \Trash
 +  fts_decoder = decode2text
 +}
 +
 +service indexer-worker {
 +  vsz_limit = 4G
 +  process_limit = 2
 +}
 +
 +service decode2text {
 +  executable = script /usr/local/libexec/dovecot/decode2text.sh
 +  user = dovecot
 +  unix_listener decode2text {
 +    mode = 0666
 +  }
 +}
 +</code>
 +
 +=== 参考情報 ===
 +  * dovecot 正式情報:Full Text Search (FTS) plugin:https://doc.dovecot.org/settings/plugin/fts-plugin/
 +
 +===== サーバサイドでのフォルダ分け ===== 
 +  * sieve と replicator の相性が悪い気がする.
 +  * sieve は記述言語の癖が大きいのと,記述ミスをするとメールがなくなる時があり,なかなか恐い.
 +  * [[imapfilter]] は,lua というプログラミング言語で記述するため,振り分けルールの中の記述自由度が高い.変数なども使える.記述を間違った際は,imapfilter が動作しないだけなので,メール紛失の危険が低い.
  
 ===== spamassassin 設定 =====  ===== spamassassin 設定 ===== 
行 506: 行 721:
   * %d を有効にするために,ユーザの後ろには必ず@でドメインを指定する必要がある.virtual host を有効にするにはこの設定が必要.   * %d を有効にするために,ユーザの後ろには必ず@でドメインを指定する必要がある.virtual host を有効にするにはこの設定が必要.
   * CRAM-MD5 とかのハッシュ値を作成するには,dovecotpw というコマンドを利用すれば簡単に作成できる.   * CRAM-MD5 とかのハッシュ値を作成するには,dovecotpw というコマンドを利用すれば簡単に作成できる.
 +  * [2021-05-27]追記:現状の設定ファイルの内容を確認するには,doveconf を利用する.
 +<code>
 +% doveconf -n 
 +</code>
  
 ===== 参考文献  ===== ===== 参考文献  =====
行 552: 行 771:
  
  
 +----
 +このページへのアクセス
 +今日: {{counter|today}} / 昨日: {{counter|yesterday}}
 +総計: {{counter|total}}
  
mail.1622081663.txt.gz · 最終更新: 2021/05/27 11:14 by skk
文書の先頭へ
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0