簡體   English   中英

procmail處理后的郵件正文編碼

[英]mail body encoding after procmail processing

我在SMTP服務器上的.procmailrc中有以下行:

BODY=`formail -I ""`

稍后,我將此正文回顯到本地文件:

echo "$BODY" >> $HOME/$FILENAME; \

我也嘗試過prinf(但效果相同):

printf "$BODY" >> $HOME/$FILENAME; \

讀取此文件后,我可以看到編碼已更改。 這是我得到的:

Administrator System=C3=B3w

雖然應該是(波蘭語):

Administrator Systemów

如何直接在.procmailrc或更高版本(bash / python)中解碼/編碼主體以獲得正確的字符串?

我的.procmailrc另一行正常工作,但需要使用perl編碼器的其他管道:

SUBJECT=`formail -xSubject: | tr -d '\n' | sed -e 's/^ //' | /usr/bin/perl -MEncode -ne 'print encode ("utf8",decode ("MIME-Header",$_ )) '`

SUBJECT包含UTF8字符,一切正常。 也許有一種方法可以對郵件正文使用類似的解決方案?

好。 我終於把一切都准備好了。 這是我所做的:

首先是.procmailrc文件:

VERBOSE=yes
LOGFILE=$HOME/procmail.log
:0f
* ^From.*(some_address@somedomain.com)
| $HOME/python_script.py

現在到python_script.py

#!/usr/bin/python

from email.parser import Parser
import sys

temp_file = open("/home/(user)/file.txt","w")
temp_file.write("START\n")

if not message.is_multipart():
        temp_file.write(message.get_payload(decode=True))
else:
        for part in message.get_payload():
                if part.get_content_type() == 'text/plain':
                        temp_file.write(part.get_payload(decode=True))

temp_file.close()

調試中最困難的部分是.procmailrc配方,在該配方中,我不得不測試:0,:0f,:0fbW等的許多選項,最后找到了最適合的選項。

下一個有問題的步驟是$ BODY部分直接在.procmailrc中解碼。 不過,我通過擺脫所有東西並將所有內容移到Python腳本中找到了解決方案。 就像三胞胎建議的那樣。

它沒有更改,但是您正在轉換標題,以便不再出現正確的Content-Type:標題(您還應該保留Mime-Version:和任何其他標准Content-*標題)。

通過檢查郵件客戶端中消息的來源,您應該看到Procmail或Bash實際上沒有任何更改。 實際上,您收到的文本實際上是Administrator System=C3=B3w但是MIME標頭通知您的電子郵件客戶端這是Content-Transfer-Encoding: quoted-printableContent-type: text/plain; charset="utf-8" Content-type: text/plain; charset="utf-8" ,因此它知道如何正確解碼和顯示它。

如果只需要有效負載,則需要自己對其進行解碼,但是為此,您需要MIME頭中的此信息,因此在處理消息之前(如果有的話),您不應該殺死它們。 大概是這樣的:

from email.parser import Parser
import sys

message = Parser().parse(sys.stdin)
if message['content-type'].lower().startswith('text/'):
    print(message.get_payload(decode=True))
else:
    raise DieScreamingInAnguish('aaaargh!')  # pseudo-pseudocode

這是非常簡單的,因為它假定消息(如您​​當前甚至更破的解決方案)包含單個文本部分。 將其擴展為多部分消息在技術上並不困難,但是如何做到這一點取決於您希望接收的多部分類型以及要對有效載荷進行的處理。

就像在上一個問題中一樣,如果您仍然要使用它,我建議您將更多或全部電子郵件處理移入Python。 Procmail沒有顯式的MIME支持,因此您必須在Procmail中重新發明所有的功能,這既不簡單也不富有成果。

我認為這可能是您的echo沒有返回正確的Unicode來寫入文件的原因,以下是許多可以幫助您的解決方案中的兩種:

用逃逸字符回顯:

echo -e "$BODY" >> $HOME/$FILENAME; \

或者,假設您在Linux中有iconv,請使用iconv或類似文件將文件編碼為utf-8

iconv -t UTF-8 original.txt > encoded_result.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM