Описание тега 18-04
Похоже, вы говорите о стандарте RFC 2047: кодировки MIME для электронной почты заголовки. Далее РЛК с тех пор дополненной этот RFC, чтобы позволить более наборов символов и дополнительно включать спецификацию языка.
Потому что первоначальный адрес электронной почты и спецификации MIME включали предположение, что заголовки будут содержать только строго нас-ASCII, кодирование заголовка-это совершенно отдельная тема от кодирования MIME сообщения.
Формат:
=? <кодировки> [язык] ? <кодировка-письмо> ? <текст> ?=
<кодировка-письмо>
будет либо Q для печати кавычках, или B для base64 кодирования. Если сообщение представляется совершенно тарабарском языке, я предполагаю, что вы видите в base64. Набор символов в имени и буквы кодировки не зависят от регистра.
Так что вы можете увидеть:
Тема: =?в UTF-8?б?SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdsb1bmrlcnn0b29kihrozsblegftcgxllgo=?=
Или с идентификатором язык добавлено:
Тема: =?кодировка UTF-8*Ан?б?SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdsb1bmrlcnn0b29kihrozsblegftcgxllgo=?=
Руководство пример расшифровки:
$ Эхо "SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdsb1bmrlcnn0b29kihrozsblegftcgxllgo=" | из base64 -д
Если вы можете прочитать это, вы поняли пример.
Тот факт, что существующие словарю сценарий включает в себя принуждение маркировки кодировок кодировка ISO-8859-1
, ASCII США
и неизвестных-8 бит
, как в windows-1251
означает, что ваша реальная проблема может быть так называемого кодирования. Другими словами:
- старый почтовый клиент выбрасывает
в windows-1251
кириллица без маркировки их как таковые, возможно, также в заголовках - по дороге, электронное письмо проходит через почтовый сервер, либо не должным образом объявить о том, что он может обрабатывать 8-битные кодировки почте чисто, или ревнует о принудительной маркировки всех кодировок, отличных от обычного ASCII США.
В этой ситуации, МТА должен для кодирования и маркировки 8-битные символы, чтобы получить почту передавали. Но если 8-битные символы этикетки, только исходный почтовый клиент точно знает, что персонаж на самом деле набор.
Проблема о маркировке наборов символов после факта является то, что определение кодировки может потребовать от человека на уровне понимания о том, содержимого имеет смысл трактовать как определенный набор символов или нет. Так что вы будете в конечном итоге с помощью эвристики, которая иногда будет неправильно.
Например, если вы получили письмо, что на самом деле правильно закодированы в кодировке ISO-8859-1
, ваш скрипт будет mislabel это как с windows-1251
, в результате чего все скандинавские/западно-европейская ударением персонажи, которые появляются как случайные номера и бессмысленные кириллицы. Но если это встречается реже, чем получать в windows-1251
кодировке сообщения ошибочно считаются стандартом ISO-8859-1
, это может быть ваш выбор, чтобы принять это риск и это нормально.
Я думаю, вам придется изучить проблемные сообщения, чтобы выяснить, как их тема:
заголовки кодированы. Они:
- простой немаркированный
с windows-1251
? - на самом деле действителен
в base64
-кодировке в UTF-8? - или
в windows-1251
, которая былав base64
-закодированных и неверно классифицированы как UTF-8?
К сожалению, по словарю
и его компаньон formail
может быть недостаточным для получения тема:
заголовок в незакодированной форме. Они были никем не поддерживается с 2001 года, и даже их автор теперь предлагает выйти на что-то другое. Но если вы хотите продолжать использовать procmail и
сейчас, вам потребуется что-то вроде этого сценария:
https://github.com/akkana/scripts/blob/master/decodemail.py
Я не сделал значительного для procmail
сценариев в около 10 лет, поэтому пример может быть не так или там может быть лучшего способа сделать это. Но, возможно, это полезно в объяснении того, как проблема может быть решена...
Вам придется сначала декодировать содержимое на тему:
заголовка и сохранить его в переменной:
:0 ч
SUBJDECODED=| decodemail.py тема:
:0 ч
SUBJWASRAW=| formail -xSubject: | перекодировать в windows-1251..в UTF-8
Для исправления ошибок кодирования, то вам, возможно, придется перекодировать кодировку от того, что он на самом деле в UTF-8 используется систему:
SUBJWASWIN1251=`Эхо "$SUBJDECODED" | перекодировать в windows-1251..кодировке UTF-8`
Если существует несколько возможных кодировок, возможно, придется создать несколько переменных, как это.
Тогда вы можете соответствовать любой версии темы:
:0
* SUBJWASRAW ?? ваш предмет-выражение-здесь
{
# Вот тема была сырой ОС Windows-1251 без кодирования вообще.
# Переменная перешла на допустимые символы UTF-8 используется эта система,
# Итак, теперь заголовок можно переписать в полезной форме.
# (В этом примере оставляет предмет в качестве сырья немаркированный формат UTF-8, который
# может или не может быть приемлемым для того, что вы используете, чтобы смотреть на ваш электронный адрес.
# Но на современном документе RFC 6532 совместимых почтовых клиентов
# в системе, которая использует UTF-8 на протяжении фактически это может быть хорошо.)
:0 ф
| formail -я "Тема: $SUBJWASRAW"
}
:0
* SUBJWASWIN1251 ?? ваш предмет-выражение-здесь
{
# регулярное выражение совпадает, поэтому мы знаем, что тема была windows-1251
# промаркировал как UTF-8. Исправить его.
:0 ф
| formail -я "Тема: $SUBJWASWIN1251"
}
:0
* SUBJDECODED ?? ваш предмет-выражение-здесь
{
# регулярное выражение соответствует теме декодируется в соответствии с существующей метки
# Итак, мы знаем, что он был надлежащим образом промаркирован. Но его еще нужно
# быть переписана, как это может быть что-то другое, чем UTF-8.
:0 ф
| formail -я "Тема: $SUBJDECODED"
}
# Любые дополнительные правила должны быть в состоянии соответствовать на эту тему, как обычно.
Примечание: ваш-предмет-регулярное выражение-здесь
регулярное выражение не должно включать ^тема:.*
префикс, как переменные будут содержать только значения из предмет:
заголовок.