- Konu sahibi
- #1
Ruby on Rails’te e-posta göndermek için Action Mailer ile bir ileti sınıfı ve şablonu oluşturun, ardından SMTP sunucusu ayarlarını yapıp iletiyi gönderin. Aşağıdaki örnek, geliştirme ortamından gerçek bir adrese deneme e-postası gönderir; bunun için SMTP erişimi ve sağlayıcının izin verdiği bir gönderen adresi gerekir.
Oluşturulan
Oluşturucu bir HTML şablonu da oluşturabilir. Bu örnekte yalnız düz metin göndermek için
Buradaki
Parolayı kaynak koduna veya Git deposuna yazmayın. Konsolu başlatacağınız ortamda
Kimlik doğrulama hatasında kullanıcı adını, parolayı ve sağlayıcının istediği doğrulama yöntemini karşılaştırın. Bağlantı veya TLS hatasında sunucu adını, portu, STARTTLS gereksinimini ve uygulamanın sunucuya erişimini kontrol edin. Hata sürerse sağlayıcıya zaman bilgisini, alıcı adresini ve hata kodunu ileterek gönderimin neden reddedildiğini sorun; parola veya gizli anahtar paylaşmayın.
Mailer ve ileti şablonunu oluşturun
Mevcut Rails uygulamanızın kök dizininde şu komutu çalıştırın:
Kod:
bin/rails generate mailer UserMailer welcome
Oluşturulan
app/mailers/user_mailer.rb dosyasındaki sınıfı aşağıdaki gibi düzenleyin. Bu varsayımsal örnek, bir kullanıcı modeli gerektirmeden alıcı adresini doğrudan alır:
Ruby:
class UserMailer < ApplicationMailer
def welcome(email)
@email = email
mail(to: @email, subject: "Hoş geldiniz")
end
end
app/views/user_mailer/welcome.text.erb dosyasının içeriğini aşağıdaki gibi kaydedin. Bu dosya, gönderilecek iletinin düz metin gövdesidir:
Kod:
Merhaba <%= @email %>,
Hesabınıza hoş geldiniz.
Oluşturucu bir HTML şablonu da oluşturabilir. Bu örnekte yalnız düz metin göndermek için
app/views/user_mailer/welcome.html.erb dosyasını silin.SMTP ayarlarını girin
SMTP, uygulamanın e-postayı bir gönderim sunucusuna aktarmak için kullandığı protokoldür. Sağlayıcınızdan sunucu adresini, portu, kullanıcı adını, parolayı veya uygulama parolasını, desteklenen kimlik doğrulama yöntemini ve kullanabileceğiniz gönderen adresini alın. Sağlayıcının bu örnektekiplain kimlik doğrulamasını ve STARTTLS yöntemini desteklemesi gerekir; farklı bir yöntem istiyorsa ayarları sağlayıcının bilgilerine göre değiştirin.config/environments/development.rb dosyasında, mevcut Rails.application.configure do bloğunun içine şunları ekleyin veya varsa ilgili ayarları güncelleyin:
Ruby:
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
address: ENV.fetch("SMTP_ADDRESS"),
port: ENV.fetch("SMTP_PORT", "587").to_i,
domain: ENV.fetch("SMTP_DOMAIN"),
user_name: ENV.fetch("SMTP_USERNAME"),
password: ENV.fetch("SMTP_PASSWORD"),
authentication: :plain,
enable_starttls: true
}
Buradaki
domain, SMTP görüşmesinde bildirilen alan adıdır; sağlayıcınızın istediği değeri kullanın. STARTTLS bağlantıyı şifrelemeye geçirir. Örnekteki 587 varsayılanı her hizmet için geçerli değildir; sağlayıcının verdiği portu ve bağlantı türünü kullanın. Doğrudan TLS kullanan bir sunucu için bu STARTTLS örneğini değiştirmek gerekir.app/mailers/application_mailer.rb dosyasındaki sınıfı, varsayılan göndereni ortam değişkeninden alacak şekilde düzenleyin:
Ruby:
class ApplicationMailer < ActionMailer::Base
default from: ENV.fetch("MAIL_FROM")
layout "mailer"
end
Parolayı kaynak koduna veya Git deposuna yazmayın. Konsolu başlatacağınız ortamda
SMTP_ADDRESS, SMTP_PORT, SMTP_DOMAIN, SMTP_USERNAME, SMTP_PASSWORD ve MAIL_FROM değişkenlerini sağlayıcınızın gerçek bilgileriyle tanımlayın.- Gönderen adresi olarak sağlayıcının kullanımına izin verdiği adresi seçin.
- Ayarları değiştirdikten sonra açık Rails süreçlerini yeniden başlatın.
Deneme iletisini gönderin ve sonucu kontrol edin
Uygulama dizinindebin/rails console komutuyla konsolu açın. Aşağıdaki adrese kendi erişebildiğiniz gerçek adresinizi yazarak çalıştırın:
Ruby:
UserMailer.welcome("[email protected]").deliver_now
deliver_now, gönderimi komut çalışırken yapar. İşlem hatasız tamamlanırsa sunucunun iletiyi kabul etmiş olması beklenir; bu, iletinin alıcının gelen kutusuna ulaştığını veya okunacağını garanti etmez. Gelen kutusunu ve gereksiz posta klasörünü kontrol edin. İleti görünmüyorsa sağlayıcının gönderim kayıtlarında alıcı, zaman ve varsa ret veya geri dönüş bilgisini arayın.Kimlik doğrulama hatasında kullanıcı adını, parolayı ve sağlayıcının istediği doğrulama yöntemini karşılaştırın. Bağlantı veya TLS hatasında sunucu adını, portu, STARTTLS gereksinimini ve uygulamanın sunucuya erişimini kontrol edin. Hata sürerse sağlayıcıya zaman bilgisini, alıcı adresini ve hata kodunu ileterek gönderimin neden reddedildiğini sorun; parola veya gizli anahtar paylaşmayın.
Sık sorulan sorular
Gönderimi arka planda yapabilir miyim?
Evet.
deliver_now yerine deliver_later kullanıldığında iş Active Job üzerinden kuyruğa verilir. Bunun gerçekten işlenmesi için uygulamanızın kuyruk yapılandırmasının ve gerekiyorsa işçi sürecinin çalışması gerekir. İşin kuyruğa alınması, e-postanın teslim edildiği anlamına gelmez.Gerçek alıcıya göndermeden deneyebilir miyim?
Evet. Geliştirme ortamında yerel bir SMTP yakalayıcı kullanarak iletiyi gerçek alıcıya göndermeden içeriğini inceleyebilirsiniz. Bu durumda SMTP adresini ve portunu yakalayıcının çalıştığı ortama göre ayarlayın; yakalanan bir ileti, gerçek sağlayıcı üzerinden teslimatın başarılı olacağını kanıtlamaz.
Moderatör tarafında düzenlendi: