Назад | Перейти на главную страницу

Чтение почты из Postfix с помощью сценария оболочки

Я хотел бы иметь возможность читать входящую почту от Postfix MTA с помощью сценария оболочки. Сценарий оболочки должен иметь возможность извлекать заголовки, тему, текст, вложения и т. Д., А затем отмечать письмо как прочитанное. Сообщения хранятся в формате Maildir /. Когда сообщение читается в Postfix, оно перемещается из папки Maildir / new в папку Maildir / cur, которую полезно сохранить в качестве резервной копии на случай, если сообщение потребуется повторно обработать.

Я много гуглил, но не нашел ничего полезного, много примеров того, как отправлять почту, но ничего полезного для чтения почты через скрипт. Кажется, что команда mail / mailx разрешает только интерактивный доступ, нет возможности использовать ее через сценарий оболочки. Это должно работать только для одного пользователя, поскольку я использую конфигурацию перехвата для перехвата всей входящей почты в один почтовый ящик для последующей обработки скриптом.

Всегда есть возможность опросить папку Maildir / new для входящих сообщений с помощью cronjob или incron, но мне было бы неплохо использовать возможности управления почтой Postfix, а не вручную управлять файлами msg. Мой сценарий будет локальным для сервера Postfix.

Есть предложения / идеи? Спасибо.

Изменить: Возможно, мне следует упомянуть, что я не ищу помощи со сценарием. Я ищу инструмент командной строки, который может получить доступ к хранилищу Postfix Maildir / msg и читать / делать что-то с msgs и может быть вызван неинтерактивным способом. Другими словами, базовая функциональность почтового инструмента, но не интерактивная.

Я обнаружил следующее:

http://notes-cs.blogspot.in/2013/04/use-command-line-to-read-linux-local.html

Этот человек точно описывает то, что я искал. Чистый гений! Чтобы уловить суть (все ниже приведено по ссылке выше):

Распечатать всю электронную почту в STDOUT:

$ echo "type *" | mail

$ echo "type 1" | mail   # print the first email to stdout

$ echo "type 3-5" | mail # print the emails from 3 to 5

Убедитесь, что почтовый ящик пуст (т.е. "Нет почты для [имя пользователя]"):

$ echo q | mail 2>&1 | grep "No mail for [username]"

Очистите почтовый ящик:

$ echo "d *" | mail

$ echo "d 3" | mail     # Delete the 3rd email

Сохраните все электронные письма в текстовом файле:

$ echo "s * test.txt" | mail

Сохраняйте электронные письма между диапазоном в файле:

$ echo "s 3-6 test.txt" | mail # this will save email from #3 to #6 to the file test.txt

Прочтите одно письмо из почтового ящика:

$ echo 1 | mail # Read the first mail from mail box:

$ echo 5 | mail # Read the 5th email from mail box: 

$ echo 6 | mail

Если нет 6-го мейла из почтового ящика. Это подскажет вам ошибку ниже:

6: Invalid message number

Сообщение об ошибке «Неверный номер сообщения» сообщает вам, что в почтовом ящике нет шестого электронного письма. Если 5-е электронное письмо успешно возвращено. Вы можете рассматривать сообщение об ошибке «Недопустимый номер сообщения» как конец почтового ящика, как и EOF файла. В сочетании с циклом вы можете просматривать все электронные письма в почтовом ящике.

Твоего Google Fu не хватает.

Одно простое решение - стиль sendmail ~/.forward файл, в котором вы трубите | сообщение прямо в ваш сценарий, еще до того, как оно будет записано в ваш почтовый ящик. Затем ваш скрипт делает свое дело и после этого записывает почтовое сообщение на диск.

Точно так же, но вы получаете немного больше гибкости, когда настроить procmail в качестве агента по доставке почты и настроить ~/.procmailrc для пересылки сообщений в ваш скрипт.

Альтернативой является установка демона IMAP или POP3 и использование fetchmail чтобы опрашивать ваш почтовый ящик, читать любые новые сообщения и передавать их вашему сценарию.