1. システム構成の概要
メールサーバーから自動受信したメールをSpamAssassinでフィルタリングし、Alfrescoに取り込む構成です。
| コンポーネント | 役割 | 備考 |
|---|---|---|
| getmail 6.x | POP3S でメール取得 | cron で5分毎に実行 |
| SpamAssassin 4.0 | スパム判定・件名に ***SPAM*** 追加 | スコア7以上は破棄 |
| postfix 3.8 | Alfresco への配送・遅延制御 | 5秒/通の遅延設定 |
| Alfresco 26.1 | メール格納・振り分け | Community版 Ansible インストール |
2. Alfresco 事前設定(alfresco-global.properties)
Alfresco のメール受信機能を有効にするため、設定ファイルにメール関連プロパティを追加します。
① サンプルファイルから設定を確認
② alfresco-global.properties に追記
ファイル末尾の ### Begin - Custom user properties - ANSIBLE MANAGED BLOCK セクションに追記します。
email.server.port=25 はpostfixが使用しているため、1025など別のポートに変更してください。alfresco.host を空欄にすると Share の WebDAV URL 表示で旧サーバーの IP が使われることがあります。必ず設定してください。
③ Alfrescoサービスを再起動
3. Postfix のインストールと設定
インストール
/etc/postfix/main.cf の設定
4. getmail のインストールと設定
インストール
~/.getmail/getmailrc の設定
cron 設定(5分毎)
5. SpamAssassin の導入
インストール
/etc/default/spamd の設定
Ubuntu 24.04 では /etc/default/spamd の OPTIONS に --siteconfigpath を追加しないと、local.cf のブラックリスト設定が spamd に読み込まれません。
spamassassin -t ではブラックリストが有効でも、spamc 経由では無効になります。必ず設定してください。
/etc/spamassassin/local.cf の設定
| スコア | 対応 |
|---|---|
| 5.0 以上 | スパム判定(件名に ***SPAM*** 追加) |
| 7.0 以上 | 破棄(spamc-wrapper.sh で Alfresco に配送しない) |
| 5.0 未満 | 正常メール(Alfresco へ配送) |
6. spamc-wrapper スクリプト
getmail から呼び出され、SpamAssassin でフィルタリング後に postfix 経由で Alfresco へ配送します。
content_filter = spamassassin を設定するとメールループが発生します。必ずコメントアウトし、getmailrc からラッパースクリプトを直接呼び出す方式にしてください。
7. Alfresco スクリプト群
メール格納フォルダのルールに登録するJavaScriptスクリプトです。リポジトリ > Data Dictionary > Scripts に登録し、メール格納フォルダのルールに設定します。
| スクリプト | 役割 | 実行設定 |
|---|---|---|
| mailRename.js | 件名に送信日時を付加・URLエンコード文字を全角に置換・MIMEタイプ修正 | 通常実行 |
| mailFolderCreate.js | メール本体受信時にフォルダを作成・アスペクト付与 | 通常実行 |
| mailFolderMove.js | メールをフォルダへ移動 | バックグラウンド実行 |
| mailSort.js | 送信者アドレスで振り分け・SPAMはspamフォルダへ・自組織ドメインは別サイトへ | 通常実行 |
| mailSortAdd.js | 手動振り分け時に送信者アドレスを登録 | 各振り分けフォルダのルール |
mailRename.js — ファイル名に送信日時を追加・MIMEタイプ修正
mailFolderCreate.js — メールフォルダ作成
mailFolderMove.js — メールをフォルダへ移動(バックグラウンド実行)
mailSort.js — 振り分けスクリプト 最新版
件名にSPAMを含むメールは最優先でspamフォルダへ、自組織ドメインのメールは別サイトのフォルダへ直接移動します。それ以外は各振り分けフォルダの cs:address と照合して移動します。
移動後に setInheritsPermissions(true) を呼び出すことで、移動後のフォルダが再移動できなくなる問題(SHARED ACL問題)を防止しています。
document.move() した後、そのフォルダを再度移動しようとすると「移動できませんでした」エラーが発生することがあります。setInheritsPermissions(true) を追加することでACLがDEFINING状態に再設定され、再移動が可能になります。
cs:address は最大50,000文字(d:text型)です。上限に達するとルール実行時にエラーが大量ループしサーバー全体の負荷が急増します。定期的に整理してください。
mailSortAdd.js — アドレス登録スクリプト
8. カスタムモデルの設定
| アスペクト名 | プロパティ | 型 | 用途 |
|---|---|---|---|
| cs:published | cs:publishdate | d:date | 発行日(ソート用) |
| cs:publisher | d:text | 発行者 | |
| cs:maillist | cs:address | d:text(maxLength=50000) | 振り分けアドレスリスト |
cs:address は d:text 型・maxLength=50000 で設定してください。上限を超えるとエラーが大量ループしサーバー全体の負荷が急増します。
モデルXML(cs:maillist アスペクト部分)
振り分け先フォルダへのアスペクト設定
10. spamフォルダの定期学習・自動整理
件名に ***SPAM*** が付いたメールを専用フォルダへ振り分け、定期的に SpamAssassin のベイジアンフィルタへ学習させたうえで自動整理します。
認証情報の外部ファイル管理
root:root のままだと、cronを一般ユーザーで実行した際に Permission denied エラーになります。cronを実行するユーザーをグループオーナーに設定し、640 権限にしてください。
deleteSpamBatch.js — 蓄積SPAMを少しずつ削除
spam-batch-delete.sh — バッチ削除シェルスクリプト
cron登録
sudo timedatectl set-timezone Asia/Tokyo で設定できます。sudo crontab -e(root)と crontab -e(一般ユーザー)は別ファイルで管理されます。どのユーザーで登録したか必ず記録してください。
/var/log/spam-batch-delete.log に「削除完了。cronを無効化してください。」と表示されたら、crontabから spam-batch-delete.sh の行を削除してください。
11. ISO-2022-JP メール文字化け対応
古いメールクライアントから送信されたISO-2022-JP(JIS)エンコードのメールはAlfrescoがUTF-8として処理するため文字化けします。spamc-wrapper.sh でAlfrescoへ配送前にUTF-8へ変換することで対処します。
11-1. ISO-2022-JP(JISエンコード)メールの文字化け対応
古いメールクライアントから送信されたISO-2022-JPエンコードのメールはAlfrescoがUTF-8として処理するため文字化けします。spamc-wrapper.sh でAlfrescoへ配送前にUTF-8へ変換することで対処します。
charset=iso-2022-jp または本文に \x1b$B(JISエスケープ)を含みます。//IGNORE オプションで不正バイトを無視して変換することで、変換失敗を防止します。
第6章の spamc-wrapper.sh にISO-2022-JP変換処理が含まれています(Alfrescoへの配送直前に自動変換)。変換ログは /tmp/spamc-wrapper.log に CONVERTED(iso2022jp->utf8) として記録されます。
11-2. 既存ISO-2022-JPファイルの一括変換
サーバー移行前に蓄積済みのISO-2022-JPメールを一括変換するスクリプトです。REST API経由でコンテンツをダウンロード・変換・アップロードします。
| 項目 | 内容 |
|---|---|
| 対象 | mail配下のtext/plainファイル(約95,000件) |
| 処理時間 | 約3〜4時間(ISO-2022-JPは全体の約26%) |
| 中断・再開 | ログの進捗を確認してSKIP_COUNTを変更して再実行 |
| 実行推奨時間 | 業務時間外(screenコマンドで実行) |
| バージョン記録 | majorVersion=falseのためマイナーバージョンとして記録 |
sudo -u postgres pg_dump alfresco > /tmp/alfresco_backup_$(date +%Y%m%d).sql
12. トラブルシューティング
移動したフォルダが再移動できない(SHARED ACL問題)
- 原因:フォルダルールで
document.move()を実行後、ノードのACLがSHARED(type=2)状態になる - 症状:Share UIで「移動できませんでした」、REST APIで
setFixedAcls: unexpected shared aclエラー - 新規メール:修正版
mailSort.jsのsetInheritsPermissions(true)で防止済み - 既存ノード(数件):ゴミ箱経由での復旧が安全(下記参照)
http://サーバーIP:8080/share/page/user/admin/user-trashcan にアクセス → (3) [復元] をクリック → (4) 復元されたフォルダを目的のフォルダへ移動
添付ファイルのMIMEタイプ誤設定
- 原因:メール取り込み時に添付ファイルのMIMEタイプが
text/htmlに誤設定される - 新規メール:修正版
mailRename.jsで自動的に正しいMIMEタイプが設定される - 既存ファイル:
fixMime.jsをData Dictionary/Scriptsに登録してREST API経由で実行
メールループ(too many hops)
content_filter = spamassassin を設定するとメールループが発生します。必ずコメントアウトしてください。
振り分けアドレス上限超過
- 症状:
IntegrityException: String length is not in range [0; 50,000]が大量ループしサーバーの応答が低下する - 対処:対象フォルダの
cs:addressを REST API で null にクリアし必要なアドレスのみ再登録する
cronが動かない(認証エラー)
- 原因:
/etc/alfresco/credentialsのパーミッションがroot:root 600のままでcron実行ユーザーが読めない - 対処:
sudo chown root:実行ユーザー名 /etc/alfresco/credentials && sudo chmod 640 /etc/alfresco/credentials
cronが動かない(ログファイルへの書き込みエラー)
- 原因:
/var/log/spam-batch-delete.logのオーナーがroot:rootでcron実行ユーザーが書き込めない - 対処:
sudo chown 実行ユーザー名:実行ユーザー名 /var/log/spam-batch-delete.log
ログ確認コマンド
設定確認チェックリスト
- postfix の
content_filterがコメントアウトされている - spamc-wrapper.sh に実行権限がある(chmod +x)
- getmailrc の destination が spamc-wrapper.sh を参照している
- SpamAssassin(spamd)が起動している
- /etc/default/spamd の OPTIONS に --siteconfigpath が設定されている
- 振り分けフォルダに cs:maillist アスペクトが適用されている
- /etc/alfresco/credentials のパーミッションが root:実行ユーザー 640 になっている
- /var/log/spam-batch-delete.log のオーナーが実行ユーザーになっている
- alfresco-global.properties の alfresco.host にサーバーIPが設定されている
- spamc-wrapper.sh にISO-2022-JP → UTF-8変換処理が含まれている