Инструкция
От root
устанавливаем нужный софт:
apt install fetchmail procmail uudeview
Переключаемся в пользователя totum
:
su totum
Создаем файл конфигурации fetchmailrc
:
nano ~/.fetchmailrc
poll imap.host.com protocol IMAP port 993
user "email@host.com" password "some_pass_here" is "totum" here
mda "/usr/bin/procmail"
ssl
Порт и параметры настроек смотрите у вашего IMAP-сервера. Если у него нет SSL, то спросите у GPT как его настраивать.
Устанавливаем права на fetchmailrc
:
chmod 700 ~/.fetchmailrc
Создаем конфиг procmail
:
nano ~/.procmailrc
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/mbox
LOGFILE=$MAILDIR/procmail.log
:0
* ^From.*
| $MAILDIR/extract.sh
Устанавливаем права на procmailrc
:
chmod 600 ~/.procmailrc
Создаем папку Mail
и внутри data
:
mkdir -p ~/Mail/data && cd ~/Mail
Письма будут лежать в data
!
Создаем скрипт обработки писем (ближе к конце найдите MY_KEY
и замените на рандомный набор символов и сохраните его, а также замените YOUR_HOST
на хост вашего totum или на ip
и если на ip
то и протокол измените с https
на http
):
nano extract.sh
#!/bin/bash
EMAIL=$(cat)
DATE=`date +%s`
RANDOM_NUM=$(echo "$RANDOM" | head -c 3)
UNIQ_NAME="email_${DATE}_${RANDOM_NUM}"
DIR="$HOME/Mail/data/$UNIQ_NAME"
JSON="$DIR/$UNIQ_NAME.json"
mkdir -p $DIR
echo "$EMAIL" > "$HOME/Mail/data/$UNIQ_NAME.mail"
echo "$EMAIL" | uudeview -i +a +o -t -p $DIR -
decode_and_concatenate() {
local input_string="$1"
local result=""
for part in $input_string; do
decoded_part=$(echo $part | awk -F '[?]' '{print $4}' | openssl enc -base64 -d -A)
result+="$decoded_part"
done
echo "$result"
}
FROM=$(echo "$EMAIL" | formail -c -x From: | awk -F'[<>]' '{print $2}')
FROM_NAME=$(echo "$EMAIL" | formail -c -x From: | awk -F'<|>' '{print $1}' | sed 's/^[ \t]*//;s/[ \t]*$//' | while read -r name_line; do
if [[ $name_line == =?* ]]; then
name_clear=$(echo "$name_line" | sed 's/ / /g')
decode_and_concatenate "$name_clear"
else
echo "$name_line"
fi
done | tr -d '\n' | base64 -w 0)
TO=$(echo "$EMAIL" | formail -x To: | sed 's/^[ \t]*//;s/[ \t]*$//;s/"//g' | sed 's/.*<\([^>]*\)>.*/\1/')
SUBJECT=$(echo "$EMAIL" | formail -c -x Subject | sed 's/^[ \t]*//;s/[ \t]*$//' | while read -r sub_line; do
if [[ $sub_line == =?* ]]; then
sub_clear=$(echo "$sub_line" | sed 's/ / /g')
decode_and_concatenate "$sub_clear"
else
echo "$sub_line"
fi
done | tr -d '\n' | base64 -w 0)
if [ -f "$DIR/UNKNOWN.001" ]; then
BODY=$(base64 -w 0 "$DIR/UNKNOWN.001")
else
if formail -c -x Content-Type: < "$DIR/0001.txt" | grep -qv "multipart"; then
BODY=$(formail -I "" < "$DIR/0001.txt" | base64 -w 0)
else
BODY=$(base64 -w 0 "$DIR/0001.txt")
fi
fi
FILES=()
for FILE_PATH in "$DIR"/*; do
FILE_NAME=$(basename "$FILE_PATH")
FILE_NAME_BASE=$(echo "$FILE_NAME" | tr -d '\n' | base64 -w 0)
if [[ ! "$FILE_NAME" =~ ^UNKNOWN\.[0-9]+$ ]] && [[ ! "$FILE_NAME" =~ ^000[0-9]+\.txt$ ]]; then
FILE_CONTENT=$(base64 -w 0 "$FILE_PATH")
FILES+=("{\"name\":\"$FILE_NAME_BASE\",\"filestringbase64\":\"$FILE_CONTENT\"}")
fi
done
FILES_JSON=$(printf ",%s" "${FILES[@]}")
FILES_JSON="[${FILES_JSON:1}]"
echo "{\"email_id\":\"$UNIQ_NAME\",\"from\":\"$FROM\",\"from_name\":\"$FROM_NAME\",\"to\":\"$TO\",\"subject\":\"$SUBJECT\",\"body\":\"$BODY\",\"files\":$FILES_JSON}" > $JSON
KEY="my_key"
curl -d @"$JSON" -H "Content-Type: application/json" -H "Authorization: $KEY" https://YOUR_HOST/Remotes/get_email
rm -r $DIR
Делаем скрипт исполняемым:
chmod +x extract.sh
Идем в Totum в ttm__remotes
и создаем ремоут get_email
(назначаете пользователя и добавляете код, заменив MY_KEY
на сохраненный ранее ключ):
=: if(condition: $#headers[Authorization][0] = "MY_KEY"; then: $insert)
insert: insert(table: 'email_table'; field: 'raw' = $#input; field: 'email_id' = $email_data[email_id]; field: 'email_data' = $email_data_decode; field: 'email_files' = $email_files_decode; log: true)
email_data_decode: rowAdd(row: $email_data; field: "from_name" = $from_name_decode; field: "subject" = $subject_decode; field: "body" = $body_decode)
from_name_decode: strBaseDecode(str: $email_data[from_name])
subject_decode: strBaseDecode(str: $email_data[subject])
body_decode: strBaseDecode(str: $email_data[body])
~email_data: rowKeysRemove(row: $extract; key: "files")
email_files_decode: listReplace(list: $extract[files]; action: "name" = $name; value: "value")
name: strBaseDecode(str: $#value[name])
~extract: jsonExtract(text: $#input)
Создаем таблицу в Totum c name=email_table
и добавляем поля:
email_id
— {строка}raw
— {строка}email_data
— {данные}email_files
— {файл} + [множественный] + [хеши на конце файла] или [защищенный файл]Таблице ставим [pagination] и по желанию [обратный порядок]
Проверяете сначала из консоли сервера:
fetchmail
Лог записывается в:
tail -100 ~/Mail/procmail.log
Добавляем крон (можно из системы или из totum). Если из totum, то должен быть включен execSSH! Период проверки выбираете по желанию.
Из Тотум в кроны добавляем проверку и очистку технической папки от писем старше 3 дней и ротирование лога:
= : execSSH(ssh: "fetchmail -s && find ~/Mail/data/ -type f -mtime +3 -exec rm {} \;) && tail -n 1000 ~/Mail/procmail.log > ~/Mail/procmail.log.tmp && mv ~/Mail/procmail.log.tmp ~/Mail/procmail.log
Включение execSSH (только в PRO, как и поля типа Файл):
nano /home/totum/totum-mit/Conf.php
Ctrl
+ W
набираем 'inner'
, enter
и заменяем 'inner'
на true
(true
без кавычек!)
ИЛИ! Из системы от пользователя totum:
su totum
crontab -e
* * * * * fetchmail -s && find ~/Mail/data/ -type f -mtime +3 -exec rm {} \; && tail -n 1000 ~/Mail/procmail.log > ~/Mail/procmail.log.tmp && mv ~/Mail/procmail.log.tmp ~/Mail/procmail.log
Помните, что последняя строка
crontab
всегда должна оставаться пустой
Не рекомендуется подключаться к основному email, который находится на входе от внешнего мира. Используйте правила сортировки и пересылки на вашем email-сервере и пересылайте проходящие по условиям письма на технических email. И с него уже забирайте данные в базу!