是否可以使用Apache Nifi以单步检索电子邮件,电子邮件标题详细信息和电子邮件附件的正文内容。
如果是这样请帮助我如何实现这一目标。
答案 0 :(得分:3)
除非您编写自己的处理器或脚本(使用ExecuteScript或InvokeScriptedProcessor),否则无法一步完成。但是,在单个流程中可以使用以下内容:
ConsumePOP3 - > ExtractEmailHeaders - > ExtractEmailAttachments - > ...
在上面的流程结束时,每个附件都有一个流文件,每个流文件包含电子邮件标题作为属性,附件作为内容。
答案 1 :(得分:1)
您可以使用处理器“ ExecuteScript”,而不用开发自定义处理器。
import email
import mimetypes
from email.parser import Parser
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from java.io import BufferedReader, InputStreamReader
from org.apache.nifi.processors.script import ExecuteScript
from org.apache.nifi.processor.io import InputStreamCallback
from org.apache.nifi.processor.io import StreamCallback
class PyInputStreamCallback(InputStreamCallback):
_text = None
def __init__(self):
pass
def getText(self) :
return self._text
def process(self, inputStream):
self._text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
flowFile = session.get()
if flowFile is not None :
reader = PyInputStreamCallback()
session.read(flowFile, reader)
msg = email.message_from_string(reader.getText())
body = ""
if msg.is_multipart():
for part in msg.walk():
ctype = part.get_content_type()
cdispo = str(part.get('Content-Disposition'))
if ctype == 'text/plain' and 'attachment' not in cdispo:
body = part.get_payload(decode=True) # decode
break
else:
body = msg.get_payload(decode=True)
flowFile = session.putAttribute(flowFile, 'msgbody', body.decode('utf-8', 'ignore'))
session.transfer(flowFile, ExecuteScript.REL_SUCCESS)
屏幕截图