Как отправить электронное письмо с почтой в рубине на рельсах
Я пытаюсь отправить электронное письмо, используя почту. Но, к сожалению, это не работает. Это мой контроллер.
def create
fn = params["firstname"]
ln = params["lastname"]
email = params["email"]
file = params["file"]
summery = params["summery"]
email_body = "Hello\n This is Your favorite website.\nA I want to personaly say hi."
mail = Mail.new do
from 'someone@gmail.com'
to email
subject "Saying Hi"
body email_body
end
mail.add_file(filename: file.original_filename, content: File.read(file.tempfile.path)) unless file.nil?
mail.deliver!
render json: {message: "A bug has been created", success: true}, status: 201
end
Этот код вызывает эту ошибку
Errno::ECONNREFUSED - соединение отклонено - connect(2) для порта 25 "localhost":
Однако, когда я устанавливаю mailcatcher и настраиваю свой контроллер для отправки почты в mailcatcher, я вижу письмо в своем интерфейсе mailcatcher.
Mail.defaults do
delivery_method :smtp, address: "localhost", port: 1025
end
Также я добавил эти две строки в мой config/environment / development.rb
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
Из моих поисков я обнаружил, что некоторые люди упоминают, что не отправляют электронную почту в режиме разработки, однако в этом случае я действительно хочу протестировать все возможности.
Обновить
Как @Uzbekjon и @SimoneCarletti предложили мне изменить мой код для использования ActionMailer. Я создал файл в app/mailer/, и я вызываю его с моего контроллера.
def create
fn = params["firstname"]
ln = params["lastname"]
email = params["email"]
file = params["file"]
summery = params["summery"]
email_body = "Hello\n This is Your favorite website.\nA I want to personaly say hi."
WelcomeMailer.welcome(fn, ln, email, file, email_body).deliver_now
render json: {message: "An Email has been send", success: true}, status: 201
end
и это мой почтовик
class WelcomeMailer < ActionMailer::Base
default from: "someone@yahoo.com"
def welcome(first_name, last_name, email, file, email_body)
attachments["#{file.original_filename}"] = File.read("#{file.tempfile.path}")
mail(
to: email,
subject: 'Welcome to My Awesome Site',
body: email_body
)
end
end
Однако я все еще получаю ту же ошибку.
Errno::ECONNREFUSED - соединение отклонено - connect(2) для порта 25 "localhost":
Ответ
Итак, я нашел решение. Да, вам нужно использовать ActionMailer. После этого вам нужно перейти в config/environment / development.rb, изменить и добавить следующие строки:
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:user_name => "YOUR EMAIL",
:password => "YOUR Password",
:authentication => "plain",
:enable_starttls_auto => true
}
Также если Gmail жаловался на это:
Net:: SMTPAuthenticationError - 534-5.7.9 Требуется пароль для конкретного приложения
Перейдите по этой ссылке и разрешите менее защищенному приложению доступ к Gmail.
Другие конфигурации доступны для других сервисов, таких как Yahoo. Просто Google это.
2 ответа
Errno::ECONNREFUSED - соединение отклонено - connect(2) для порта 25 "localhost":
Похоже mail
gem пытается подключиться к локальному серверу smtp через порт 25. Скорее всего, у вас нет службы, работающей и получающей подключения через порт 25.
Решить, установить и запустить sendmail
или же postfix
на твоей машине.
PS. использование ActionMailer
,
У вас нет почтового сервера, работающего на порту 25. Вы можете установить postfix и запустить сервер, используя
sudo postfix start
А затем измените настройки в config/environments/development.rb
config.action_mailer.delivery_method = :sendmail
Надеюсь это поможет.