Как положить текст в procmail пересылаемую электронную почту? - PullRequest
0 голосов
/ 09 мая 2018

Уже пару дней я пытаюсь написать сценарий procmail.

Я хочу пересылать сообщения и вставлять текст в содержимое сообщения.

Чего я хочу достичь:

  • кто-то отправил мне электронное письмо со словом «погода» в теме
  • электронная почта пересылается на адрес «mymail@somedomain.com»
  • каждое пересылаемое письмо получает дополнительный текст

Но пока безуспешно.

В .procmail.log есть сообщение "procmail: Missing action"

SHELL=/bin/bash
VERBOSE=off
LOGFILE=/home/test/.procmail.log
LOGDATE_=`/bin/date +%Y-%m-%d`

:0
* ^Subject:.*weather

:0 bfw
| echo "This is injected text" ; echo "" ; cat

:0 c
! mymail@somedomain.com

Когда я посмотрел на источник электронной почты, я увидел, что текст вводится. Но место не так ...

Взгляните:

MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="------------148F3F0AD3D65DD3F3498ACA"
Content-Language: pl
Status:   
X-EsetId: 37303A29AA1D9F60667466

This is injected text

This is a multi-part message in MIME format.
--------------148F3F0AD3D65DD3F3498ACA
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

CONTENT CONTENT CONTENT
*********************************************************

Вставленный текст должен быть размещен там, где находится контент. Сейчас оно выше ...

1 Ответ

0 голосов
/ 09 мая 2018

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

:0
* ^Subject:.*weather
{
  :0 bfw
  | echo "This is injected text" ; echo "" ; cat

  :0 c
  ! mymail@somedomain.com
}

Чтобы подвести итог, каждый рецепт должен иметь строку заголовка (:0 и возможные флаги) и действие. Условия являются необязательными, и их может быть несколько. Блок дальнейших рецептов - это одна из форм действий, которая удовлетворяет этим требованиям (другие типы действий - это сохранение в папке, передача в команду или пересылка на адрес электронной почты).

Чтобы добавить текст в начало первой части тела MIME из составного сообщения, вам нужно выполнить некоторый анализ MIME. К сожалению, Procmail не имеет явной поддержки MIME, но если вы знаете , что входящее сообщение всегда будет иметь определенную структуру, вам может сойтись с чем-то довольно простым.

:0
* ^Subject:.*weather
{
  :0fbw
  * ^Mime-version: 1\.0
  * ^Content-type: multipart/
  | awk '/^Content-type: text\/plain;/&&!s {n=s=1} \
      n&&/^$/{n=0; p=1} \
      1; \
      p{ print "This is injected text.\n"; p=0 }'

  :0 c
  ! mymail@somedomain.com
}

Тело (которое содержит все части тела MIME, с их заголовками и всем прочим) передается в простой сценарий Awk, который находит первую пустую строку после (что мы оптимистично считаем) первой text/plain части тела MIME заголовок и вставляет туда текст. (Awk чувствителен к регистру, поэтому может потребоваться адаптировать или обобщить текст регулярного выражения, и я предположил, что пробел во входном сообщении является полностью регулярным. Для производственной системы эти упрощающие предположения нереалистичны.)

Если вам нужна полная поддержка MIME (например, входное сообщение может быть или не быть многокомпонентным или содержать вложенные множественные части), я бы порекомендовал написать код для инъекций на каком-нибудь современном языке сценариев с соответствующими библиотеками поддержки MIME; Python был бы моим выбором, хотя он все еще (даже после обновления библиотеки email в 3.6) немного громоздок и неуклюж.

...