Ruby:从textfile发送电子邮件:emailserver,sender,reciever,subject,body

时间:2017-05-11 13:00:38

标签: ruby csv email

这是我第一次尝试在ruby中完成一些任务。我的猫的名字是红宝石所以我决定在我的linux盒子上使用ruby语言来满足我的需求。

我想做的第一件事就是发送带有红宝石的电子邮件。 它不是那么复杂,直到现在我有这个代码

require 'net/smtp'

message = <<MESSAGE_END
    From: wakeupruby <wakeupruby@fromdomain.com>
    To: Wakeup-Email<wakeuprasperry@todomain.com>
    Subject: Wakeup-Email

    It's 8 in the morning, get up, please. 
    MESSAGE_END

Net::SMTP.start('mail.mydomain.com', 25) do |smtp|
smtp.send_message message,
            'test@mydomain.com',
            'test@mydomain.com'
end

它的工作方式与预期相符。 之后,我创建了一个文本文件,如下所示:

emaildata.txt MAILSERVER,域,发件人,收件人,主题,正文 mailserver1.lab,lab,user1.lab,user2.lab,testemail,不要读这个!。

所以,这里有什么失败 我想读取名为emaildata.txt的文本文件,并逐行使用此数据(描述值的第一行除外)并使用此命令填充变量。一行=一封电子邮件。

我完全不知道如何做到这一点。 任何让它运行的帮助都没关系。 首先应该命名所有变量,如csv文件中的命名。

MAILSERVER,DOMAIN,发件人,收件人,主题,正文

从我使用过的csv文件中读取: 要求&#39; csv&#39;

CSV.foreach('emaildata.txt',col_sep:',', row_sep: :auto, headers: true) do |row|
puts row.inspect
end

这从我的emaildata.txt文件中提供了这个列表

<CSV::Row "MAILSERVER":"mailserver1.lab" "DOMAIN":"lab" "SENDER":"user1.lab" "RECIPIENT":"user2.lab" "SUBJECT":"testemail" "BODY":"dont read this!. ">
<CSV::Row>

可以有更多的列,所以当我们以后有更多的列时,静态执行它将无济于事。

我如何使用Head colmn值作为变量?例如MAILSERVER并将它们打印到屏幕上? 我试过了

put $MAILSERVER
put @MAILSERVER

根本没有成功。

然后,第一次使用第二行的值填充变量 发送电子邮件 清除变量 检查,如果这是最后一个条目,如果没有 从第三行填充变量 发送电子邮件 清除变量 检查这是否是最后一个条目,如果没有,再次,如果没有退出。

我用telnet手动完成了这样做:

telnet $mailserver 25
helo $domain
mail from:<$SENDER>
rcpt to:<$RECIPIENT>
data
Subject: $SUBJECT
<emptyline>
$BODY
.
quit

哪个有效。但不是手动做它我想让它运行...红宝石。

感谢您阅读和帮助

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那么您是否尝试使用CSV文件来形成电子邮件?我会避免使用csv模块。你可以用基本的ruby功能做所有事情。

首先打开文件并将每一行存储到数组中

csv_array = []
csv_file = File.open("/path/to/file.csv", "r")
csv_file.each_line {|row| csv_array.push(row)}

每一行都包含一个换行符,所以我们将删除它。

csv_array.each {|row| row.strip!}

正确格式化所有内容的最后一步。我们需要删除包含列标题的第一行。

csv_array.shift

现在我们的csv文件的每一行都是数组中的一个元素。您可以遍历在逗号处分割每一行的元素,并使用新数组的元素作为变量。

csv_array.each do |line|
     row = line.split(",") 
     telnet row[0] 25
     helo row[2]
     rcpt to::row[3]
     data
     Subject: row[4]
     <emptyline>
     row[5]
end

Telnet不是发送电子邮件的最佳方式。我会用mailfactory。比net / smtp更容易和灵活。

答案 1 :(得分:0)

谢谢大家为解决这个问题所做出的贡献。它终于在@letitworknow的帮助下工作了。

这是完整的代码,使用mailfactory完成:

require 'rubygems'
require 'net/smtp'
require 'mailfactory'


#read csv file
csv_array = []
csv_file = File.open("/root/mailtest/emaildata.txt", "r")
csv_file.each_line {|row| csv_array.push(row)}
csv_array.each {|row| row.strip!}
csv_array.shift
csv_array.each do |line|
     row = line.split(";")


#Connect to SMTP Server
smtp = Net::SMTP.new(row[0], 25)
smtp.start(row[1])

#Construct Mail Message
mail = MailFactory.new()
mail.from = row[2]
mail.to = row[3]
mail.subject = row[4]
mail.txt = row[5]


#Construct SMTP Message
smtp.send_message mail.construct, row[2], row[3]

#Send this (and all other) message
smtp.finish()

#close the each.loop
end

第一个版本因前面描述的问题而失败,所以此时它还没有完成。直到现在我都无法让它运行起来。

最佳

约翰