Python: не удалось разобрать сообщение электронной почты, отправленное на стандартный ввод - PullRequest
0 голосов
/ 21 сентября 2018

Я отправляю сообщение электронной почты от Pigeonhole на скрипт Python, используя фильтры Sieve, которые выглядят как

#!/usr/bin/python
import sys
import os
import email

input = sys.stdin

#For manual testing 
#input=open(sys.argv[2]).read()

msg=email.message_from_string(input)

Но происходит сбой с ошибкой ниже

Sep 21 11:41:24 lmtp: Error: Traceback (most recent call last):
Sep 21 11:41:24 lmtp: Error: File "message-processor.py", line 11, in <module>
Sep 21 11:41:24 lmtp: Error: msg=email.message_from_string(input)
Sep 21 11:41:24 lmtp: Error: File "/usr/lib64/python2.6/email/__init__.py", line 57, in message_from_string
Sep 21 11:41:24 lmtp: Error: return Parser(*args, **kws).parsestr(s)
Sep 21 11:41:24 lmtp: Error: File "/usr/lib64/python2.6/email/parser.py", line 82, in parsestr
Sep 21 11:41:24 lmtp: Error: return self.parse(StringIO(text), headersonly=headersonly)
Sep 21 11:41:24 lmtp: Error: TypeError: expected read buffer, file found

Работает нормальнокогда я использую электронную почту, сохраненную в виде файла, но не переданную по каналу.

Какие-либо советы по этому поводу?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я перешел на email.parser, которые выполняют работу

#!/usr/bin/python
import sys
import os
import email
import email.parser

input = sys.stdin

#For manual testing 
#input=open(sys.argv[2]).read()

msg = email.parser.Parser().parse(input)
0 голосов
/ 21 сентября 2018

Ошибка, которую вы получаете (TypeError: expected read buffer, file found) очевидна: функция message_from_string ожидает строку (как следует из названия), пока вы даете ей файл (sys.stdin).Если вы хотите включить конвейерную связь, вам нужно сначала сохранить входящий текст в виде строки, а затем передать его на message_from_string.Что-то вроде:

import sys
import os
import email

# Save the piped input as a string
s = '\n'.join(line for line in sys.stdin)

msg = email.message_from_string(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...