如何动态使用哈希值?
How to use values of a hash dynamically?
目标:在电子邮件 header 收件人中使用唯一的电子邮件地址:MIME Html 消息的字段(参见 message_class)。
文件:database.rb 这里我连接到数据库并循环遍历 table rcpt
中的行。然后我将值存储在 row["email"]
.
中
require 'mysql2'
class Db
def con
@db_host = "localhost"
@db_user = "root"
@db_pass = "password"
@db_name = "table_db"
client = Mysql2::Client.new(:host => @db_host, :unsername => @db_user, :password => @db_pass, :database => @db_name)
rcpt = client.query("SELECT * from rcpt")
rcpt.each do |row|
row["email"]
end
end
end
没有["email"]的con
方法的输出:
{"id"=>01, "email"=>"example1@example.com"}
{"id"=>02, "email"=>"example2@example.com"}
使用 ["email"] 的 con
方法的输出:
example1@example.com
example2@example.com
数据库架构:
mysql> describe rcpt;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(150) | NO | UNI | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
文件:message_class.rb 在这里我创建了方法 pull_rcpt
然后存储 row["email"]
。然后我尝试在 message
heredoc 中使用 pull_rcpt
方法。现在我的问题来了:在 To:
字段中,我试图传递我当前发送到的用户电子邮件地址,因此它应该随着接收电子邮件地址而改变。它仍然使用 array/Db 中第一个联系人的电子邮件地址。我做错了什么?
require 'dkim'
require './database'
class Email
def pull_rcpt
rcpt = Db.new
rcpt.con
end
def data
Dkim::domain = 'example.com'
Dkim::selector = 'mail'
Dkim::private_key = open('/path/to/keys/example.com/mail.private').read
message = <<~MESSAGE
From: Eva <test@example.com>
To: Dani <#{pull_rcpt[0]["email"]}>
MIME-Version: 1.0
Content-Type: text/html
Content-Transfer-Encoding: 8bit
Subject: Test Subject
This is an email message.
<h1>Test</h1>
MESSAGE
end
end
文件:mailer_class.rb 在我的 mailer_class 中,我有两个方法 rcpt_to
和 message
。 Rcpt_to 包含一个数组 contacts
,其中包含 row["email"]
的值。消息构建电子邮件。
require './database'
require './message_class'
def rcpt_to
#conn zu DB & take rcpt
contacts = []
contacts = Db.new
contacts.con
end
def message
#message
message = Email.new
end
几行后面的一个for loop
我使用的方法如下:
for rcpt in rcpt_to do
@protocol = { ehlo: "ehlo", mail_from: "eva@example.com", rcpt_to: [rcpt["email"]], data: Dkim.sign(message.data) }
end
这里是example2@example.com的header,是数据库中的第二条记录:
From: Eva <test@example.com>
To: Dani <example1@example.com> <--- This should be example2(value in hash of second entry in database) not example1
MIME-Version: 1.0
Content-Type: text/html
Content-Transfer-Encoding: 8bit
Subject: Test Subject
Content-Length: 40
所以唯一不起作用的是电子邮件中的动态 To: 字段 header。其余的工作正常,数据库中的所有记录都会收到一封电子邮件。
如前所述,这一行是问题的核心:<#{pull_rcpt[0]["email"]}>
。您明确选择了数据库中的第一个元素。要动态创建 header,您必须将参数传递给 data-method。
所以这是解决这个问题的一种方法:
在 class 电子邮件中,将 def data
更改为 def data(dynamic_email)
,然后
To: Dani <#{pull_rcpt[0]["email"]}>
到 To: Dani <#{dynamic_email}>
并在循环内:
data: Dkim.sign(message.data)
=> data: Dkim.sign(message.data(rcpt["email"]))
类似的东西应该有用。
附带说明一下,您的代码可以进行一些重构。例如,你写的 con-method 并不像你想的那样起作用。 "each" returns 数组本身。如果你把它放在这样一个方法的最后一行,它就没有任何作用。在这种情况下,它相当于写 return rcpt
。如果您希望该方法 return 一个电子邮件地址数组,您应该使用 map 而不是每个(或者更好的是,重写您的 sql 查询)。但是,当然,如果你改变它,它会破坏你的代码的其余部分。懒惰的解决方案只是删除 each-loop...
目标:在电子邮件 header 收件人中使用唯一的电子邮件地址:MIME Html 消息的字段(参见 message_class)。
文件:database.rb 这里我连接到数据库并循环遍历 table rcpt
中的行。然后我将值存储在 row["email"]
.
require 'mysql2'
class Db
def con
@db_host = "localhost"
@db_user = "root"
@db_pass = "password"
@db_name = "table_db"
client = Mysql2::Client.new(:host => @db_host, :unsername => @db_user, :password => @db_pass, :database => @db_name)
rcpt = client.query("SELECT * from rcpt")
rcpt.each do |row|
row["email"]
end
end
end
没有["email"]的con
方法的输出:
{"id"=>01, "email"=>"example1@example.com"}
{"id"=>02, "email"=>"example2@example.com"}
使用 ["email"] 的 con
方法的输出:
example1@example.com
example2@example.com
数据库架构:
mysql> describe rcpt;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(150) | NO | UNI | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
文件:message_class.rb 在这里我创建了方法 pull_rcpt
然后存储 row["email"]
。然后我尝试在 message
heredoc 中使用 pull_rcpt
方法。现在我的问题来了:在 To:
字段中,我试图传递我当前发送到的用户电子邮件地址,因此它应该随着接收电子邮件地址而改变。它仍然使用 array/Db 中第一个联系人的电子邮件地址。我做错了什么?
require 'dkim'
require './database'
class Email
def pull_rcpt
rcpt = Db.new
rcpt.con
end
def data
Dkim::domain = 'example.com'
Dkim::selector = 'mail'
Dkim::private_key = open('/path/to/keys/example.com/mail.private').read
message = <<~MESSAGE
From: Eva <test@example.com>
To: Dani <#{pull_rcpt[0]["email"]}>
MIME-Version: 1.0
Content-Type: text/html
Content-Transfer-Encoding: 8bit
Subject: Test Subject
This is an email message.
<h1>Test</h1>
MESSAGE
end
end
文件:mailer_class.rb 在我的 mailer_class 中,我有两个方法 rcpt_to
和 message
。 Rcpt_to 包含一个数组 contacts
,其中包含 row["email"]
的值。消息构建电子邮件。
require './database'
require './message_class'
def rcpt_to
#conn zu DB & take rcpt
contacts = []
contacts = Db.new
contacts.con
end
def message
#message
message = Email.new
end
几行后面的一个for loop
我使用的方法如下:
for rcpt in rcpt_to do
@protocol = { ehlo: "ehlo", mail_from: "eva@example.com", rcpt_to: [rcpt["email"]], data: Dkim.sign(message.data) }
end
这里是example2@example.com的header,是数据库中的第二条记录:
From: Eva <test@example.com>
To: Dani <example1@example.com> <--- This should be example2(value in hash of second entry in database) not example1
MIME-Version: 1.0
Content-Type: text/html
Content-Transfer-Encoding: 8bit
Subject: Test Subject
Content-Length: 40
所以唯一不起作用的是电子邮件中的动态 To: 字段 header。其余的工作正常,数据库中的所有记录都会收到一封电子邮件。
如前所述,这一行是问题的核心:<#{pull_rcpt[0]["email"]}>
。您明确选择了数据库中的第一个元素。要动态创建 header,您必须将参数传递给 data-method。
所以这是解决这个问题的一种方法:
在 class 电子邮件中,将 def data
更改为 def data(dynamic_email)
,然后
To: Dani <#{pull_rcpt[0]["email"]}>
到 To: Dani <#{dynamic_email}>
并在循环内:
data: Dkim.sign(message.data)
=> data: Dkim.sign(message.data(rcpt["email"]))
类似的东西应该有用。
附带说明一下,您的代码可以进行一些重构。例如,你写的 con-method 并不像你想的那样起作用。 "each" returns 数组本身。如果你把它放在这样一个方法的最后一行,它就没有任何作用。在这种情况下,它相当于写 return rcpt
。如果您希望该方法 return 一个电子邮件地址数组,您应该使用 map 而不是每个(或者更好的是,重写您的 sql 查询)。但是,当然,如果你改变它,它会破坏你的代码的其余部分。懒惰的解决方案只是删除 each-loop...