From 017e7047914a2ba982c4d7c0e65bb64931fff41e Mon Sep 17 00:00:00 2001 From: moparisthebest Date: Thu, 11 Aug 2016 08:23:33 -0400 Subject: [PATCH] Add --show-from-server option to parse the server from the Recieved header and display in a column, off by default --- assets/javascripts/mailcatcher.js.coffee | 6 ++++-- lib/mail_catcher.rb | 9 +++++++++ lib/mail_catcher/mail.rb | 13 ++++++++++--- views/index.erb | 3 +++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/assets/javascripts/mailcatcher.js.coffee b/assets/javascripts/mailcatcher.js.coffee index 3e479ba..44112c5 100644 --- a/assets/javascripts/mailcatcher.js.coffee +++ b/assets/javascripts/mailcatcher.js.coffee @@ -188,12 +188,14 @@ class MailCatcher $("#messages tbody tr").show() addMessage: (message) -> - $("").attr("data-message-id", message.id.toString()) + row = $("").attr("data-message-id", message.id.toString()) .append($("").text(message.sender or "No sender").toggleClass("blank", !message.sender)) .append($("").text((message.recipients || []).join(", ") or "No receipients").toggleClass("blank", !message.recipients.length)) .append($("").text(message.subject or "No subject").toggleClass("blank", !message.subject)) .append($("").text(@formatDate(message.created_at))) - .prependTo($("#messages tbody")) + if 'from_server' of message + row = row.append($("").text(message.from_server or "Unknown").toggleClass("blank", !message.from_server)) + row.prependTo($("#messages tbody")) @updateMessagesCount() scrollToRow: (row) -> diff --git a/lib/mail_catcher.rb b/lib/mail_catcher.rb index 79c98e8..d4d1f3b 100644 --- a/lib/mail_catcher.rb +++ b/lib/mail_catcher.rb @@ -83,6 +83,7 @@ module MailCatcher extend self :sqlite_db => ':memory:', :delete_older_than => nil, :keep_num_emails => nil, + :show_from_server => false, } def options @@ -93,6 +94,10 @@ module MailCatcher extend self options[:quit] end + def show_from_server? + options[:show_from_server] + end + def parse! arguments=ARGV, defaults=@defaults @@defaults.dup.tap do |options| OptionParser.new do |parser| @@ -123,6 +128,10 @@ module MailCatcher extend self options[:quit] = false end + parser.on("--show-from-server", "Show From Server column") do + options[:show_from_server] = true + end + parser.on("--sqlite-db PATH", "Set the path to the sqlite database, default in-memory only") do |db| options[:sqlite_db] = db end diff --git a/lib/mail_catcher/mail.rb b/lib/mail_catcher/mail.rb index bcdbcc9..e044392 100644 --- a/lib/mail_catcher/mail.rb +++ b/lib/mail_catcher/mail.rb @@ -13,6 +13,7 @@ module MailCatcher::Mail extend self sender TEXT, recipients TEXT, subject TEXT, + from_server TEXT, source BLOB, size TEXT, type TEXT, @@ -38,12 +39,13 @@ module MailCatcher::Mail extend self end def add_message(message) - @add_message_query ||= db.prepare("INSERT INTO message (sender, recipients, subject, source, type, size, created_at) VALUES (?, ?, ?, ?, ?, ?, datetime('now'))") + @add_message_query ||= db.prepare("INSERT INTO message (sender, recipients, subject, from_server, source, type, size, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))") mail = Mail.new(message[:source]) + from_server = mail.received ? mail.received.value.sub(/^from\s+/, '').sub(/\s+.*$/, '') : nil sender = (mail.from && !mail.from.empty?) ? mail.from : message[:sender] recipients = (mail.to && !mail.to.empty?) ? mail.to : message[:recipients] - @add_message_query.execute(sender, JSON.generate(recipients), mail.subject, message[:source], mail.mime_type || "text/plain", message[:source].length) + @add_message_query.execute(sender, JSON.generate(recipients), mail.subject, from_server, message[:source], mail.mime_type || "text/plain", message[:source].length) message_id = db.last_insert_row_id parts = mail.all_parts parts = [mail] if parts.empty? @@ -77,7 +79,9 @@ module MailCatcher::Mail extend self end def messages - @messages_query ||= db.prepare "SELECT id, sender, recipients, subject, size, created_at FROM message ORDER BY created_at, id ASC" + @messages_query ||= db.prepare MailCatcher.show_from_server? ? + "SELECT id, sender, recipients, subject, from_server, size, created_at FROM message ORDER BY created_at, id ASC" : + "SELECT id, sender, recipients, subject, size, created_at FROM message ORDER BY created_at, id ASC" @messages_query.execute.map do |row| Hash[row.fields.zip(row)].tap do |message| message["recipients"] &&= JSON.parse(message["recipients"]) @@ -89,6 +93,9 @@ module MailCatcher::Mail extend self @message_query ||= db.prepare "SELECT * FROM message WHERE id = ? LIMIT 1" row = @message_query.execute(id).next row && Hash[row.fields.zip(row)].tap do |message| + unless MailCatcher.show_from_server? + message.delete('from_server') + end message["recipients"] &&= JSON.parse(message["recipients"]) end end diff --git a/views/index.erb b/views/index.erb index 015410e..bfd1d1f 100644 --- a/views/index.erb +++ b/views/index.erb @@ -27,6 +27,9 @@ To Subject Received + <% if MailCatcher.show_from_server? %> + From Server + <% end %>