mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 03:13:47 +08:00
82 lines
2.4 KiB
Ruby
82 lines
2.4 KiB
Ruby
require_dependency 'email_sender'
|
|
|
|
module Jobs
|
|
|
|
# Asynchronously send an email to a user
|
|
class UserEmail < Jobs::Base
|
|
|
|
def execute(args)
|
|
|
|
# Required parameters
|
|
raise Discourse::InvalidParameters.new(:user_id) unless args[:user_id].present?
|
|
raise Discourse::InvalidParameters.new(:type) unless args[:type].present?
|
|
|
|
# Find the user
|
|
user = User.where(id: args[:user_id]).first
|
|
return unless user.present?
|
|
|
|
seen_recently = (user.last_seen_at.present? && user.last_seen_at > SiteSetting.email_time_window_mins.minutes.ago)
|
|
|
|
email_args = {}
|
|
|
|
if args[:post_id]
|
|
|
|
# Don't email a user about a post when we've seen them recently.
|
|
return if seen_recently
|
|
|
|
post = Post.where(id: args[:post_id]).first
|
|
return unless post.present?
|
|
|
|
# Topic may be deleted
|
|
return unless post.topic
|
|
|
|
# Don't email posts that were deleted
|
|
return if post.user_deleted?
|
|
|
|
# Don't send the email if the user has read the post
|
|
return if PostTiming.where(topic_id: post.topic_id, post_number: post.post_number, user_id: user.id).present?
|
|
|
|
email_args[:post] = post
|
|
end
|
|
|
|
email_args[:email_token] = args[:email_token] if args[:email_token].present?
|
|
|
|
|
|
notification = nil
|
|
notification = Notification.where(id: args[:notification_id]).first if args[:notification_id].present?
|
|
|
|
if notification.present?
|
|
|
|
# Don't email a user about a post when we've seen them recently.
|
|
return if seen_recently
|
|
|
|
# Load the post if present
|
|
if notification.post.present?
|
|
# Don't email a user if the topic has been deleted
|
|
return unless notification.post.topic.present?
|
|
email_args[:post] ||= notification.post
|
|
end
|
|
email_args[:notification] = notification
|
|
|
|
# Don't send email if the notification this email is about has already been read
|
|
return if notification.read?
|
|
end
|
|
|
|
# Make sure that mailer exists
|
|
raise Discourse::InvalidParameters.new(:type) unless UserNotifications.respond_to?(args[:type])
|
|
|
|
message = UserNotifications.send(args[:type], user, email_args)
|
|
|
|
# Update the to address if we have a custom one
|
|
if args[:to_address].present?
|
|
message.to = [args[:to_address]]
|
|
end
|
|
|
|
EmailSender.new(message, args[:type], user).send
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|