Ruby:如何从标准输入解析电子邮件 mime

Posted

技术标签:

【中文标题】Ruby:如何从标准输入解析电子邮件 mime【英文标题】:Ruby: how to parse e-mail mime from the stdin 【发布时间】:2015-08-09 05:05:20 【问题描述】:

当输入来自 STDIN 时,任何人都知道如何解析来自 Ruby 的电子邮件 MIME?我发现了一个名为“mail”的 gem,它看起来非常好,但据我所知,它只能从文件中读取邮件:

require 'mail'
mail = Mail.read('/path/to/message.eml')

这就是我测试它的方式:

# First one is from stdin:
require 'mail'
mail = Mail.new($stdin.readlines)
p mail.from
p mail.to

返回: 零 无

# This one is from the file:
mail2 = Mail.new("my_email.txt")
p mail2.from
p mail2.to

返回: 零 无

# The same file but I'm using Mail.read:
mail3 = Mail.read("my_email.txt")
p mail3.from
p mail3.to

返回: [“test@gmail.com”] [“test2@gmail.com”]

STDIN 我正在测试:

# cat my_email.txt | ruby code.rb

所以 Mail.read 方法适用于我的电子邮件,但是当我想将我的标准输入放入 Mail.read 时,我有:

mail/mail.rb:176:in `initialize': no implicit conversion of Array into String (TypeError)

我知道我可以将该文件从标准输入保存到临时文件夹,然后通过 Mail.read 打开它,但我不想这样做,因为它会很慢。

gem 的完整网址是:https://github.com/mikel/mail

【问题讨论】:

【参考方案1】:

readlines 返回一个 array... 行!您可能想在 ARGF 上尝试 read,这是 $stdin 提供的输入。

mail = Mail.new ARGF.read

见the relevant documentation。

【讨论】:

你说得对!我没有考虑。现在可以了! :-) @user3612491 请记住,您可以接受最有帮助的答案(这完全是可选的,但是表示感谢的好方法)【参考方案2】:

IO#readlines 生成一个数组。你想要一个字符串:

# readmail.rb
require 'mail'
mail = Mail.new(STDIN.read)
p mail.from
p mail.to

# mail.eml
From: bob@test.lindsaar.net
To: mikel@test.lindsaar.net
Subject: This is an email

This is the body

# command line
$ ruby readmail.rb < mail.eml
# => ["bob@test.lindsaar.net"]
# => ["mikel@test.lindsaar.net"]

【讨论】:

以上是关于Ruby:如何从标准输入解析电子邮件 mime的主要内容,如果未能解决你的问题,请参考以下文章

从 Lotus Notes 解析 MIME 电子邮件

从数据库中检索和解析 MIME 电子邮件

验证/测试 mime4j 解析内容的输出

如何将原始电子邮件 (MIME) 从 AWS SES 转换为 Gmail?

使用 S/MIME 在 Ruby 中对电子邮件进行数字签名

使用 Email::MIME 和 multipart/signed 解析电子邮件