مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2025-12-01 05:43:04 +00:00
110 أسطر
5.2 KiB
Ruby
110 أسطر
5.2 KiB
Ruby
controller :send do
|
||
friendly_name "Send API"
|
||
description "This API allows you to send messages"
|
||
authenticator :server
|
||
|
||
action :message do
|
||
title "Send a message"
|
||
description "This action allows you to send a message by providing the appropriate options"
|
||
# Acceptable Parameters
|
||
param :to, "The e-mail addresses of the recipients (max 50)", :type => Array
|
||
param :cc, "The e-mail addresses of any CC contacts (max 50)", :type => Array
|
||
param :bcc, "The e-mail addresses of any BCC contacts (max 50)", :type => Array
|
||
param :from, "The e-mail address of the sender", :type => String
|
||
param :subject, "The subject of the e-mail", :type => String
|
||
param :tag, "The tag of the e-mail", :type => String
|
||
param :reply_to, "Set the reply-to address for the mail", :type => String
|
||
param :plain_body, "The plain text body of the e-mail", :type => String
|
||
param :html_body, "The HTML body of the e-mail", :type => String
|
||
param :attachments, "An array of attachments for this e-mail", :type => Array
|
||
param :headers, "A hash of additional headers", :type => Hash
|
||
param :bounce, "Is this message a bounce?", :type => :boolean
|
||
# Errors
|
||
error 'ValidationError', "The provided data was not sufficient to send an email", :attributes => {:errors => "A hash of error details"}
|
||
error 'NoRecipients', "There are no recipients defined to received this message"
|
||
error 'NoContent', "There is no content defined for this e-mail"
|
||
error 'TooManyToAddresses', "The maximum number of To addresses has been reached (maximum 50)"
|
||
error 'TooManyCCAddresses', "The maximum number of CC addresses has been reached (maximum 50)"
|
||
error 'TooManyBCCAddresses', "The maximum number of BCC addresses has been reached (maximum 50)"
|
||
error 'FromAddressMissing', "The From address is missing and is required"
|
||
error 'UnauthenticatedFromAddress', "The From address is not authorised to send mail from this server"
|
||
error 'AttachmentMissingName', "An attachment is missing a name"
|
||
error 'AttachmentMissingData', "An attachment is missing data"
|
||
# Return
|
||
returns Hash
|
||
# Action
|
||
action do
|
||
attributes = {}
|
||
attributes[:to] = params.to
|
||
attributes[:cc] = params.cc
|
||
attributes[:bcc] = params.bcc
|
||
attributes[:from] = params.from
|
||
attributes[:sender] = params.sender
|
||
attributes[:subject] = params.subject
|
||
attributes[:reply_to] = params.reply_to
|
||
attributes[:plain_body] = params.plain_body
|
||
attributes[:html_body] = params.html_body
|
||
attributes[:bounce] = params.bounce ? true : false
|
||
attributes[:tag] = params.tag
|
||
attributes[:custom_headers] = params.headers
|
||
attributes[:attachments] = []
|
||
(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(identity.server, request.ip, 'api', attributes)
|
||
message.credential = identity
|
||
if message.valid?
|
||
result = message.create_messages
|
||
{:message_id => message.message_id, :messages => result}
|
||
else
|
||
error message.errors.first
|
||
end
|
||
end
|
||
end
|
||
|
||
action :raw do
|
||
title "Send a raw RFC2882 message"
|
||
description "This action allows you to send us a raw RFC2822 formatted message along with the recipients that it should be sent to. This is similar to sending a message through our SMTP service."
|
||
param :mail_from, "The address that should be logged as sending the message", :type => String, :required => true
|
||
param :rcpt_to, "The addresses this message should be sent to", :type => Array, :required => true
|
||
param :data, "A base64 encoded RFC2822 message to send", :type => String, :required => true
|
||
param :bounce, "Is this message a bounce?", :type => :boolean
|
||
returns Hash
|
||
error 'UnauthenticatedFromAddress', "The From address is not authorised to send mail from this server"
|
||
action do
|
||
# Decode the raw message
|
||
raw_message = Base64.decode64(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 = identity.server.find_authenticated_domain_from_headers(from_headers)
|
||
|
||
# If we're not authenticated, don't continue
|
||
if authenticated_domain.nil?
|
||
error 'UnauthenticatedFromAddress'
|
||
end
|
||
|
||
# Store the result ready to return
|
||
result = {:message_id => nil, :messages => {}}
|
||
params.rcpt_to.uniq.each do |rcpt_to|
|
||
message = identity.server.message_db.new_message
|
||
message.rcpt_to = rcpt_to
|
||
message.mail_from = 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 = identity.id
|
||
message.bounce = params.bounce ? 1 : 0
|
||
message.save
|
||
result[:message_id] = message.message_id if result[:message_id].nil?
|
||
result[:messages][rcpt_to] = {:id => message.id, :token => message.token}
|
||
end
|
||
result
|
||
end
|
||
end
|
||
|
||
end
|