مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2025-11-30 21:32:30 +00:00
136 أسطر
5.8 KiB
Ruby
136 أسطر
5.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module LegacyAPI
|
|
class SendController < BaseController
|
|
|
|
ERROR_MESSAGES = {
|
|
"NoRecipients" => "There are no recipients defined to receive this message",
|
|
"NoContent" => "There is no content defined for this e-mail",
|
|
"TooManyToAddresses" => "The maximum number of To addresses has been reached (maximum 50)",
|
|
"TooManyCCAddresses" => "The maximum number of CC addresses has been reached (maximum 50)",
|
|
"TooManyBCCAddresses" => "The maximum number of BCC addresses has been reached (maximum 50)",
|
|
"FromAddressMissing" => "The From address is missing and is required",
|
|
"UnauthenticatedFromAddress" => "The From address is not authorised to send mail from this server",
|
|
"AttachmentMissingName" => "An attachment is missing a name",
|
|
"AttachmentMissingData" => "An attachment is missing data"
|
|
}.freeze
|
|
|
|
# Send a message with the given options
|
|
#
|
|
# URL: /api/v1/send/message
|
|
#
|
|
# Parameters: to => REQ: An array of emails addresses
|
|
# cc => An array of email addresses to CC
|
|
# bcc => An array of email addresses to BCC
|
|
# from => The name/email to send the email from
|
|
# sender => The name/email of the 'Sender'
|
|
# reply_to => The name/email of the 'Reply-to'
|
|
# plain_body => The plain body
|
|
# html_body => The HTML body
|
|
# bounce => Is this message a bounce?
|
|
# tag => A custom tag to add to the message
|
|
# custom_headers => A hash of custom headers
|
|
# attachments => An array of attachments
|
|
# (name, content_type and data (base64))
|
|
#
|
|
# Response: A array of hashes containing message information
|
|
# OR an error if there is an issue sending the message
|
|
#
|
|
def message
|
|
attributes = {}
|
|
attributes[:to] = api_params["to"]
|
|
attributes[:cc] = api_params["cc"]
|
|
attributes[:bcc] = api_params["bcc"]
|
|
attributes[:from] = api_params["from"]
|
|
attributes[:sender] = api_params["sender"]
|
|
attributes[:subject] = api_params["subject"]
|
|
attributes[:reply_to] = api_params["reply_to"]
|
|
attributes[:plain_body] = api_params["plain_body"]
|
|
attributes[:html_body] = api_params["html_body"]
|
|
attributes[:bounce] = api_params["bounce"] ? true : false
|
|
attributes[:tag] = api_params["tag"]
|
|
attributes[:custom_headers] = api_params["headers"] if api_params["headers"]
|
|
attributes[:attachments] = []
|
|
|
|
(api_params["attachments"] || []).each do |attachment|
|
|
next unless attachment.is_a?(Hash)
|
|
|
|
attributes[:attachments] << { name: attachment["name"], content_type: attachment["content_type"], data: attachment["data"], base64: true }
|
|
end
|
|
|
|
message = OutgoingMessagePrototype.new(@current_credential.server, request.ip, "api", attributes)
|
|
message.credential = @current_credential
|
|
if message.valid?
|
|
result = message.create_messages
|
|
render_success message_id: message.message_id, messages: result
|
|
else
|
|
render_error message.errors.first, message: ERROR_MESSAGES[message.errors.first]
|
|
end
|
|
end
|
|
|
|
# Send a message by providing a raw message
|
|
#
|
|
# URL: /api/v1/send/raw
|
|
#
|
|
# Parameters: rcpt_to => REQ: An array of email addresses to send
|
|
# the message to
|
|
# mail_from => REQ: the address to send the email from
|
|
# data => REQ: base64-encoded mail data
|
|
#
|
|
# Response: A array of hashes containing message information
|
|
# OR an error if there is an issue sending the message
|
|
#
|
|
def raw
|
|
unless api_params["rcpt_to"].is_a?(Array)
|
|
render_parameter_error "`rcpt_to` parameter is required but is missing"
|
|
return
|
|
end
|
|
|
|
if api_params["mail_from"].blank?
|
|
render_parameter_error "`mail_from` parameter is required but is missing"
|
|
return
|
|
end
|
|
|
|
if api_params["data"].blank?
|
|
render_parameter_error "`data` parameter is required but is missing"
|
|
return
|
|
end
|
|
|
|
# Decode the raw message
|
|
raw_message = Base64.decode64(api_params["data"])
|
|
|
|
# Parse through mail to get the from/sender headers
|
|
mail = Mail.new(raw_message.split("\r\n\r\n", 2).first)
|
|
from_headers = { "from" => mail.from, "sender" => mail.sender }
|
|
authenticated_domain = @current_credential.server.find_authenticated_domain_from_headers(from_headers)
|
|
|
|
# If we're not authenticated, don't continue
|
|
if authenticated_domain.nil?
|
|
render_error "UnauthenticatedFromAddress"
|
|
return
|
|
end
|
|
|
|
# Store the result ready to return
|
|
result = { message_id: nil, messages: {} }
|
|
if api_params["rcpt_to"].is_a?(Array)
|
|
api_params["rcpt_to"].uniq.each do |rcpt_to|
|
|
message = @current_credential.server.message_db.new_message
|
|
message.rcpt_to = rcpt_to
|
|
message.mail_from = api_params["mail_from"]
|
|
message.raw_message = raw_message
|
|
message.received_with_ssl = true
|
|
message.scope = "outgoing"
|
|
message.domain_id = authenticated_domain.id
|
|
message.credential_id = @current_credential.id
|
|
message.bounce = api_params["bounce"] ? true : false
|
|
message.save
|
|
result[:message_id] = message.message_id if result[:message_id].nil?
|
|
result[:messages][rcpt_to] = { id: message.id, token: message.token }
|
|
end
|
|
end
|
|
render_success result
|
|
end
|
|
|
|
end
|
|
end
|