Rails ActionMailer - gönderen ve alıcı adını / e-posta adresini biçimlendirin


112

ActionMailer'ı kullanırken gönderen ve alıcı bilgileri için e-posta VE adı belirtmenin bir yolu var mı?

Genellikle yaparsınız:

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

Ama Eee-- olarak adı belirtmek istiyoruz MyCompany <info@mycompany.com>, John Doe <john.doe@mycompany>.

Bunu yapmanın bir yolu var mı?


Rails kılavuzlarında bunun nasıl yapılacağına dair bir örnek vardır: guides.rubyonrails.org/… ayrıca bu soruda başka bir cevabı da görebilirsiniz stackoverflow.com/a/8106387/879854
BF4

Yanıtlar:


237

Ad ve e-posta için kullanıcı girişi alıyorsanız, adı ve e-postayı çok dikkatli bir şekilde doğrulamadığınız veya bunlardan çıkmadığınız sürece, basitçe dizeleri birleştirerek geçersiz bir Kimden başlığı elde edebilirsiniz. İşte güvenli bir yol:

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
Çok teşekkür ederim! String concat'den daha iyi bir yol olduğunu düşündüm, ancak Mail::Addressokuduğum belgelerin hiçbirinde kullanımı net değil.
Tim Morgan

10
address.display_namebazı durumlarda dize kodlamasını değiştiriyor gibi görünüyor, bu nedenle namedaha sonra kullanmayı planlıyorsanız , örneğin raylı posta gönderileri görünümlerinde, doaddress.display_name = name.dup
Eero

7
Görünüşe göre Mail cevheri artık geçen dizeyi kopyalıyor, bu yüzden name.dupartık gerekli görünmüyor. Kaynak okur:@display_name = str.nil? ? nil : str.dup
philoye

Bu, Devise başlatıcısında bile çalışır:config.mailer_sender = Proc.new { address = Mail::Address.new... }
Cimm

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

2
Ben öyle düşünmüyorum. Biri için ASCII olmayan karakterler içeremez, tırnak karakterini içeremez ve başlıklarda da izin verilmeyen / önerilmeyen bazı ASCII karakterleri vardır. RFC2047'nin bu tür değerleri kodlamak için base64 için bir mekanizma sağladığını buldum.
William Denniss

11
bunu yapmanın dizeleri doğru şekilde kodlayan bir yolu için cevabıma bakın.
James McKinney

8
Bu yardımcı oldu! Bilginize, bunu test etmeye çalışıyorsanız, @ email.from yerine @ email.header ['Kimden']. To_s'ye bakmanız gerekecek. İkincisi, adı değil yalnızca e-posta adresini içerir.
sbleon

7
Bunu bu şekilde yapma. Bunun yerine @ JamesMcKinney'nin cevabına bakın.
Matthew Ratzloff

5
Yine, güvensiz olduğu için bunu kullanmayın. Bunun yerine @ JamesMcKinney'nin cevabına bakın.
Jake Petroules

43

Raylarda3 Aşağıdakileri her ortama yerleştiriyorum. ie production.rb

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

Rails3'te şirket adının etrafına alıntı yapmak benim için işe yaramadı.


Ayrıca :from => "Company Name <no-reply@email.com>", ortam kısıtlamalarınız yoksa , bunu doğrudan mailer.rb dosyanıza da koyabilirsiniz .
Puce

8

Rails 2.3.3'te ActionMailer'da bir hata ortaya çıktı. Bileti buradan görebilirsiniz Bilet # 2340 . 2-3-stabil ve master olarak çözüldü, bu yüzden 3.x ve 2.3.6'da düzeltilecek.

2.3. * İçindeki sorunu çözmek için, bilet yorumlarında sağlanan kodu kullanabilirsiniz:

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
Sorum olan herkes için "bu kodu nereye koymalıyım?" yanıt, [rails app root] / config / initializers dizininize bir .rb dosyası olarak kaydetmektir.
JellicleCat

6

Bunu kullanmayı sevdiğim versiyon

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

`<< ters işaretler.

Güncelleme

Bunu şu şekilde de değiştirebilirsiniz:

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

Dize değişmezleri hakkında daha fazla bilgi edinin.


1

En azından yeni AR formatında bir başka rahatsız edici yön, sınıf düzeyinde 'varsayılan' olarak adlandırıldığını hatırlamaktır. Yalnızca örnek olan rutinlere başvurmak, onun sessizce başarısız olmasına ve kullanmaya çalıştığınızda vermesine neden olur:

 NoMethodError: undefined method `new_post' for Notifier:Class

İşte kullanmaya son verdiğim şey:

def self.named_email(name,email) "\"#{name}\" <#{email}>" end
default :from => named_email(user.name, user.email)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.