Ruby:如何从stdin解析电子邮件mime

时间:2015-05-27 08:22:18

标签: ruby email gem mime-types mime-mail

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

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方法可以正常使用我的电子邮件,但是当我想将我的stdin放到Mail.read时,我有:

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

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

宝石的完整网址为:https://github.com/mikel/mail

2 个答案:

答案 0 :(得分:4)

readlines 会返回数组 ...行!您可能想在 ARGF 上尝试读取,这是$ stdin提供的输入。

mail = Mail.new ARGF.read

请参阅the relevant documentation

答案 1 :(得分: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"]