2014-03-17 01:53:13 -04:00
|
|
|
require "pathname"
|
|
|
|
require "net/http"
|
|
|
|
require "uri"
|
|
|
|
|
|
|
|
require "sinatra"
|
|
|
|
require "skinny"
|
|
|
|
|
|
|
|
require "mail_catcher/events"
|
|
|
|
require "mail_catcher/mail"
|
|
|
|
|
|
|
|
class Sinatra::Request
|
|
|
|
include Skinny::Helpers
|
|
|
|
end
|
|
|
|
|
|
|
|
module MailCatcher
|
|
|
|
module Web
|
|
|
|
class Application < Sinatra::Base
|
2014-03-25 21:09:11 -04:00
|
|
|
set :development, ENV["MAILCATCHER_ENV"] == "development"
|
2014-03-17 01:53:13 -04:00
|
|
|
set :root, File.expand_path("#{__FILE__}/../../../..")
|
|
|
|
|
2014-03-25 21:09:11 -04:00
|
|
|
if development?
|
|
|
|
require "sprockets-helpers"
|
|
|
|
|
|
|
|
configure do
|
|
|
|
require "mail_catcher/web/assets"
|
|
|
|
Sprockets::Helpers.configure do |config|
|
2015-01-16 23:08:26 -05:00
|
|
|
config.environment = Assets
|
2014-03-25 21:09:11 -04:00
|
|
|
config.prefix = "/assets"
|
|
|
|
config.digest = false
|
|
|
|
config.public_path = public_folder
|
|
|
|
config.debug = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
helpers do
|
|
|
|
include Sprockets::Helpers
|
|
|
|
end
|
|
|
|
else
|
|
|
|
helpers do
|
|
|
|
def javascript_tag(name)
|
|
|
|
%{<script src="/assets/#{name}.js"></script>}
|
|
|
|
end
|
|
|
|
|
|
|
|
def stylesheet_tag(name)
|
|
|
|
%{<link rel="stylesheet" href="/assets/#{name}.css">}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-03-17 01:53:13 -04:00
|
|
|
get "/" do
|
2015-01-16 23:03:00 -05:00
|
|
|
erb :index
|
2014-03-17 01:53:13 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
delete "/" do
|
|
|
|
if MailCatcher.quittable?
|
|
|
|
MailCatcher.quit!
|
|
|
|
status 204
|
|
|
|
else
|
|
|
|
status 403
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages" do
|
|
|
|
if request.websocket?
|
|
|
|
request.websocket!(
|
|
|
|
:on_start => proc do |websocket|
|
2016-04-23 03:45:49 -04:00
|
|
|
subscription = Events::MessageAdded.subscribe { |message| websocket.send_message(JSON.generate(message)) }
|
2014-03-17 01:53:13 -04:00
|
|
|
websocket.on_close do |websocket|
|
|
|
|
Events::MessageAdded.unsubscribe subscription
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
else
|
2015-01-17 00:54:07 -05:00
|
|
|
content_type :json
|
2016-04-23 03:45:49 -04:00
|
|
|
JSON.generate(Mail.messages)
|
2014-03-17 01:53:13 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
delete "/messages" do
|
|
|
|
Mail.delete!
|
|
|
|
status 204
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages/:id.json" do
|
|
|
|
id = params[:id].to_i
|
|
|
|
if message = Mail.message(id)
|
2015-01-17 00:54:07 -05:00
|
|
|
content_type :json
|
2016-04-23 03:45:49 -04:00
|
|
|
JSON.generate(message.merge({
|
2014-03-17 01:53:13 -04:00
|
|
|
"formats" => [
|
|
|
|
"source",
|
|
|
|
("html" if Mail.message_has_html? id),
|
|
|
|
("plain" if Mail.message_has_plain? id)
|
|
|
|
].compact,
|
|
|
|
"attachments" => Mail.message_attachments(id).map do |attachment|
|
|
|
|
attachment.merge({"href" => "/messages/#{escape(id)}/parts/#{escape(attachment["cid"])}"})
|
|
|
|
end,
|
2016-04-23 03:45:49 -04:00
|
|
|
}))
|
2014-03-17 01:53:13 -04:00
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages/:id.html" do
|
|
|
|
id = params[:id].to_i
|
|
|
|
if part = Mail.message_part_html(id)
|
2015-04-16 11:12:01 -04:00
|
|
|
content_type :html, :charset => (part["charset"] || "utf8")
|
2014-03-17 01:53:13 -04:00
|
|
|
|
|
|
|
body = part["body"]
|
|
|
|
|
|
|
|
# Rewrite body to link to embedded attachments served by cid
|
|
|
|
body.gsub! /cid:([^'"> ]+)/, "#{id}/parts/\\1"
|
|
|
|
|
|
|
|
body
|
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages/:id.plain" do
|
|
|
|
id = params[:id].to_i
|
|
|
|
if part = Mail.message_part_plain(id)
|
|
|
|
content_type part["type"], :charset => (part["charset"] || "utf8")
|
|
|
|
part["body"]
|
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages/:id.source" do
|
|
|
|
id = params[:id].to_i
|
|
|
|
if message = Mail.message(id)
|
|
|
|
content_type "text/plain"
|
|
|
|
message["source"]
|
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages/:id.eml" do
|
|
|
|
id = params[:id].to_i
|
|
|
|
if message = Mail.message(id)
|
|
|
|
content_type "message/rfc822"
|
|
|
|
message["source"]
|
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get "/messages/:id/parts/:cid" do
|
|
|
|
id = params[:id].to_i
|
|
|
|
if part = Mail.message_part_cid(id, params[:cid])
|
|
|
|
content_type part["type"], :charset => (part["charset"] || "utf8")
|
|
|
|
attachment part["filename"] if part["is_attachment"] == 1
|
|
|
|
body part["body"].to_s
|
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
delete "/messages/:id" do
|
|
|
|
id = params[:id].to_i
|
2016-04-23 03:45:25 -04:00
|
|
|
if Mail.message(id)
|
2015-01-16 23:08:26 -05:00
|
|
|
Mail.delete_message!(id)
|
2014-03-17 01:53:13 -04:00
|
|
|
status 204
|
|
|
|
else
|
|
|
|
not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
not_found do
|
2015-01-16 23:03:00 -05:00
|
|
|
erb :"404"
|
2014-03-17 01:53:13 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|