Rails ActionMailer-발신자 및 수신자 이름 / 이메일 주소 형식


112

ActionMailer를 사용할 때 발신자 및 수신자 정보에 대한 이메일 및 이름을 지정하는 방법이 있습니까?

일반적으로 다음을 수행합니다.

@recipients   = "#{user.email}"
@from         = "info@mycompany.com"
@subject      = "Hi"
@content_type = "text/html"

그러나, 나는 저기 ...로 이름을 지정하려면 MyCompany <info@mycompany.com>, John Doe <john.doe@mycompany>.

그렇게하는 방법이 있습니까?


: 레일 가이드이 수행하는 방법의 예를 가지고 guides.rubyonrails.org/...는 이 질문에 다른 대답을 참조 stackoverflow.com/a/8106387/879854
BF4

답변:


237

이름과 이메일에 대한 사용자 입력을받는 경우 이름과 이메일을 매우 신중하게 확인하거나 이스케이프하지 않는 한 문자열을 연결하여 잘못된 From 헤더로 끝날 수 있습니다. 다음은 안전한 방법입니다.

require 'mail'
address = Mail::Address.new email # ex: "john@example.com"
address.display_name = name.dup   # ex: "John Doe"
# Set the From or Reply-To header to the following:
address.format # returns "John Doe <john@example.com>"

1
정말 고맙습니다! 문자열 연결보다 더 나은 방법이 있다고 생각했지만 Mail::Address내가 읽은 문서에서 사용 이 명확하지 않습니다.
Tim Morgan

10
address.display_name경우에 따라 문자열 인코딩을 변경하는 것처럼 보이므로 name나중에 사용할 계획이라면 예를 들어 rails 메일러보기에서 다음을 수행하십시오.address.display_name = name.dup
Eero

7
이제 Mail gem이 전달 된 문자열을 속이는 name.dup것처럼 보이 므로 더 이상 필요하지 않은 것 같습니다. 소스@display_name = str.nil? ? nil : str.dup
philoye

이것은 Devise 이니셜 라이저에서도 작동합니다.config.mailer_sender = Proc.new { address = Mail::Address.new... }
Cimm

97
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"

2
나는 그렇게 생각하지 않는다. 하나에 대해 ASCII가 아닌 문자를 포함 할 수없고 따옴표 문자 자체를 포함 할 수 없으며 헤더에서도 허용되지 않거나 권장되지 않는 일부 ASCII 문자가 있습니다. RFC2047이 이러한 값을 인코딩하는 base64 메커니즘을 제공한다는 것을 알았습니다.
William Denniss 2011

11
문자열을 올바르게 인코딩하는 방법에 대한 내 대답을 참조하십시오.
James McKinney 2012

8
이것은 도움이되었습니다! 참고로, 이것을 테스트하려는 경우 @ email.from이 아닌 @ email.header [ 'From']. to_s를 확인해야합니다. 후자는 이름이 아닌 이메일 주소 만 포함합니다.
sbleon

7
이런 식으로하지 마십시오. 대신 @JamesMcKinney의 답변을 참조하십시오.
Matthew Ratzloff 2012 년

5
다시 말하지만 안전하지 않으므로 사용하지 마십시오. 대신 @JamesMcKinney의 답변을 참조하십시오.
Jake Petroules 2014 년

43

rails3에서는 각 환경에 다음을 배치합니다. 즉 production.rb

ActionMailer::Base.default :from => "Company Name <no-reply@production-server.ca>"

회사 이름 주위에 인용문을 두는 것은 Rails3에서 저에게 효과적이지 않았습니다.


:from => "Company Name <no-reply@email.com>"환경 제한이없는 경우 이와 같이 mailer.rb 파일에 직접 넣을 수도 있습니다 .
Puce

8

Rails 2.3.3 내에서 ActionMailer 내 버그가 도입되었습니다. 여기에서 티켓 # 2340을 볼 수 있습니다 . 2-3-stable 및 master에서 해결되므로 3.x 및 2.3.6에서 수정됩니다.

2.3. * 내에서 문제를 해결하려면 티켓 주석에 제공된 코드를 사용할 수 있습니다.

module ActionMailer
  class Base
    def perform_delivery_smtp(mail)
      destinations = mail.destinations
      mail.ready_to_send
      sender = (mail['return-path'] && mail['return-path'].spec) || Array(mail.from).first

      smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
      smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
      smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
                 smtp_settings[:authentication]) do |smtp|
        smtp.sendmail(mail.encoded, sender, destinations)
      end
    end
  end
end

2
내 질문이있는 사람은 "이 코드를 어디에 두어야합니까?" 대답은 [rails app root] / config / initializers 디렉토리에 .rb 파일로 저장하는 것입니다.
JellicleCat 2012

6

내가 사용하고 싶은 버전은

%`"#{account.full_name}" <#{account.email}>`

`<<는 백틱입니다.

최신 정보

당신은 또한 그것을 변경할 수 있습니다

%|"#{account.full_name}" <#{account.email}>|
%\"#{account.full_name}" <#{account.email}>\
%^"#{account.full_name}" <#{account.email}>^
%["#{account.full_name}" <#{account.email}>]

문자열 리터럴에 대해 자세히 알아보세요.


1

적어도 새로운 AR 형식의 또 다른 짜증나는 측면은 'default'가 클래스 수준에서 호출된다는 것을 기억하는 것입니다. 인스턴스 전용 루틴을 참조하면 자동으로 실패하고 사용하려고 할 때 제공됩니다.

 NoMethodError: undefined method `new_post' for Notifier:Class

내가 사용한 결과는 다음과 같습니다.

def self.named_email(name,email) "\"#{name}\" <#{email}>" end
default :from => named_email(user.name, user.email)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.