⟵ сюдатуда ⟶
  • Мастерклассы
  • Внешние подключения
  • Отправляем сообщение в Slack через n8n.io
  • Создаем и подключаем Telegram бота
  • Подключаемся к Yandex-переводчику
  • Получаем email по IMAP в Totum
  • Устанавливаем Mailcow как SMTP-сервер для Totum
  • Tableau и PowerBI
  • amoCRM
  • Битрикс 24
  • База знаний
  • Получаем email по IMAP в Totum

    Инструкция

    От 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. И с него уже забирайте данные в базу!