From be5e69a7dccaa6c76408f9b7883980bd79bdba28 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 11:00:36 +0000 Subject: First skeletal version of separate mail handling library. --- lib/mail_handler/backends/tmail_backend.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 lib/mail_handler/backends/tmail_backend.rb (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb new file mode 100644 index 000000000..b2d36d65f --- /dev/null +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -0,0 +1,11 @@ +module MailHandler + module Backends + module TmailBackend + + def backend() + 'TMail' + end + + end + end +end \ No newline at end of file -- cgit v1.2.3 From ca7bb3d9f7f7e38ca670dee4352a6c81e2b9d19a Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 11:07:48 +0000 Subject: Move TMail monkey patch to MailHandler Tmail backend. --- lib/mail_handler/backends/tmail_backend.rb | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index b2d36d65f..e5bfa3f49 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -1,3 +1,12 @@ +# Monkeypatch! Adding some extra members to store extra info in. +module TMail + class Mail + attr_accessor :url_part_number + attr_accessor :rfc822_attachment # when a whole email message is attached as text + attr_accessor :within_rfc822_attachment # for parts within a message attached as text (for getting subject mainly) + end +end + module MailHandler module Backends module TmailBackend -- cgit v1.2.3 From faa38d57e2eb87c288741e9cba5550e9532282ca Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 11:38:32 +0000 Subject: Add methods for both backends to generate a mail object from raw data. --- lib/mail_handler/backends/tmail_backend.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index e5bfa3f49..ff00d92df 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -15,6 +15,18 @@ module MailHandler 'TMail' end + # Turn raw data into a structured TMail::Mail object + # Documentation at http://i.loveruby.net/en/projects/tmail/doc/ + def mail_from_raw_email(data) + # Hack round bug in TMail's MIME decoding. + # Report of TMail bug: + # http://rubyforge.org/tracker/index.php?func=detail&aid=21810&group_id=4512&atid=17370 + copy_of_raw_data = data.gsub(/; boundary=\s+"/im,'; boundary="') + mail = TMail::Mail.parse(copy_of_raw_data) + mail.base64_decode + mail + end + end end end \ No newline at end of file -- cgit v1.2.3 From 8834f67db8cd94a0285dd1bb4702db834e08e995 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 12:48:16 +0000 Subject: Use mail handler for making mail objects of attached emails. Add a flag to use base64 decoding or not. Note that currently the Mail-based backend doesn't use it - I think that eventually we'll want to have the mail handler wrap the mail object with it's own interface. --- lib/mail_handler/backends/tmail_backend.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index ff00d92df..2f59b1161 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -17,13 +17,13 @@ module MailHandler # Turn raw data into a structured TMail::Mail object # Documentation at http://i.loveruby.net/en/projects/tmail/doc/ - def mail_from_raw_email(data) + def mail_from_raw_email(data, decode=true) # Hack round bug in TMail's MIME decoding. # Report of TMail bug: # http://rubyforge.org/tracker/index.php?func=detail&aid=21810&group_id=4512&atid=17370 copy_of_raw_data = data.gsub(/; boundary=\s+"/im,'; boundary="') mail = TMail::Mail.parse(copy_of_raw_data) - mail.base64_decode + mail.base64_decode if decode mail end -- cgit v1.2.3 From 4bdab94e9d4f0a64647e5f8534c1fea8b4ba2809 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 14:04:55 +0000 Subject: Move TMail extensions to mail handler. --- lib/mail_handler/backends/tmail_backend.rb | 9 --------- 1 file changed, 9 deletions(-) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index 2f59b1161..fc675c1ed 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -1,12 +1,3 @@ -# Monkeypatch! Adding some extra members to store extra info in. -module TMail - class Mail - attr_accessor :url_part_number - attr_accessor :rfc822_attachment # when a whole email message is attached as text - attr_accessor :within_rfc822_attachment # for parts within a message attached as text (for getting subject mainly) - end -end - module MailHandler module Backends module TmailBackend -- cgit v1.2.3 From 388c75bfbd18fcaf273d95c21dc132ad19f0cefe Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 16:12:23 +0000 Subject: Move handling of TNEF mail attachments to mail handler --- lib/mail_handler/backends/tmail_backend.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index fc675c1ed..4daa5469f 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -18,6 +18,19 @@ module MailHandler mail end + # Extracts all attachments from the given TNEF file as a TMail::Mail object + def mail_from_tnef(content) + main = TMail::Mail.new + main.set_content_type 'multipart', 'mixed', { 'boundary' => TMail.new_boundary } + tnef_attachments(content).each do |attachment| + tmail_attachment = TMail::Mail.new + tmail_attachment['content-location'] = attachment[:filename] + tmail_attachment.body = attachment[:content] + main.parts << tmail_attachment + end + main + end + end end end \ No newline at end of file -- cgit v1.2.3 From daf42a44bf019128374f3cc636d95b8308a01f2e Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 16:39:46 +0000 Subject: Move _get_file_part_name to mail handler. --- lib/mail_handler/backends/tmail_backend.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index 4daa5469f..0fa90a657 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -31,6 +31,16 @@ module MailHandler main end + # Return a copy of the file name for the mail part + def get_part_file_name(mail_part) + part_file_name = TMail::Mail.get_part_file_name(mail_part) + if part_file_name.nil? + return nil + end + part_file_name = part_file_name.dup + return part_file_name + end + end end end \ No newline at end of file -- cgit v1.2.3 From f5ced2133cd1a66e18b225208fa96f4f36a20889 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 16:56:06 +0000 Subject: Move address_from_name_and_email to mail handler. --- lib/mail_handler/backends/tmail_backend.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index 0fa90a657..1c5489145 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -41,6 +41,17 @@ module MailHandler return part_file_name end + def address_from_name_and_email(name, email) + if !MySociety::Validate.is_valid_email(email) + raise "invalid email " + email + " passed to address_from_name_and_email" + end + if name.nil? + return TMail::Address.parse(email) + end + # Botch an always quoted RFC address, then parse it + name = name.gsub(/(["\\])/, "\\\\\\1") + TMail::Address.parse('"' + name + '" <' + email + '>').to_s + end end end end \ No newline at end of file -- cgit v1.2.3 From 125ca970ad4e2b5e424265c632ae31c6dde62da7 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 17:25:11 +0000 Subject: Wrap address parsing in a address_from_string method in the mail handler. --- lib/mail_handler/backends/tmail_backend.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index 1c5489145..0a1236e77 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -52,6 +52,11 @@ module MailHandler name = name.gsub(/(["\\])/, "\\\\\\1") TMail::Address.parse('"' + name + '" <' + email + '>').to_s end + + def address_from_string(string) + TMail::Address.parse(string).address + end + end end end \ No newline at end of file -- cgit v1.2.3 From 24c3ceb2315734ab6e43ae4f75673e251b98a96e Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 15 Nov 2012 17:44:08 +0000 Subject: Bugfix - need to convert to string in the just email address case. --- lib/mail_handler/backends/tmail_backend.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/mail_handler/backends/tmail_backend.rb') diff --git a/lib/mail_handler/backends/tmail_backend.rb b/lib/mail_handler/backends/tmail_backend.rb index 0a1236e77..87aba73d7 100644 --- a/lib/mail_handler/backends/tmail_backend.rb +++ b/lib/mail_handler/backends/tmail_backend.rb @@ -46,7 +46,7 @@ module MailHandler raise "invalid email " + email + " passed to address_from_name_and_email" end if name.nil? - return TMail::Address.parse(email) + return TMail::Address.parse(email).to_s end # Botch an always quoted RFC address, then parse it name = name.gsub(/(["\\])/, "\\\\\\1") -- cgit v1.2.3