2017-04-04 16 views
-2

목표 : 전자 메일 헤더에 고유 전자 메일 주소 사용 : MIME HTML 메시지의 필드 (message_class 참조).해시 값을 동적으로 사용하는 방법은 무엇입니까?

파일 : database.rb 여기서 데이터베이스에 연결하고 테이블 rcpt의 행을 반복합니다. 그런 다음 row["email"]에 값을 저장합니다. 없이 con 방법의

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 

OUPUT [ "이메일"] :

{"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에서 사용하려고합니다. 이제 내 문제가 발생합니다 : 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"]입니다. 메시지가 전자 메일을 작성합니다.

: 여기
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] 헤더이며 다음과 같이

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 내부 I의 방법을 사용하여

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 

이메일 헤더의 동적받는 사람 : 입력란 만 작동하지 않습니다. 나머지는 정상적으로 작동하고 데이터베이스의 모든 레코드는 이메일을 수신합니다.

+1

[mcve]를 제공하십시오. 귀하의 예제가 완전하지 않습니다 (데이터베이스가 필요하지만 구성표를 제공하지 않았습니다) 최소한의 것은 아닙니다 (나는 그 문제를 설명하기 위해 50 줄을 필요로합니다.) –

+0

DB 스키마를 업데이트했습니다. – Peter

+0

"내가 뭘 잘못 했니?" - this :'# {pull_rcpt [0] [ "email"]}'. 항상 첫 번째 행의 전자 메일을 사용하도록 명시 적으로 말합니다. –

답변

1

이미 언급했듯이이 줄은 문제의 핵심입니다. <#{pull_rcpt[0]["email"]}>. 명시 적으로 데이터베이스의 첫 번째 요소를 선택하고 있습니다. 동적으로 헤더를 만들려면 data-method에 인수를 전달해야합니다.

클래스 이메일에서

, def data(dynamic_email)def data을 변경하고 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'를'SELECT email from rcpt'로 바꾸는 것은 시작일 것입니다.하지만 여전히 해쉬 배열을 줄 것입니다. 어쨌든, 반칙 내용을 변경하면 나머지 코드는 수정해야합니다. 예를 들어, 루프 내에서'rcpt [ 'email']'=>'rcpt'. – an491445