Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Настройка smtp Yandex в Rails

#ruby_on_rails #яндекс #smtp


Добрый день

Для реализации отправки сообщений из приложения было опробовано два пути: первый
- компактный, и хоть не без проблем, но отправка сообщения происходит.

Второй (следуя руководству по ActionMailer) - не такой компактный и сообщения не
отправляются.

Хочу разобраться с обоими

Вариант 1

#app/controllers/feedback_info_controller.rb

def send_mail
 smtp = Net::SMTP.new( "smtp.yandex.ru", 587 )
 smtp.enable_starttls
 smtp.start( "yandex.ru", "my_adr@yandex.ru", "пароль", :plain ) do |conn|
 conn.send_message "Сообщение", "my_adr@yandex.ru", "получатель@rambler.ru"
end


В этом случае, на почту получатель@rambler.ru приходит письмо (без темы) от MAILER-DAEMON@
со следующим содержанием:


  by mail172.rambler.ru (rmaild SMTP 1.2.41)
  
  with ESMTP id 292593804 for получатель@rambler.ru; Mon, 24 Aug 2015 11:13:46 +0300
  
  Received: from forward22m.cmail.yandex.net (forward22m.cmail.yandex.net [5.255.216.16])

    by mx2.mail.rambler.ru (Postfix) with ESMTP id 65FF15CA8
    for <получатель@rambler.ru>; Mon, 24 Aug 2015 11:13:46 +0300 (MSK) 

  
  Received: from smtp3m.mail.yandex.net (smtp3m.mail.yandex.net [IPv6:2a02:6b8:0:2519::125])

    by forward22m.cmail.yandex.net (Yandex) with ESMTP id 488F18046B
    for <получатель@rambler.ru>; Mon, 24 Aug 2015 11:13:46 +0300 (MSK)

  
  Received: from smtp3m.mail.yandex.net (localhost [127.0.0.1])

    by smtp3m.mail.yandex.net (Yandex) with ESMTP id 2C1A127A05B8
    for <получатель@rambler.ru>; Mon, 24 Aug 2015 11:13:46 +0300 (MSK)

  
  Received: by smtp3m.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id lnLUHk87ag-DjpWkB95;
  
  Mon, 24 Aug 2015 11:13:45 +0300
  
  (using TLSv1 with cipher AES128-SHA (128/128 bits))
  
  (Client certificate not present)
  
  Message-Id: <20150824111345.DjpWkB95@smtp3m.mail.yandex.net>
  
  Date: Mon, 24 Aug
  
  2015 11:13:45 +0300 
  
  From: MAILER-DAEMON 
  
  To: undisclosed-recipients:;
  
  X-Spam: yes


Вариант 2

Создание и использование рассыльщика FeedbackMailer

   #app/mailers/application_mailer.rb
    class ApplicationMailer < ActionMailer::Base 
    end

   #app/mailers/feedback_mailer.rb
    class FeedbackMailer < ApplicationMailer
    def feedback_email
      mail(from: 'my_adr@yandex.ru', to: 'получатель@rambler.ru', subject: 'тема')
    end
    end 

   #app/controllers/feedback_info_controller.rb
    def feedback_send
       FeedbackMailer.feedback_email
    end

  #config/environments/development.rb
    config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
    config.action_mailer.delivery_method = :smtp
    config.action_mailer.smtp_settings = {
        address: 'smtp.yandex.ru',
        port: 587,
        domain: 'yandex.ru',
        authentication: 'plain',
        user_name: 'my_adr@yandex.ru',
        password: 'пароль',
        enable_starttls_auto: true
    }


с такими настройками ничего не происходит
    


Ответы

Ответ 1



config.action_mailer.smtp_settings = { tls: true, ... Без этого yandex не работает. Причем tls: в официальной документации нет.

Ответ 2



Работает с такими настройками: #development.rb config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :tls => true, address: 'smtp.yandex.ru', port: 465, domain: 'yandex.ru', authentication: 'plain', user_name: 'name@yandex.ru', password: 'пароль' } #mailers/application_mailer.rb class ApplicationMailer < ActionMailer::Base end #mailers/feedback_mailer.rb class FeedbackMailer < ApplicationMailer def feedback_email (name, phone, comment) @name = name @phone = phone @comment = comment mail(from: 'name@yandex.ru', to: 'adrr@example.com', subject: 'Тема письма') end end #controllers/feedback_info_controller.rb def feedback_send @name = CGI.escapeHTML(params[:feedback_info][:name]) @phone = CGI.escapeHTML(params[:feedback_info][:phone]) @comment = CGI.escapeHTML(params[:feedback_info][:comment]) FeedbackMailer.feedback_email(@name,@phone,@comment).deliver_now end

Ответ 3



Во втором варианте вы пропустили, собственно, доставку. Вы создали объект письма, но не запустили отправку. С Rails 4.2+ можно спокойно использовать .deliver_later: FeedbackMailer.feedback_email.deliver_later Но сначала перечитайте руководство, особенно этот абзац: Поведением Active Job по умолчанию является запуск заданий :inline. Поэтому можно использовать deliver_later для отсылки писем прямо сейчас, а если позже решите отправлять письма в фоновой задаче, вам нужно будет всего лишь настроить Active Job для использования бэкэнда очередей (Sidekiq, Resque и т.п.).

Ответ 4



В Rails 5 для настройки в config/environments/production.rb добавил: config.action_mailer.default_url_options = { host: 'www.yoursite.ru' } config.action_mailer.perform_deliveries = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { tls: true, address: "smtp.yandex.com", port: 465, domain: "yandex.com", authentication: "plain", enable_starttls_auto: true, user_name: 'youremail@yandex.ru', password: 'yourpassword' } Все отлично работает, в том числе с почтой для домена (pdd.yandex.ru). Однако в отличии от gmail, письмо не сохраняется в папке отправленные на сервере.

Комментариев нет:

Отправить комментарий