Module: MailCatcher::Mail
Instance Method Summary collapse
- #add_message(message) ⇒ Object
- #add_message_part(*args) ⇒ Object
- #db ⇒ Object
- #delete! ⇒ Object
- #delete_message!(message_id) ⇒ Object
- #latest_created_at ⇒ Object
- #message(id) ⇒ Object
- #message_attachments(id) ⇒ Object
- #message_has_html?(id) ⇒ Boolean
- #message_has_plain?(id) ⇒ Boolean
- #message_part(message_id, part_id) ⇒ Object
- #message_part_cid(message_id, cid) ⇒ Object
- #message_part_html(message_id) ⇒ Object
- #message_part_plain(message_id) ⇒ Object
- #message_part_type(message_id, part_type) ⇒ Object
- #message_parts(id) ⇒ Object
- #messages ⇒ Object
Instance Method Details
#add_message(message) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/mail_catcher/mail.rb', line 40 def () @add_message_query ||= db.prepare("INSERT INTO message (sender, recipients, subject, source, type, size, created_at) VALUES (?, ?, ?, ?, ?, ?, datetime('now'))") mail = Mail.new([:source]) @add_message_query.execute([:sender], [:recipients].to_json, mail.subject, [:source], mail.mime_type || "text/plain", [:source].length) = db.last_insert_row_id parts = mail.all_parts parts = [mail] if parts.empty? parts.each do |part| body = part.body.to_s # Only parts have CIDs, not mail cid = part.cid if part.respond_to? :cid (, cid, part.mime_type || "text/plain", part. ? 1 : 0, part.filename, part.charset, body, body.length) end EventMachine.next_tick do = MailCatcher::Mail. MailCatcher::Events::MessageAdded.push end end |
#add_message_part(*args) ⇒ Object
61 62 63 64 |
# File 'lib/mail_catcher/mail.rb', line 61 def (*args) @add_message_part_query ||= db.prepare "INSERT INTO message_part (message_id, cid, type, is_attachment, filename, charset, body, size, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))" @add_message_part_query.execute(*args) end |
#db ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/mail_catcher/mail.rb', line 7 def db @__db ||= begin SQLite3::Database.new(":memory:", :type_translation => true).tap do |db| db.execute(<<-SQL) CREATE TABLE message ( id INTEGER PRIMARY KEY ASC, sender TEXT, recipients TEXT, subject TEXT, source BLOB, size TEXT, type TEXT, created_at DATETIME DEFAULT CURRENT_DATETIME ) SQL db.execute(<<-SQL) CREATE TABLE message_part ( id INTEGER PRIMARY KEY ASC, message_id INTEGER NOT NULL, cid TEXT, type TEXT, is_attachment INTEGER, filename TEXT, charset TEXT, body BLOB, size INTEGER, created_at DATETIME DEFAULT CURRENT_DATETIME ) SQL end end end |
#delete! ⇒ Object
146 147 148 149 150 151 152 |
# File 'lib/mail_catcher/mail.rb', line 146 def delete! @delete_all_messages_query ||= db.prepare "DELETE FROM message" @delete_all_message_parts_query ||= db.prepare "DELETE FROM message_part" @delete_all_messages_query.execute and @delete_all_message_parts_query.execute end |
#delete_message!(message_id) ⇒ Object
154 155 156 157 158 159 |
# File 'lib/mail_catcher/mail.rb', line 154 def () @delete_messages_query ||= db.prepare "DELETE FROM message WHERE id = ?" @delete_message_parts_query ||= db.prepare "DELETE FROM message_part WHERE message_id = ?" @delete_messages_query.execute() and @delete_message_parts_query.execute() end |
#latest_created_at ⇒ Object
66 67 68 69 |
# File 'lib/mail_catcher/mail.rb', line 66 def latest_created_at @latest_created_at_query ||= db.prepare "SELECT created_at FROM message ORDER BY created_at DESC LIMIT 1" @latest_created_at_query.execute.next end |
#message(id) ⇒ Object
80 81 82 83 84 85 86 |
# File 'lib/mail_catcher/mail.rb', line 80 def (id) @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 || ["recipients"] &&= ActiveSupport::JSON.decode ["recipients"] end end |
#message_attachments(id) ⇒ Object
105 106 107 108 109 110 |
# File 'lib/mail_catcher/mail.rb', line 105 def (id) @message_parts_query ||= db.prepare "SELECT cid, type, filename, size FROM message_part WHERE message_id = ? AND is_attachment = 1 ORDER BY filename ASC" @message_parts_query.execute(id).map do |row| Hash[row.fields.zip(row)] end end |
#message_has_html?(id) ⇒ Boolean
88 89 90 91 |
# File 'lib/mail_catcher/mail.rb', line 88 def (id) @message_has_html_query ||= db.prepare "SELECT 1 FROM message_part WHERE message_id = ? AND is_attachment = 0 AND type IN ('application/xhtml+xml', 'text/html') LIMIT 1" (!!@message_has_html_query.execute(id).next) || ["text/html", "application/xhtml+xml"].include?((id)["type"]) end |
#message_has_plain?(id) ⇒ Boolean
93 94 95 96 |
# File 'lib/mail_catcher/mail.rb', line 93 def (id) @message_has_plain_query ||= db.prepare "SELECT 1 FROM message_part WHERE message_id = ? AND is_attachment = 0 AND type = 'text/plain' LIMIT 1" (!!@message_has_plain_query.execute(id).next) || (id)["type"] == "text/plain" end |
#message_part(message_id, part_id) ⇒ Object
112 113 114 115 116 |
# File 'lib/mail_catcher/mail.rb', line 112 def (, part_id) @message_part_query ||= db.prepare "SELECT * FROM message_part WHERE message_id = ? AND id = ? LIMIT 1" row = @message_part_query.execute(, part_id).next row && Hash[row.fields.zip(row)] end |
#message_part_cid(message_id, cid) ⇒ Object
137 138 139 140 141 142 143 144 |
# File 'lib/mail_catcher/mail.rb', line 137 def (, cid) @message_part_cid_query ||= db.prepare "SELECT * FROM message_part WHERE message_id = ?" @message_part_cid_query.execute().map do |row| Hash[row.fields.zip(row)] end.find do |part| part["cid"] == cid end end |
#message_part_html(message_id) ⇒ Object
124 125 126 127 128 129 130 131 |
# File 'lib/mail_catcher/mail.rb', line 124 def () part = (, "text/html") part ||= (, "application/xhtml+xml") part ||= begin = () if .present? and ["text/html", "application/xhtml+xml"].include? ["type"] end end |
#message_part_plain(message_id) ⇒ Object
133 134 135 |
# File 'lib/mail_catcher/mail.rb', line 133 def () , "text/plain" end |
#message_part_type(message_id, part_type) ⇒ Object
118 119 120 121 122 |
# File 'lib/mail_catcher/mail.rb', line 118 def (, part_type) @message_part_type_query ||= db.prepare "SELECT * FROM message_part WHERE message_id = ? AND type = ? AND is_attachment = 0 LIMIT 1" row = @message_part_type_query.execute(, part_type).next row && Hash[row.fields.zip(row)] end |
#message_parts(id) ⇒ Object
98 99 100 101 102 103 |
# File 'lib/mail_catcher/mail.rb', line 98 def (id) @message_parts_query ||= db.prepare "SELECT cid, type, filename, size FROM message_part WHERE message_id = ? ORDER BY filename ASC" @message_parts_query.execute(id).map do |row| Hash[row.fields.zip(row)] end end |
#messages ⇒ Object
71 72 73 74 75 76 77 78 |
# File 'lib/mail_catcher/mail.rb', line 71 def @messages_query ||= db.prepare "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 || ["recipients"] &&= ActiveSupport::JSON.decode ["recipients"] end end end |