2

当输入来自 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

4

2 回答 2

4

readlines返回一个数组......行!您可能想尝试阅读ARGF,它是 $stdin 提供的输入。

mail = Mail.new ARGF.read

请参阅相关文档

于 2015-05-27T08:31:45.483 回答
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"]
于 2015-05-27T08:31:59.417 回答