понедельник, 4 января 2010 г.

Обработка email-сообщений

Полагаем, что qmail у нас уже установлен и настроен. Текущая задача заключается в том, чтобы автоматизировать обработку сообщений. Будем использовать пакеты mpack, mailtextbody (или mimedecode - если хотим получить сообщение целиком, со всеми хидерами, но декодированное, вот только жаль, что utf-8 не понимает), mess822 (последний доступен в моем репозитории). Что интересно, из найденных мною обработчиков email ни один даже близко не стоял рядом с утилитами DJB из пакета mess822. Собственно, в очередной раз убедился, что современные девелоперы способны испаскудить любую хорошую идею, понаписав мегабайты [глючного] кода - ни одного нормального email-клиента, состоящего, согласно идеологии unix, из набора простых утилит, в репозитории дебиана не нашлось. Ну и черт с ними, лучше разобраться и пропатчить mess822, нежели пользовать более "современные" поделия.

Отправка письма со вложением

$ mpack -s test ./sqlite3-rdiff veter@veter-laptop


Отправка письма без вложения

$ echo "Ветер, привет"|new-inject -fpechnikov@sandy.ru veter@veter-laptop


Просмотр текста сообщения без вложения

$ cat ~veter/Maildir/new/1262559828.26006.veter-laptop | mailtextbody
Ветер, привет


Просмотр текста сообщения со вложениями

$ cat /home/veter/Maildir/new/1262551937.20192.veter-laptop| mailtextbody



Отлично - если текста нет, то ничего и не показывается, вложения игнорируются.

Сохранение вложений в отдельные файлы

$ munpack ~veter/Maildir/new/1262559828.26006.veter-laptop


Просмотр письма целиком

$ cat /home/veter/Maildir/new/1262559828.26006.veter-laptop | 822print |less
Subject:
From: veter@veter-laptop.veter-laptop
Date: 3 Jan 2010 23:03:48 -0000 2010-01-04 02:03:48
Return-Path: return pechnikov@sandy.ru
Delivered-To: veter@veter-laptop.veter-laptop
Received: (qmail 26004 invoked by uid 1000); 4 Jan 2010 02:03:48 +0300
Message-ID: 20100103230348.26003.qmail@veter-laptop.veter-laptop
------------------------------------------------------------------------------
Cc: recipient list not shown
------------------------------------------------------------------------------

Ветер, привет


Просмотр письма со вложениями

$ cat /home/veter/Maildir/new/1262551937.20192.veter-laptop| 822print |less
Subject: test
From: veter@veter-laptop.veter-laptop
Date: 3 Jan 2010 23:52:17 +0300 2010-01-03 23:52:17
Return-Path: return veter@veter-laptop.veter-laptop
Delivered-To: veter@veter-laptop.veter-laptop
Received: (qmail 20190 invoked by uid 1000); 3 Jan 2010 23:52:17 +0300
Message-ID: 20188.1262551938@veter-laptop
------------------------------------------------------------------------------
To: veter@veter-laptop.veter-laptop
------------------------------------------------------------------------------
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="-"

This is a MIME encoded message. Decode it with "munpack"
or any other MIME reading software. Mpack/munpack is available
via anonymous FTP in ftp.andrew.cmu.edu:pub/mpack/
---
Content-Type: application/octet-stream; name="mess822-0.58.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="mess822-0.58.tar.gz"
Content-MD5: jOTCnJlKcNyqMBQGASE9vg==

H4sICAuj8DUCA21lc3M4MjItMC41OC50YXIA7P1bjxtJ1iiKzYMNo3P7wBvHl4MD4+BEs2dU
pIqkeKmLVKVSqySVums+3XZV6ZuerdLWZJHJYrbITDYzKVV1j7b9dJ4ObBiGAcOwj18M/wA/
+Tf4wYBf/W4YMOxHvxpea8U9M5KXUomSuqmZLmZmRKxYcVuxYsW6DIMkud1q1Rr1zdu3/vRp
...


В этом случае содержимое вложений тоже показывается. Для работы вряд ли такой вариант может быть полезен, разве что для тестирования.

Просмотр хидеров
Примечание: по умолчанию выводится значение заголовка Subject, регистр игнорируется.

$ cat /home/veter/Maildir/new/1262551990.20212.veter-laptop | 822field
Привет, Ветер!
$ cat /home/veter/Maildir/new/1262551990.20212.veter-laptop | 822field to
veter@veter-laptop.veter-laptop


Пробел после наименования заголовка отображается как первый символ в строке. Полагаю, из тех соображений, что "кривые" клиенты могут сформировать заголовки без пробелов.

Upd.

Вот так можно отправить сообщение с кириллицей на адрес me@host.my от имени me@sender.host.name:


$ echo "set from=me@sender.host.name" >> ~/.muttrc
$ echo "привет"|mutt -s "Test hello" me@host.my


Upd.
Для модификации сообщений (добавление произвольных хидеров, удаление или замена вложений) может оказаться полезным пакет altermime.

Upd.
В случае, когда мы получаем заголовки вида

$ cat /tmp/message.mbox | 822field
=?utf-8?B?0KLQtdGB0YLQvtCy0L7QtSDQvdC+0Lw=?= =?utf-8?B?0LXRgCDRgNCw0Lc=?=

можно их перекодировать чем-то вроде нижеприведенного скрипта:

package require mime
set header [exec cat /tmp/message.mbox | 822field]
foreach word [split $header] {
if {$word eq {}} continue
foreach {charset encoding word} [mime::word_decode $word] break
set word [encoding convertfrom $charset $word]
puts -nonewline $word
}
puts {}

Примечание: эквивалентный код на перле несложно найти в сети.

Несложно на тикле сделать парсер и для письма целиком:

package require mime

set message [exec cat /tmp/message.mbox]
set token [mime::initialize -string $message]
# set token [mime::initialize -string [read stdin]]

set content [mime::getproperty $token content] ;# text/plain
set body [mime::getbody $token] ;# veter, привет 17
set subject [mime::getheader $token subject] ;# {=?utf-8?B?0KLQtdGB0YLQvtCy0L7QtSDQvdC+0Lw=?==?utf-8?B?0LXRgCDRgNCw0Lc=?=}


См. также описание и примеры: Wiki Tcl/Tk: mime
И несколько полезных ссылок сс указанной вики-страницы:
Tcl MIME generates and parses MIME body parts.
Sorting mail into Maildirs
Mime File Attachment Extractor
Reading messages that might be MIME-encoded

Upd.
Протестируем скорость отправки письма со вложениями (для корректного указания заголовка From: нужно создать файл ~/.muttrc, как показано выше):

$ time echo "набор файлов"|mutt -s "Тестовое с файлами" -a /var/cache/apt/archives/elinks* -- pechnikov@mobigroup.ru
real 0m0.233s
user 0m0.136s
sys 0m0.040s

$ du -sh /var/cache/apt/archives/elinks*
464K /var/cache/apt/archives/elinks_0.11.4-3_i386.deb
644K /var/cache/apt/archives/elinks-data_0.11.4-3_all.deb

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru