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
147 148 149 150 151 152 153 |
# File 'lib/mail_catcher/mail.rb', line 147 def delete! @delete_messages_query ||= db.prepare "DELETE FROM message" @delete_message_parts_query ||= db.prepare "DELETE FROM message_part" @delete_messages_query.execute and @delete_message_parts_query.execute end |
#delete_message!(message_id) ⇒ Object
155 156 157 158 159 160 |
# File 'lib/mail_catcher/mail.rb', line 155 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 87 |
# 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"] ["source"].force_encoding('UTF-8') end end |
#message_attachments(id) ⇒ Object
106 107 108 109 110 111 |
# File 'lib/mail_catcher/mail.rb', line 106 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
89 90 91 92 |
# File 'lib/mail_catcher/mail.rb', line 89 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
94 95 96 97 |
# File 'lib/mail_catcher/mail.rb', line 94 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
113 114 115 116 117 |
# File 'lib/mail_catcher/mail.rb', line 113 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
138 139 140 141 142 143 144 145 |
# File 'lib/mail_catcher/mail.rb', line 138 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
125 126 127 128 129 130 131 132 |
# File 'lib/mail_catcher/mail.rb', line 125 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
134 135 136 |
# File 'lib/mail_catcher/mail.rb', line 134 def () , "text/plain" end |
#message_part_type(message_id, part_type) ⇒ Object
119 120 121 122 123 |
# File 'lib/mail_catcher/mail.rb', line 119 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
99 100 101 102 103 104 |
# File 'lib/mail_catcher/mail.rb', line 99 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 |