У меня есть файл procmailrc, который собирает некоторые переменные из заголовков почты, а затем выводит эти переменные в тело сообщения. Как это:
:0bfw
| echo Subject_ "${SUBJECT_}" ; echo From_ "${FROM_}" ; echo To_ "${TO_}" ; echo CC_ "${CC_}" ; echo "" ; cat
В целом это работает нормально. Он правильно отражает то, что я хочу, чтобы он повторил. Но он выводит эти переменные в отдельную часть сообщения, например:
Content-Type: multipart/alternative; boundary=001a11c1367a19ff420508126c21
Subject_ Subject variable is here
From_ variable@whatever
To_ variable@whatever
CC_
--001a11c1367a19ff420508126c21
Content-Type: text/plain; charset=UTF-8
The rest of the message body is here, in a separate message part.
Как я могу заставить procmail отображать эти переменные в той же части сообщения, что и остальная часть тела письма?
Это немного сложно, потому что не все сообщения являются сообщениями MIME, и не все сообщения MIME являются составными сообщениями. Следующее, вероятно, слишком упрощенно, но работает в моих ограниченных тестах.
:0fbw
* ^MIME-version:
* ^Content-type:[ ]*multipart/[^-a-z0-9_]*;[ ]*boundary="?\/[^ "]*
| awk "!q&&/^--$MATCH/{h=1}h&&/^$/{h=0;p=1}\
!q&&p&&!/^$/{print \"Subject_ $SUBJECT_\"; print \"From_ $FROM\";\
print \"To_ $TO\"; print \"CC_ $CC\"; print \"\"; p=0; q=1 }1"
:0Efbw
| echo blah blah # Your original attempt here
Сценарий Awk находит первую границу MIME, затем первую пустую строку после нее, затем вставляет фрагмент и устанавливает несколько переменных состояния для предотвращения дальнейшей обработки. К сожалению, сценарий немного хрупкий; он завершится ошибкой, если одно из извлеченных значений содержит непарные двойные кавычки и неправильно обработает парные двойные кавычки.
Кроме того, это будет работать правильно только в том случае, если первая часть тела в составной части является текстовой частью; он не будет работать аналогично вашему текущему случаю, если у вас есть вложенные составные части (например, сообщение верхнего уровня multipart / related, содержащее составную / альтернативную структуру). Его можно расширить, чтобы охватить больше случаев - простая настройка - перейти к первому Content-Type: text/plain
вместо этого -, но в какой-то момент будет иметь больше смысла выполнять манипуляции с MIME в соответствующем инструменте с поддержкой MIME (например, в простом скрипте Python).