Сохранение электронной почты в формате HTML со встроенными изображениями в PS или PDF с помощью Procmail

Мне нужен небольшой совет / толчок в правильном направлении.

Я написал несколько небольших скриптов, которые принимают входящее электронное письмо в формате HTML, преобразуют его в PostScript и затем отправляют на указанный принтер через CUPS. Принтеры основаны на получателе электронной почты.

Я использую следующее для достижения этой цели;

  1. Эксим
  2. Procmail
  3. HTML2PS
  4. Два пользовательских скрипта (опубликовано ниже)

Поток

  1. Электронная почта получена Exim и передана Procmail
  2. .procmailrc вызывает пользовательский скрипт «process_mail», передавая тему и содержимое в качестве параметров.
  3. «process_mail» загружает содержимое в функцию и вызывает «get_html_from_message» (с темой пока ничего не делаю)
  4. «get_html_from_message» выводит все, кроме HTML
  5. Затем HTML преобразуется в PostScript.
  6. Файл PostScript отправляется на указанный принтер.

Проблемы

  1. На этапе HTML2PS генерируется ошибка, и обратно отправителю отправляется отчет о недоставке о том, что при открытии изображений произошла ошибка. Ошибка при открытии cid:logo.jpg
  2. Файл PostScript успешно распечатан, но явно не содержит изображений из электронного письма.

Мой вопрос: как мне получить эти изображения из электронной почты, чтобы они были успешно распечатаны в файле PostScript?

Я более чем счастлив преобразовать в PDF, если PostScript не подходит, но даже преобразование в PDF оставляет меня без изображений, потому что я не могу их получить.

.procmailrc

SHELL=/bin/bash

# Extract the subject and normalise
SUBJECT=`formail -x"Subject: "\
| /usr/bin/tr '[:space:][:cntrl:][:punct:]' '_' | expand | sed -e     's/^[_]*//' -e 's/[_]*$//'`
YMD=`date +%Y%m%d`

MAKE_SURE_DIRS_EXIST=`
mkdir -p received_mail/backup
if [ ! -z ${SUBJECT} ]
then
    mkdir -p received_mail/${YMD}/${SUBJECT}
else
    mkdir -p received_mail/${YMD}/no_subject
fi
`

# Backup all received mail into the backup directory appending to a file named by date
:0c
received_mail/backup/${YMD}.m

# If no subject, just store the mail
:0c
* SUBJECT ?? ^^^^
received_mail/${YMD}/no_subject/.

# Else there is a subject, generate a unique filemane, place the received email 
# in that file and then execute process_mail passing the filename and subject as parameters
:0Eb
| f=`uuidgen`; export f; cat > received_mail/${YMD}/${SUBJECT}/${f};     $HOME/bin/process_mail received_mail/${YMD}/${SUBJECT}/${f} "${SUBJECT}"

# and don't deliver to standard mail, don't want to clutter up the inbox. 
:0
/dev/null

process_mail

#/bin/bash

# Test Printer
printer=$(whoami)

file=$1
subject=$2

function process_rrs {
typeset file
file=$1
cat $file \
| $HOME/bin/get_html_from_message \
| html2ps \
| lp -d ${printer} -o media=a4 2>&1
}

case "$subject" in
*)
    process_rrs $file
    ;;
esac

get_html_from_message

cat | awk '
BEGIN {
typeout=0
}
{
if($0 ~ /<html/)
    typeout=1
if($0 ~ /^------=/)
    typeout=0
if(typeout)
    print $0
}'

РЕДАКТИРОВАТЬ: форматирование


person Soddengecko    schedule 31.05.2016    source источник
comment
Вы бесполезно используете cat   -  person tripleee    schedule 31.05.2016
comment
export f кажется лишним. Экспорт делает переменную видимой для подпроцессов; но здесь, похоже, ни один подпроцесс не использует эту переменную.   -  person tripleee    schedule 31.05.2016
comment
Спасибо. Я посмотрю на это утром. Всегда учусь :)   -  person Soddengecko    schedule 31.05.2016


Ответы (2)


Я понял, как этого добиться. Подробности ниже. Все это работает на двух компьютерах CentOS 6 с балансировкой нагрузки.

Приложения

  1. Эксим
  2. КУБКИ
  3. Mhonarc (нет в репозитории. RPM и веб-сайт здесь https://www.mhonarc.org/)
  4. Procmail
  5. HTML2ps

Как это работает

  1. Электронное письмо отправляется на учетную запись пользователя, которая существует в обоих ящиках.
  2. Exim направляет электронную почту в Procmail
  3. Procmail ищет .procmailrc в домашнем каталоге пользователя и предпринимает действия.
  4. Mhonarc преобразует электронное письмо в файл HTML, сохраняя изображения и вложения.
  5. Используя «sed», откройте файл HTML и найдите начало письма () и соберите весь текст до конца файла.
  6. Снова подключите «sed», чтобы удалить лишние теги HTML (теги hr), добавленные Mhonarc.
  7. Конвейер в Html2ps для преобразования в PostScript
  8. Передача на указанный принтер (принтеры называются так же, как учетная запись пользователя)

Используя описанный выше процесс, я смог сократить его до одного скрипта, .procmailrc. Это то, что я написал в файле .procmailrc.

SHELL=/bin/bash

# Designate the printer. Printer names match usernames so you don't have to manually change 60+ files. 
printer=`whoami`

# Generate a unique ID
f=`uuidgen`

# Convert email, including headers and body into a HTML file and save off the images using MHONARC https://www.mhonarc.org/
# Open file and search <!--X-Body-of-Message--> string using SED and collect all text to EOF.
# Pipe the result into SED again to remove unwanted HTML tags added by MHONARC
# Pipe result into HTML2PS to convert to PostScript
# Pipe PostScript file to the designated printer
:0E
| mhonarc -single > ${f}.html; sed -n '/^<!--X-Body-of-Message-->$/ { s///; :a; n; p; ba; }' ${f}.html | sed -e '/<hr>/d' | html2ps | lp -d ${printer} -o media=a4 2>&1

# Finally, delete the email
:0
/dev/null

Я не очень хорошо знаю "sed", и вполне может быть более простой способ добиться этого. Я буду исследовать дальше в какой-то момент.

Надеюсь, это поможет кому-то :)

person Soddengecko    schedule 03.06.2016
comment
Спасибо, что поделился ! Monharc сохранит изображения, если они прикреплены, но не если они связаны (т. е. загружены с сервера). У вас есть идея, как заставить ваш рабочий процесс работать в этой ситуации? Monharc не будет конвертировать .eml, содержащий правильно связанные изображения… - person Clément; 21.11.2017

Проблема, вероятно, заключается в неполном понимании того, как HTML представлен в электронной почте. Обычно это составная часть MIME с одной HTML-частью и несколькими изображениями. HTML использует схему адресации cid: в ссылках на изображения для ссылки на эти родственные части. Но если вы извлечете только HTML, он больше не будет существовать в контексте, где у него есть братья и сестры. (Даже если вы извлекаете все части в файлы, cid: обычно не сопоставляется с локальным файлом. Возможно, вы могли бы выполнить постобработку HTML, чтобы исправить это, но я думаю, что ваш подход следует переосмыслить. Рассматривали ли вы возможность использования почтового клиент со встроенной поддержкой HTML для рендеринга этих сообщений?)

Простой скрипт xmlstarlet или аналогичный для удаления префикса cid: из атрибута src любой ссылки img не должен быть сложным, но, вероятно, есть дополнительные вещи, которые вам нужно сделать, если вы попытаетесь использовать этот путь.

person tripleee    schedule 31.05.2016
comment
Привет. Спасибо за информацию. Эта система находится на безголовой машине CentOS. Электронные письма приходят из облачного сервиса, который отправляет билеты, мы будем иметь дело с сотнями, возможно, тысячами в день, поэтому ручная печать не сработает. Изначально изображения не требовались, поэтому так и написано, но увы, теперь они хотят изображения. Мне не нужно использовать эти скрипты, я всегда могу написать что-то еще. Вы знаете какой-нибудь способ, которым это можно сделать? Спасибо за ваше понимание MIME, мне не хватает знаний в этой области. - person Soddengecko; 31.05.2016
comment
Я смутно подумал, что вы, возможно, сможете запустить Thunderbird без головы; но у меня нет опыта с этим, и, вероятно, это несколько сложно для сценария. - person tripleee; 31.05.2016
comment
Интересно. рассмотрю как вариант - person Soddengecko; 31.05.2016