inline_attachment 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +68 -0
- data/lib/inline_attachment.rb +78 -0
- metadata +64 -0
data/README
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
= Inline Attachment
|
2
|
+
|
3
|
+
This package adds full support for embedding inline images into your HTML emails
|
4
|
+
through ActionMailer.
|
5
|
+
|
6
|
+
== Installation
|
7
|
+
|
8
|
+
To perform a system wide installation:
|
9
|
+
|
10
|
+
<tt>gem source -a http://gems.github.com</tt>
|
11
|
+
<tt>gem install JasonKing-inline_attachment</tt>
|
12
|
+
|
13
|
+
To use inline_attachment in your project, add the following line to your project's
|
14
|
+
config/environment.rb:
|
15
|
+
|
16
|
+
<tt>config.gem 'inline_attachment'</tt>
|
17
|
+
|
18
|
+
|
19
|
+
== Usage
|
20
|
+
|
21
|
+
I've rewritten most of Edmond's great work in this version. I now override
|
22
|
+
path_to_image instead of image_tag because a big reason for all the Rails2
|
23
|
+
breakages was because image_tag was basically reproduced in previous versions,
|
24
|
+
so broke when that method changed.
|
25
|
+
|
26
|
+
Now we override the very simple path_to_image, and most importantly we really
|
27
|
+
just add our own stuff for ActionMailer templates, and resort to the existing
|
28
|
+
code for everything else.
|
29
|
+
|
30
|
+
I've also integrated in with the new implicit multipart stuff. So now, there is
|
31
|
+
so little code required!
|
32
|
+
|
33
|
+
|
34
|
+
class Notifier < ActionMailer::Base
|
35
|
+
def signup
|
36
|
+
recipients %q{"Testing IA" <testing@handle.it>}
|
37
|
+
from %q{"Mr Tester" <tester@handle.it>}
|
38
|
+
subject "Here's a funky test"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Oh yeah baby! Read it and weep! So how's this work? Well, you'll need
|
43
|
+
# your templates named properly - see the `Multipart email` section of the
|
44
|
+
# ActionMailer::Base docs.
|
45
|
+
|
46
|
+
# signup.text.plain.erb
|
47
|
+
Your username is: <%= @username %>
|
48
|
+
|
49
|
+
# signup.text.html.erb
|
50
|
+
<html><head><title>Signup Notification</title></head><body>
|
51
|
+
<%= image_tag "logo.png" %>
|
52
|
+
<p>Your username is: <%=h @username %>
|
53
|
+
</body></html>
|
54
|
+
|
55
|
+
|
56
|
+
That's it! InlineAttachment will look for
|
57
|
+
"#{RAILS_ROOT}/public/images/logo.png" and will do the right thing and embed it
|
58
|
+
inline into the HTML version of the email. ActionMailer will do the right thing
|
59
|
+
and offer the recipient both the text/plain and text/html parts as alternatives.
|
60
|
+
|
61
|
+
|
62
|
+
Note, that you should still be able to use this in the 0.3.0 way if you have
|
63
|
+
code that uses that. But there were a lot of alternatives, and the examples in
|
64
|
+
here didn't show a crucial step of shuffling the parts around to be sure that
|
65
|
+
the image parts came after the html.
|
66
|
+
|
67
|
+
You can also do the old "manual" method if you want.
|
68
|
+
|
@@ -0,0 +1,78 @@
|
|
1
|
+
TMail::HeaderField::FNAME_TO_CLASS.delete('content-id')
|
2
|
+
CID_NAME = 'Content-Id'
|
3
|
+
|
4
|
+
module ActionMailer
|
5
|
+
module PartContainer
|
6
|
+
# Add an inline attachment to a multipart message.
|
7
|
+
def inline_attachment(params, &block)
|
8
|
+
params = { :content_type => params } if String === params
|
9
|
+
params = { :disposition => "inline",
|
10
|
+
:transfer_encoding => "base64" }.merge(params)
|
11
|
+
params[:headers] ||= {}
|
12
|
+
params[:headers][CID_NAME] = params[:cid]
|
13
|
+
part(params, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Base
|
18
|
+
alias_method :ia_original_create_mail, :create_mail
|
19
|
+
def create_mail
|
20
|
+
# sniff out inline html parts with inline images and wrap them up in a
|
21
|
+
# multipart/related mime part
|
22
|
+
got_inlines = false
|
23
|
+
related_parts = []
|
24
|
+
for_deletion = []
|
25
|
+
@parts.each_with_index do |p,i|
|
26
|
+
logger.debug "Considering #{i}"
|
27
|
+
if p.content_disposition == 'inline' && p.content_type =~ %r{^image/}i && p.headers[CID_NAME]
|
28
|
+
logger.debug "Just adding [#{i}] to the list\n#{p.filename}"
|
29
|
+
for_deletion << i
|
30
|
+
related_parts << p
|
31
|
+
got_inlines = true
|
32
|
+
end
|
33
|
+
|
34
|
+
if got_inlines && p.content_type =~ %r{text/html}i
|
35
|
+
@parts[i] = ActionMailer::Part.new( :content_type => "multipart/related" )
|
36
|
+
@parts[i].parts << p
|
37
|
+
related_parts.each do |rp|
|
38
|
+
@parts[i].parts << rp
|
39
|
+
end
|
40
|
+
got_inlines = false
|
41
|
+
related_parts = []
|
42
|
+
end
|
43
|
+
end
|
44
|
+
for_deletion.sort{|a,b|b<=>a}.each {|i|@parts.delete_at(i)}
|
45
|
+
ia_original_create_mail
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module ActionView
|
51
|
+
module Helpers #:nodoc:
|
52
|
+
module AssetTagHelper
|
53
|
+
alias_method :ia_original_path_to_image, :path_to_image
|
54
|
+
def path_to_image(source)
|
55
|
+
@part_container ||= @controller
|
56
|
+
if @part_container.is_a?(ActionMailer::Base) or @part_container.is_a?(ActionMailer::Part)
|
57
|
+
file_path = "#{RAILS_ROOT}/public#{ia_original_path_to_image(source).split('?').first}"
|
58
|
+
|
59
|
+
if File.exists?(file_path)
|
60
|
+
basename = File.basename(file_path)
|
61
|
+
ext = basename.split('.').last
|
62
|
+
cid = Time.now.to_f.to_s + "#{basename}@inline_attachment"
|
63
|
+
file = File.open(file_path, 'rb')
|
64
|
+
|
65
|
+
@part_container.inline_attachment(:content_type => "image/#{ext}",
|
66
|
+
:body => file.read,
|
67
|
+
:filename => basename,
|
68
|
+
:cid => "<#{cid}>",
|
69
|
+
:disposition => "inline")
|
70
|
+
|
71
|
+
return "cid:#{cid}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
return ia_original_path_to_image(source)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: inline_attachment
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jason King
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-02 00:00:00 +11:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mime-types
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "1.15"
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: jk@handle.it
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- README
|
35
|
+
- lib/inline_attachment.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/JasonKing/inline_attachment
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options:
|
40
|
+
- --inline-source
|
41
|
+
- --charset=UTF-8
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
rubyforge_project: InlineAttachment
|
59
|
+
rubygems_version: 1.3.1
|
60
|
+
signing_key:
|
61
|
+
specification_version: 2
|
62
|
+
summary: Makes image_tag in an ActionMailer template embed the images in the emails
|
63
|
+
test_files: []
|
64
|
+
|