2017-04-04 92 views
-2

目标:在电子邮件标头中使用唯一的电子邮件地址到:MIME Html消息的字段(请参阅message_class)。如何动态使用哈希值?

File:database.rb在这里,我连接到数据库,我循环表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 

con方法的输出继电器而不[ “电子邮件”]:

{"id"=>01, "email"=>"[email protected]"} 
{"id"=>02, "email"=>"[email protected]"} 

输出con法[ “电子邮件”]的:

[email protected] 
[email protected] 

DB模式:

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) 

File:message_class.rb这里我创建方法pull_rcpt然后存储row["email"]。然后我试图在message heredoc中使用pull_rcpt方法。现在出现我的问题:在To:字段中,我试图传递我当前发送的用户电子邮件地址,因此它应该随接收电子邮件地址而更改。它仍然使用阵列/ 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 <[email protected]> 
    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_tomessage二方法的。 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: "[email protected]", rcpt_to: [rcpt["email"]], data: Dkim.sign(message.data) } 
end 

这里是[email protected]的报头是在数据库中的第二记录:

From: Eva <[email protected]> 
To: Dani <[email protected]> <--- 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:字段。其余的工作正常,数据库中的所有记录都会收到一封电子邮件。

+1

请提供一个[mcve]。你的例子并不完整(它需要一个数据库,但你没有提供这个方案),它可能不是最小的(我非常怀疑,你需要50行来证明这个问题)。 –

+0

我已经更新了数据库模式。 – Peter

+0

“我做错了什么?” - 这:'#{pull_rcpt [0] [“email”]}'。您明确告诉它始终使用第一行的电子邮件。 –

回答

1

如前所述,这条线是问题的核心:<#{pull_rcpt[0]["email"]}>。您明确选择数据库中的第一个元素。要动态创建标题,您必须将参数传递给数据方法。

因此,这里是解决这个的一种方法:

在课堂上的电子邮件,改变def datadef 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"]))

喜欢的东西这应该工作。

作为一个方面说明,你的代码可以做一些重构。例如,你编写的连接方法不符合你的想法。 “each”返回数组本身。如果你把它放在这样的方法的最后一行,它不起任何作用。在这种情况下,这将等同于编写return rcpt。如果你想让该方法返回一个电子邮件地址数组,你应该使用map而不是每个(甚至更好,重写你的sql查询)。但是,当然,如果你改变它,它会破坏你的代码的其余部分。懒惰的解决方案只是删除每个循环...

+0

非常感谢an491445!懒惰版本的作品,但现在我被激励,你认为最有效的方法是什么?我想重构数据库。提前致谢! – Peter

+0

那么,因为rcpt表只有两行,我想这不会为效率做很多事情,但正如你所问......我的印象是你想con返回一组电子邮件地址,而不是哈希数组。改变每个地图可以解决这个问题。你也可以看看client.query是否可以接受其他参数。将'SELECT * from rcpt'改为'从rcpt'选择电子邮件将是一个开始,但我想它仍然会给你一个哈希数组。无论如何,如果你改变了什么con回报,你将不得不修改其余的代码。例如循环中的'rcpt ['email']'=>'rcpt'。 – an491445