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.