Receiving Outlook inline Emails - cid: to !file.name!
Added by Matthew Paul over 7 years ago
I've installed the redmine_email_images plugin which is excellent! Now if I create or do an update to a ticket with inline images like -
!file.name!
it also includes those images inline in outbound emails.
BUT for inbound emails from outlook where there there are inline images like screenshots, it attaches the screenshots ok but I still get like -
Some text [cid:image001.png@01D29405.2CC43850] A screenshot above and one below [cid:image002.png@01D29405.2CC43850] And end
So I think I just need to do a replace -
[cid:image002.png@01D29405.2CC43850]
with
!image002.png!
So, in the patch code below, how do I do that? Any ideas?
#encoding: utf-8
require_dependency 'mail_handler'
module MailHandlerRemoveInlineImagesPatch
def self.included(base) # :nodoc:
base.send(:include, InstanceMethods)
base.class_eval do
alias_method_chain :add_attachments, :remove_inline_images
end
end
module InstanceMethods
def add_attachments_with_remove_inline_images(obj)
truncated = decoded_html.split(INVISIBLE_EMAIL_HEADER_DECODED, 2)[1]
if truncated
truncated.scan(FIND_IMG_SRC_PATTERN) do |_, src, _|
src.match(/^.cid:(.+)./) do |m|
remove_part_with_cid(email.parts, m[1])
end
end
end
add_attachments_without_remove_inline_images obj
end
def decoded_html
return @decoded_html unless @decoded_html.nil?
@decoded_html = decode_part_body(email.html_part)
end
private
def remove_part_with_cid(parts, cid_to_remove)
parts.select! do |part|
keep = part.cid != cid_to_remove
remove_part_with_cid(part.parts, cid_to_remove) if keep
keep
end
end
def decode_part_body(p)
body_charset = Mail::RubyVer.respond_to?(:pick_encoding) ?
Mail::RubyVer.pick_encoding(email.html_part.charset).to_s : p.charset
Redmine::CodesetUtil.to_utf8(p.body.decoded, body_charset)
end
end
end
MailHandler.send(:include, MailHandlerRemoveInlineImagesPatch)
Replies (5)
RE: Receiving Outlook inline Emails - cid: to !file.name! - Added by Matthew Paul over 7 years ago
Ok, I've worked out what I want to do - like this -
"[cid:image002.png@01D29405.2CC43850]".gsub(/^\[cid:(.+)\@/, '!\1!').match('(.*)!')[1] + "!"
returns this -
!image002.png!
So I think I want to execute that
gsub(/^\[cid:(.+)\@/, '!\1!').match('(.*)!')[1] + "!"
function on the email body. But I have no idea how to do that. Because I'm an old programmer dude and Ruby blows my mind. So, any ideas? How would I fit that transformation gsub into what is returned there?
RE: Receiving Outlook inline Emails - cid: to !file.name! - Added by Andreas Schnöppl over 7 years ago
I have the same problem.
I wrote a regex but I have no idea where to place it.
I tried several Versions like
p.body.decoded.gsub!(/\[cid:(\S+?)\@\S+?\]/, ' \1 ')
@plain_text_body.sub! %r{\[cid:(\S+?)\@\S+?\]}, ' \1 '
but either nothing or partly strange things happened.
Now I am at the end of my ruby wisdom
RE: Receiving Outlook inline Emails - cid: to !file.name! - Added by Matthew Paul over 7 years ago
I think it goes in instance_methods but I don't know where. Maybe in the remove_part_with_cid routine?
See this post - #14945
RE: Receiving Outlook inline Emails - cid: to !file.name! - Added by Andreas Schnöppl about 7 years ago
Can anybody help?
I took the Code from #14945 and replaced the regex
module MailHandlerPatch
def self.included(base)
base.send(:include, InstanceMethods)
base.class_eval do
alias_method_chain :plain_text_body, :notes_cleanup
end
end
module InstanceMethods
def plain_text_body_with_notes_cleanup
body = plain_text_body_without_notes_cleanup
body.gsub!(/\[cid:(\S+?)\@\S+?\]/, ' \1 ')
body
end
end
end
MailHandler.send(:include, MailHandlerPatch)
But what to do now? Save it in a file? Where? What Name? What to do else?
RE: Receiving Outlook inline Emails - cid: to !file.name! - Added by Andreas Schnöppl about 7 years ago
Works now for me
in plugins/mail_handler_patch/init.rb
require_dependency 'mail_handler_patch' Redmine::Plugin.register :mail_handler_patch do name 'Mail Handler Patch' end
in plugins/mail_handler_patch/lib/mail_handler_patch.rb
#encoding: utf-8 require_dependency 'mail_handler' module MailHandlerPatch def self.included(base) base.send(:include, InstanceMethods) base.class_eval do alias_method_chain :plain_text_body, :notes_cleanup end end module InstanceMethods def plain_text_body_with_notes_cleanup body = plain_text_body_without_notes_cleanup body.gsub!(/\[cid:(\S+?)\@\S+?\]/, '[\1]') body end end end MailHandler.send(:include, MailHandlerPatch)
Then I restarted Apache and it worked.
Note: I did a Substitute to
[foo.jpg]and not
!foo.jpg!
Because of a bug in my Redmine (2.5.5). Outlook tends to name all embedded screenshots image001.png. So if you write more than one mail to that issue you have duplicate image001.png.
The problem then is, that redmine replaces this image tags always with the last uploaded image001.png dynamically. So if you see the right image and somebody uploads another image001 then you see the wrong image.