2021年8月9日月曜日

alfresco メール設定③ share上でルールを設定 視認性を高めます。

メールをそのまま取り込むと、本文と添付ファイルがバラバラに取り込まれるため、視認性が良くありません。一メール毎にフォルダにまとめて参照しやすくします。 

複数のスクリプトを組み合わせて実現します。

  1. メール件名を修正…rename.js
  2. メールをまとめるフォルダを作成…create.js
  3. メールをフォルダへ移動する…move.js
  4. 仕分けを行う…sort.js
  5. 未登録のメールアドレスを手動で振り分け時に登録…sortAdd.js

1~4をメール格納フォルダのルールに設定 5を振分先のフォルダそれぞれにルールとして設定

①メール件名を修正

以下のスクリプトを作成し、「リポジトリ> Data Dictionary> Scripts」へ登録
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ファイル名に送信日時を追加し、URLエンコード記号を半角スペースに置換

/* javascriptで処理した場合、同名のファイルがあるとエラーとなります。
送信日時+作成日時の秒1桁を追加して、同名のメールを取得できるようにします。
あわせて、名前に使用できない記号["*<>:?/|]が含まれている場合URLエンコードされるため、 全角に置換します。*/

//                              2021.8.25
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 送信日時・作成日時を取得
var mailDate = document.properties['cm:sentdate'];
var creatDate = document.properties['cm:created'];
// プロパティに送信日時の情報をもち、コンテンツである場合
if (mailDate != null && document.isDocument){

//=======以下日時を文字列に変換 年を2桁で処理 型特定のため、year_strに0を追加======
/* 送信日時のみでは、自動返送メールを複数に分けて発信された場合、同一日時となることがあるため、作成日時の秒1桁を最後に追加 */  
var year_str = mailDate.getFullYear();
//月だけ+1すること
var month_str = 1 + mailDate.getMonth();
var day_str = mailDate.getDate();
var hour_str = mailDate.getHours();
var minute_str = mailDate.getMinutes();
var second_str = mailDate.getSeconds();
// 作成日時より秒のみ取得
var Csecond_str = creatDate.getSeconds();

year_str = ('0' + year_str).slice(-2);
month_str = ('0' + month_str).slice(-2);
day_str = ('0' + day_str).slice(-2);
hour_str = ('0' + hour_str).slice(-2);
minute_str = ('0' + minute_str).slice(-2);
second_str = ('0' + second_str).slice(-2);
Csecond_str = ('0' + Csecond_str).slice(-1);

format_str = 'YYMMDDhhmmssz';
format_str = format_str.replace(/YY/g, year_str);
format_str = format_str.replace(/MM/g, month_str);
format_str = format_str.replace(/DD/g, day_str);
format_str = format_str.replace(/hh/g, hour_str);
format_str = format_str.replace(/mm/g, minute_str);
format_str = format_str.replace(/ss/g, second_str);
format_str = format_str.replace(/z/g, Csecond_str);
// ========ここまで=========

// 文字列変換後の日時に_を追加し取得
var stringDate = format_str + '_';
}else{
// プロパティに送信日時情報がないか、フォルダの場合、空白
var stringDate = '';
}

// ========HTMLメールの場合、タイプを変更=========
// 本文を取得
var mailContent = document.content;
// タグが5回以上出現した場合、html文書と判断
if ((mailContent.match(/(<([^>]+)>)/gi) || []).length > 5){
// mimeタイプをHTMLに変更
document.mimetype = 'text/html';
}
// ========ここまで=========

// ファイル名を取得
var fullName = document.properties[ 'cm:name' ];
// 特定の記号がURLエンコードされるため、全角に置換
var replaced = fullName.replace(/%3a/g, ':').replace(/%2f/g, '/').replace(/%3f/g, '?').replace(/%7c/g, '|').replace(/%22/g, '” ').replace(/%2a/g, '*').replace(/%3c/g, '<').replace(/%3e/g, '>');
// 送信日時+置換後ファイル名を取得
document.properties[ 'cm:name' ] = stringDate + replaced;
// 確定
document.save();

②メールをフォルダにまとめる 

任意のフォルダ(メール送信先フォルダも可・今回は「mail」フォルダ)のアスペクトのプロパティ(「説明」などのテキストタイプ)へメール一式を格納するフォルダのノードを保存します。添付ファイルの受信が終了し、次のメールを受信するまで、保存したノードへメール一式を格納します。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// メールフォルダ作成

/*メール本体と添付ファイルをフォルダにまとめます。*/
// 2021.7.31
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// メール格納フォルダのノードを取得
var parentNode = companyhome.childByNamePath('Shared/mail');
// 送信者を取得
var mailFrom = document.properties['cm:originator'];
// 送信者が空白でない=メール本体を判定
if (mailFrom != null)
{
// 拡張子を含むファイル名を取得
var fullName = document.properties[ 'cm:name' ];
// ファイル名と拡張子を分割
var fNameArray = fullName.split('.');
// ファイル名のみ取得
var fileName = fNameArray[0];
// ファイルのパスを取得
var titleFolder = space.childByNamePath(fileName);
// 無限ループを避けるため、一度だけフォルダを作成する条件
// 拡張子がない場合、フォルダが作成済と判定されるため、ドキュメント判定との論理和
if (fullName.indexOf('.') == -1 && titleFolder.isDocument || titleFolder == null && space.hasPermission('CreateChildren'))
{
// フォルダ名と同一の場合エラーとなるため、フォルダ名に任意の記号(ex.★)を追加
// 特殊な記号は入力は可能だが、フォルダを開く際にエラーとなるため、一般的な記号を選択
titleFolder = space.createFolder('★' + fileName);
// ========フォルダの説明に本文1~2行目を追加=========
// 本文を取得
var mailContent = document.content;
// 本文をテキスト型に指定
var mailContent = new String(mailContent);
// 改行を空白に置換し、記号(長音・句読点・括弧・○数字等を除く)を削除
var mailContent = mailContent.replace(/\r?\n/g,' ').replace(/[^0-9A-Za-z\u2460-\u2473\u3001-\u3012\u3041-\u3096\u30A1-\u30FF\u3005-\u3006\u4e00-\u9ff f\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF61-\uFF9F]/g, '');
// 一行で収まるよう、60文字でスライス
titleFolder.properties[ 'cm:description' ] = mailContent.slice(0,60);
titleFolder.save();
// フォルダに送信日時と送信者のアスペクトを追加
props = new Array(2);
props['cm:sentdate'] = document.properties['cm:sentdate'];
props['cm:originator'] = mailFrom;
titleFolder.addAspect('cm:emailed', props);
// フォルダに発行日のアスペクトを追加し、送信日時を挿入(発行日を標準の並びかえにしているため)
CSprops = new Array(1);
CSprops['cs:publishdate'] = document.properties['cm:sentdate'];
titleFolder.addAspect('cs:published', CSprops);
}
// 一時フォルダのタイトルにまとめフォルダのノードをテキスト保存
parentNode.properties[ 'cs:address' ] = titleFolder;
parentNode.save();
}

③メール(本文+添付ファイル)を②で作成したフォルダへ移動します。

以下のスクリプトを作成し登録。このスクリプトのみバックグラウンドで実行にチェック 

///////////////////////////////////////////////////////////////////////////
// メールをフォルダに移動
/* alfrescoでのmove APIの実行はバックグラウンドで行う必要があります。
しかし、プロパティの取得は、バックグラウンドの場合、nameに限られます。
よって、別スクリプトに分離します。*/
// 2021.8.27
///////////////////////////////////////////////////////////////////////////

// メール格納フォルダのノードを取得
var parentNode = companyhome.childByNamePath('Shared/mail');
// 一時フォルダのアスペクトのプロパティから格納するフォルダのノードの文字列を取得
var nodeString = parentNode.properties[ 'cs:address' ];
// ノードの文字列をノードに変換
var convNode = search.findNode(nodeString);

// 添付ファイルに発行日のアスペクトを追加し、送信者・送信日時を挿入(発行日を標準の並びかえにしているため)
props = new Array(2);
props['cs:publishdate'] = convNode.properties[ 'cm:sentdate' ];
props['cs:publisher'] = convNode.properties[ 'cm:originator' ];
document.addAspect('cs:published', props);


// 格納するフォルダへ移動
document.move(convNode);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// メールを振り分ける
//                                                                      2021.8.2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 振り分け先で指定したアドレスを取得する関数
function getAdd(sortFolder){
//振り分け先を取得 関数外でも使用するため、グローバル化
dest = document.parent.childByNamePath(sortFolder);
//あらかじめ追加したアスペクトのプロパティより取得
var adList = dest.properties['cs:address'];
//置換前にテキスト型を宣言
var adList = new String(adList);
//改行コードをビット論理和に置換
var regexp = adList.replace(/\r?\n/g,'|');
//コンストラクター化
var regexp = new RegExp(regexp);
return regexp
}
// 送信者情報を取得
var mailFrom = document.properties['cm:originator'];
// 送信者情報がないものを除外 そのまま通すとエラー
if (mailFrom != null) {
if (getAdd('フォルダA').test(mailFrom)) {
document.move(dest);
}else if (getAdd('フォルダB').test(mailFrom)) {
document.move(dest);
}else if (getAdd('フォルダC').test(mailFrom)) {
document.move(dest);
}
else if (getAdd('フォルダD').test(mailFrom)) {
document.move(dest);
}
else if (getAdd('フォルダE').test(mailFrom)) {
document.move(dest);
}
else if (getAdd('フォルダF').test(mailFrom)) {
document.move(dest);
}
else if (getAdd('フォルダG).test(mailFrom)) {
document.move(dest);
}
else if (getAdd('フォルダH').test(mailFrom)) {
document.move(dest);
}
else if (getAdd('フォルダI').test(mailFrom)) {
document.move(dest);
}
}

⑤手動で振分時にアドレスを登録

以下のスクリプトを各振分フォルダのルールに登録
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// メール振り分け登録
/*未登録の振り分け先を手動で移動時に追加*/
// 2021.8.10
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//作成日を取得
var created = document.properties['cm:created'];
//変更日を取得
var modified = document.properties['cm:modified'];
//作成日と変更日が異なる=メール取得時ではない場合スクリプトを続行
if (created != modified) {
//親フォルダのノードを取得
var parentNode= document.parent;
//振り分け先よりアスペクトのプロパティを取得
var adList = parentNode.properties['cs:address'];
//置換前にテキスト型を宣言
var adList = new String(adList);
//改行コードをビット論理和に置換
var regexp = adList.replace(/\r?\n/g,'|');
//コンストラクター化
var regexp = new RegExp(regexp);
// 送信者情報を取得
var mailFrom = document.properties['cm:originator'];
// アドレスリストに送信先のアドレスが含まれていない 送信先アドレスがnullでない
if (regexp.test(mailFrom) || mailFrom != null) {
;
}else{
// アドレスリストに改行コードを付加して送信先アドレスを追加
parentNode.properties['cs:address'] = adList + '\n' + mailFrom;
parentNode.save();
}
}

alfresco メール設定②-3 メール配送設定(postfix+getmail)

getmailで取得したメールをpostfixを経由して、alfrescoに配送します。

1.postfixをインストール・設定

有料版はsmtpの制御ができますが、community版はできません。送信先フォルダにスクリプトが設定された状態でそのまま配送すると、alfresco側で処理しきれず、配送エラーや0byte配送を起こします。そのため、postfixに遅延処理の設定を追加します

centos8 stream では標準でインストールされないため、インストール

main.cfを変更

sudo vi /etc/postfix/main.cf
myhostname = ☆☆☆.xxx.com
mydomain = xxx.com
inet_interfaces = localhost
relayhost = [xxx.com]:1025
#----- 以下 最後尾に記載 --------
# メールの最大サイズを変更
message_size_limit = 40960000

# 全てのメールに対して、1通送る事に○秒のsleep
smtp_destination_rate_delay = 5s
sudo systemctl start postfix.service
sudo systemctl enable postfix.service

2.メールサーバからメールを自動受信するためgetmailをインストール

①getmailをダウンロード・インストール

curl -LO http://pyropus.ca/software/getmail/old-versions/getmail-5.15.tar.gz
tar xzf getmail-5.15.tar.gz
cd getmail-5.15
sudo python2 setup.py install
cd ..
mkdir -m 0700 .getmail
cp /usr/share/doc/getmail-5.15/getmailrc-examples .getmail/getmailrc
sudo vi .getmail/getmailrc

②getmailの設定

[options]
# verbose = 0 # 詳細表示なし
# delete = true # POPしたメールはサーバから削除する
# message_log = ~/.getmail/log # ログを保存する場合は以下2行をコメントアウト
# message_log_verbose = true
# サーバーから全てのメールを取得するのを止める
read_all = false
# 一度に取得するメール数を制限(環境により、数を調整)
max_messages_per_session = 10

[retriever]
# POP3で受信する場合(有効)
#type = SimplePOP3Retriever

# POP3 over SSLで受信する場合
type = SimplePOP3SSLRetriever
# メールサーバ
server = xxxx.ne.jp #取得するメールサーバを指定
# ユーザ名
username = xxx@xxxx.ne.jp #ユーザー名を指定
# パスワード
password = xxxxxxxxx    #パスワードを指定

[destination]
type = MDA_external     #MDAと連携する
path = /usr/sbin/sendmail
# 配送先のアドレスを設定 arguments = ("-f", "%(sender)", "-i", "-bm", "mail@xxxx.com")

getmailはデーモンで動作しないため、crontabで定期実行 ex.5分毎

cron設定は、全ての設定が完了後実行します。

crontab -e
# 標準エラーの出力を無効可しないと配送エラーとなるため /dev/null 2>&1を追加
*/5 * * * * /usr/bin/getmail > /dev/null 2>&1

2021年8月8日日曜日

alfresco メール設定②-2 メール配送設定(postfix+getmail+maildrop)

メール取り込みに特化したgetmailを使用します。内部に取り込みメールの番号(UID)を記録するため、取り込み漏れが発生しにくいと考えています。サーバー上で振り分ける場合、getmailでも可能ですが、複雑な場合分けは記載が難しく、maildropと組み合わせて使用します。 設定順は以下の通りです。
  1. ①MTA設定
  2. ②メール取得
  3. ③MDA設定

1.postfixをインストール・設定

有料版はsmtpの制御ができますが、community版はできません。送信先フォルダにスクリプトが設定された状態でそのまま配送すると、alfresco側で処理しきれず、配送エラーや0byte配送を起こします。そのため、postfixに遅延処理の設定を追加します

centos8 stream では標準でインストールされないため、インストール

main.cfを変更

sudo vi /etc/postfix/main.cf
myhostname = ☆☆☆.xxx.com
mydomain = xxx.com
inet_interfaces = localhost
relayhost = [xxx.com]:1025
#----- 以下 最後尾に記載 --------
# メールの最大サイズを変更
message_size_limit = 40960000

# 配送失敗時に時間をおいて繰り返す処理
queue_run_delay = 300s
minimal_backoff_time = 300s
maximal_backoff_time=1200s
maximal_queue_lifetime=1800s
bounce_queue_lifetime=1800s

# 全てのメールに対して、1通送る事に○秒のsleep
smtp_destination_rate_delay = 5s
sudo systemctl start postfix.service
sudo systemctl enable postfix.service

2.メールサーバからメールを自動受信するためgetmailをインストール

①getmailをダウンロード・インストール

curl -LO http://pyropus.ca/software/getmail/old-versions/getmail-5.15.tar.gz
tar xzf getmail-5.15.tar.gz
cd getmail-5.15
sudo python2 setup.py install
cd ..
mkdir -m 0700 .getmail
cp /usr/share/doc/getmail-5.15/getmailrc-examples .getmail/getmailrc
sudo vi .getmail/getmailrc

②getmailの設定

[options]
# verbose = 0 # 詳細表示なし
# delete = true # POPしたメールはサーバから削除する
# message_log = ~/.getmail/log # ログを保存する場合は以下2行をコメントアウト
# message_log_verbose = true
# サーバーから全てのメールを取得するのを止める
read_all = false
# 一度に取得するメール数を制限(環境により、数を調整)
max_messages_per_session = 10

[retriever]
# POP3で受信する場合(有効)
#type = SimplePOP3Retriever

# POP3 over SSLで受信する場合
type = SimplePOP3SSLRetriever
# メールサーバ
server = xxxx.ne.jp #取得するメールサーバを指定
# ユーザ名
username = xxx@xxxx.ne.jp #ユーザー名を指定
# パスワード
password = xxxxxxxxx    #パスワードを指定

[destination]
type = MDA_external     #MDAと連携する
path = /usr/bin/maildrop  #MDAとしてmaildropを使用

3.MDAとしてmaildropを追加

①maildropをダウンロード・インストール

sudo dnf install -y rpm-build
sudo curl -O https://sourceforge.net/projects/courier/files/maildrop/3.0.3/maildrop-3.0.3.tar.bz2
sudo curl -OL https://sourceforge.net/projects/courier/files/courier-unicode/2.2.3/courier-unicode-2.2.3.tar.bz2
sudo dnf install make gcc-c++ perl
rpmbuild -tb courier-unicode-2.2.3.tar.bz2
cd ..
sudo rpm -ivh RPMS/x86_64/courier-unicode-devel-2.2.3-1.el8.x86_64.rpm
cd ..
sudo curl -LO http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/libidn-devel-1.34-5.el8.x86_64.rpm
sudo rpm -ivh libidn-devel-1.34-5.el8.x86_64.rpm
cd ..
sudo dnf install gdbm-devel pcre-devel
rpmbuild -tb maildrop-3.0.3.tar.bz2
sudo rpm -ivh rpmbuild/RPMS/x86_64/maildrop-3.0.3-2.x86_64.rpm

②maildropの設定

sudo vi .mailfilter
alfresco上で仕分けするフォルダにそれぞれアライアスを設定し、直接送信するには、ここで場合分けを記述
if (/^From:.*@xxx.or.jp/ || /^From:.*@xxx.org/)
{
to "! ****@xxxx.com"
}
elsif (/^From:.*@xxx.ne.jp/)
{
to "! ????@xxxx.com"
}

alfresco メール設定②-1 メール配送設定(fetchmail)

メールを取り込むため、fetchmailを設定します。設定数が少なく簡便なため、テストに最適ですが、メール取り込みに失敗することがあり、採用はしませんでした。

 1.fetchmailの設定

vi .fetchmailrc
#poll pop.domain.com proto pop3
user 'user1' there with password 'secret' is user1 here
# 共通設定
set daemon 300 # 300秒間隔でメールチェックを行なう
# set postmaster xxxx # 最終的なメールの送信先
# set no bouncemail # エラーメールをpostmasterに送る
set syslog # ログを/var/log/maillogに記録する
# 全サーバー共通デフォルト設定
defaults
bad-header accept # ヘッダ異常のあるメールも取り込む
protocol auto
no mimedecode
no fetchall # 未読メールのみ取り込む場合
#fetchall # 既読・未読にかかわらず全てのメールを取り込む場合
#no keep # 取り込んだメールをサーバー上から削除する場合
keep # 取り込んだメールをサーバー上に残しておく場合
# プロバイダアカウント宛メール取り込み設定※POP3Sが提供されている場合
poll xxxx.xxxx.ne.jp # プロバイダ受信メールサーバー名
protocol pop3
port 995
username "xxxx@xxxx.ne.jp" # プロバイダユーザー名
password "********" # プロバイダパスワード
; ssl
#smtpname mail@xxxx.com
# 転送先ユーザー名
smtphost xxxx.com/1025
sudo chown user:user .fetchmailrc
chmod 600 .fetchmailrc

alfresco メール設定① alfresco側の設定

事前準備

取り込み予定のメールサーバーにalfrescoユーザーに設定したメールアドレスからのメールが含まれていると、「EMAIL_CONTRIBUTORSに設定されていない」と判定され、配送エラーとなり、postfixからバウンスエラーのメールが出されます。あらかじめalfrecoユーザーに設定したアドレスは、独自のものに変更しておく必要があります。

1.global-properties.sampleからメール関連を抜粋・追加

①バイナリフォルダからsampleファイルを開く

sudo vi /opt/alfresco/content-services-7.0.0/web-server/shared/classes/alfresco-global.properties.sample

②以下を抜粋

#
# Outbound Email Configuration
#-------------
#mail.host=
#mail.port=25
#mail.username=anonymous
#mail.password=
#mail.encoding=UTF-8
#mail.from.default=alfresco@alfresco.org
#mail.smtp.auth=false


#
# Alfresco Email Service and Email Server
#-------------

# Enable/Disable the inbound email service. The service could be used by processes other than
# the Email Server (e.g. direct RMI access) so this flag is independent of the Email Service.
#-------------
#email.inbound.enabled=true

# Email Server properties
#-------------
#email.server.enabled=true
#email.server.port=25
#email.server.domain=alfresco.com
#email.inbound.unknownUser=anonymous


# A comma separated list of email REGEX patterns of allowed senders.
# If there are any values in the list then all sender email addresses
# must match. For example:
# .*\@alfresco\.com, .*\@alfresco\.org
# Allow anyone:
#-------------
#email.server.allowed.senders=.*

③global.propertiesとして追加

sudo vi /etc/opt/alfresco/content-services/classpath/alfresco-global.properties

上記②のサンプルを以下に貼付、青字の部分を変更
 
### Begin - Custom user properties - ANSIBLE MANAGED BLOCK
# Add your properties here


# Enable/Disable the inbound email service. The service could be used by processes other than
# the Email Server (e.g. direct RMI access) so this flag is independent of the Email Service.
#-------------
email.inbound.enabled=true //メール受信を行う
# Email Server properties
#-------------
email.server.enabled=true //smtpサーバを起動する
email.server.port=1025 //受信ポートを指定 25だとpostfixなどのMTAと干渉するため変更
email.server.domain=xxxxxx.com //ドメインを指定
email.inbound.unknownUser=admin //受信ユーザーを指定 後の設定上上位権限をもつユーザーを指定
sudo systemctl restart alfresco-content.service

2.Shareの設定

①アスペクトの管理→Eメールエイリアスを追加
②プロパティの編集 Eメールエイリアスに送信先の名前を追加
 ex. mail@xxx.com


2021年8月1日日曜日

alfresco メール自動取り込み

 afrescoに他のメールサーバのメールを取得し、自動取り込みさせる設定のメモを記載します。

<概要>

メール取得エージェント(今回はgetmail)で定期的にメールを取得

MTA(今回はpostfix)でalfrescoに送信

alfrescoのSMTP機能で取得

alfrescoのフォルダルールで整形

<未解決の問題>

  • 本文がiso-2022-jpの場合、プレビューで文字化けが発生

      →「ブラウザで表示」で当面回避

  • 件名がmime encodeされていると、そのまま表示
      →手動で変換

<環境>

 OS windows server 2016 Hyper-V上のcentos8 stream

 alfreso Ver. 7.00 Ansibleで展開