Метод deliver_notification
всегда должен возвращать объект TMail
независимо от успеха или неудачи.Существует настройка raise_delivery_errors
, которая позволяет почтовой программе вызывать исключения в случае возникновения проблем, но вам придется спасать их в своем блоке и увеличивать при успехе.
Из-за способа доставки почтыActionMailer, часто бывает, что вы не будете знать, является ли сообщение успешным или нет.Электронная почта обычно ставится в очередь и доставляется в момент времени, значительно превышающий вызов метода, и большинство ошибок возникает в этот момент из-за любого количества трудностей с доставкой.Это только сильно искаженные адреса электронной почты, которые будут отклонены сразу, или если механизм доставки почты не работает.
Редактировать: Добавлено отслеживание исключений
count = 0
@users.each do |user|
begin
Notifier.deliver_notification(
user.email_address,
@sub,
@body,
user.unsubscribe_link
)
count += 1
rescue => e
# Something went wrong, should probably store these and examine them, or
# at the very least use Rails.logger
end
end
flash[:notice] = "Mail was sent to #{count} people"
Ваш пример использовал index++
, который не поддерживается Ruby.То, что вы, вероятно, хотите, это index += 1
.Вы также использовали массив @users
напрямую вместо отдельных элементов.