这是我第一次尝试在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
哪个有效。但不是手动做它我想让它运行...红宝石。
感谢您阅读和帮助
乔
答案 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
第一个版本因前面描述的问题而失败,所以此时它还没有完成。直到现在我都无法让它运行起来。
最佳约翰