mirror of
https://github.com/discourse/discourse.git
synced 2025-06-05 08:07:17 +08:00
First stab at polling support for POP3S / reply by email
This commit is contained in:
@ -1,19 +0,0 @@
|
||||
module Email
|
||||
|
||||
class IncomingMessage
|
||||
|
||||
attr_reader :reply_key,
|
||||
:body_plain
|
||||
|
||||
def initialize(reply_key, body)
|
||||
@reply_key = reply_key
|
||||
@body = body
|
||||
end
|
||||
|
||||
def reply
|
||||
@reply ||= EmailReplyParser.read(@body).visible_text
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
@ -55,6 +55,9 @@ module Email
|
||||
result['List-Unsubscribe'] = "<#{template_args[:user_preferences_url]}>" if @opts[:add_unsubscribe_link]
|
||||
end
|
||||
|
||||
result['Discourse-Post-Id'] = @opts[:post_id].to_s if @opts[:post_id]
|
||||
result['Discourse-Topic-Id'] = @opts[:topic_id].to_s if @opts[:topic_id]
|
||||
|
||||
if allow_reply_by_email?
|
||||
result['Discourse-Reply-Key'] = reply_key
|
||||
result['Reply-To'] = reply_by_email_address
|
||||
|
@ -1,29 +1,58 @@
|
||||
#
|
||||
# Handles an incoming message
|
||||
#
|
||||
require_dependency 'email/incoming_message'
|
||||
|
||||
module Email
|
||||
class Receiver
|
||||
|
||||
def self.results
|
||||
@results ||= Enum.new(:unprocessable)
|
||||
@results ||= Enum.new(:unprocessable, :missing, :processed)
|
||||
end
|
||||
|
||||
def initialize(incoming_message)
|
||||
@incoming_message = incoming_message
|
||||
attr_reader :body, :reply_key, :email_log
|
||||
|
||||
def initialize(raw)
|
||||
@raw = raw
|
||||
end
|
||||
|
||||
def process
|
||||
return Email::Receiver.results[:unprocessable] if @raw.blank?
|
||||
|
||||
if @incoming_message.blank? || @incoming_message.reply_key.blank?
|
||||
return Email::Receiver.results[:unprocessable]
|
||||
message = Mail::Message.new(@raw)
|
||||
return Email::Receiver.results[:unprocessable] if message.body.blank?
|
||||
|
||||
@body = EmailReplyParser.read(message.body.to_s).visible_text
|
||||
return Email::Receiver.results[:unprocessable] if @body.blank?
|
||||
|
||||
@reply_key = message.to.first
|
||||
|
||||
# Extract the `reply_key` from the format the site has specified
|
||||
tokens = SiteSetting.reply_by_email_address.split("%{reply_key}")
|
||||
tokens.each do |t|
|
||||
@reply_key.gsub!(t, "") if t.present?
|
||||
end
|
||||
|
||||
log = EmailLog.where(reply_key: @incoming_message.reply_key).first
|
||||
return Email::Receiver.results[:unprocessable] if log.blank?
|
||||
# Look up the email log for the reply key
|
||||
@email_log = EmailLog.for(reply_key)
|
||||
return Email::Receiver.results[:missing] if @email_log.blank?
|
||||
|
||||
nil
|
||||
create_reply
|
||||
|
||||
Email::Receiver.results[:processed]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def create_reply
|
||||
|
||||
# Try to post the body as a reply
|
||||
creator = PostCreator.new(email_log.user,
|
||||
raw: @body,
|
||||
topic_id: @email_log.topic_id,
|
||||
reply_to_post_number: @email_log.post.post_number)
|
||||
|
||||
creator.create
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -42,14 +42,29 @@ module Email
|
||||
to_address = @message.to
|
||||
to_address = to_address.first if to_address.is_a?(Array)
|
||||
|
||||
email_log = EmailLog.new(email_type: @email_type, to_address: to_address, user_id: @user.try(:id))
|
||||
email_log = EmailLog.new(email_type: @email_type,
|
||||
to_address: to_address,
|
||||
user_id: @user.try(:id))
|
||||
|
||||
email_log.post_id = @messager
|
||||
add_header_to_log('Discourse-Reply-Key', email_log, :reply_key)
|
||||
add_header_to_log('Discourse-Post-Id', email_log, :post_id)
|
||||
add_header_to_log('Discourse-Topic-Id', email_log, :topic_id)
|
||||
|
||||
reply_key = @message.header['Discourse-Reply-Key'].to_s
|
||||
email_log.reply_key = reply_key if reply_key.present?
|
||||
email_log.save!
|
||||
email_log
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def add_header_to_log(name, email_log, email_log_field)
|
||||
header = @message.header[name]
|
||||
return unless header
|
||||
|
||||
val = header.value
|
||||
email_log[email_log_field] = val if val.present?
|
||||
end
|
||||
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user