easy_multipart 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +21 -0
- data/README.md +138 -0
- data/lib/easy_multipart/base.rb +89 -0
- data/lib/easy_multipart/helper.rb +66 -0
- data/lib/easy_multipart/version.rb +3 -0
- data/lib/easy_multipart.rb +1 -0
- data/lib/rdoc/classes/EasyMultipart/Base.html +163 -0
- data/lib/rdoc/classes/EasyMultipart/Base.src/M000001.html +26 -0
- data/lib/rdoc/classes/EasyMultipart/Base.src/M000002.html +26 -0
- data/lib/rdoc/classes/EasyMultipart/Base.src/M000003.html +22 -0
- data/lib/rdoc/classes/EasyMultipart/Base.src/M000004.html +40 -0
- data/lib/rdoc/classes/EasyMultipart/Base.src/M000005.html +22 -0
- data/lib/rdoc/classes/EasyMultipart/Base.src/M000006.html +18 -0
- data/lib/rdoc/classes/EasyMultipart/Helper.html +177 -0
- data/lib/rdoc/classes/EasyMultipart/Helper.src/M000001.html +45 -0
- data/lib/rdoc/classes/EasyMultipart/Helper.src/M000007.html +45 -0
- data/lib/rdoc/created.rid +1 -0
- data/lib/rdoc/files/easy_multipart/base_rb.html +108 -0
- data/lib/rdoc/files/easy_multipart/helper_rb.html +101 -0
- data/lib/rdoc/files/easy_multipart/version_rb.html +101 -0
- data/lib/rdoc/files/easy_multipart_rb.html +108 -0
- data/lib/rdoc/fr_class_index.html +27 -0
- data/lib/rdoc/fr_file_index.html +27 -0
- data/lib/rdoc/fr_method_index.html +27 -0
- data/lib/rdoc/index.html +24 -0
- data/lib/rdoc/rdoc-style.css +208 -0
- metadata +95 -0
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright 2010 ZephirWorks. All rights reserved.
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without modification, are
|
4
|
+
permitted provided that the following conditions are met:
|
5
|
+
|
6
|
+
1. Redistributions of source code must retain the above copyright notice, this list of
|
7
|
+
conditions and the following disclaimer.
|
8
|
+
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list
|
10
|
+
of conditions and the following disclaimer in the documentation and/or other materials
|
11
|
+
provided with the distribution.
|
12
|
+
|
13
|
+
THIS SOFTWARE IS PROVIDED BY ZephirWorks ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
14
|
+
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZephirWorks OR
|
16
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
17
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
18
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
19
|
+
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
20
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
21
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
easy_multipart
|
2
|
+
=============
|
3
|
+
|
4
|
+
A Ruby gem to send multipart email--the easy way.
|
5
|
+
|
6
|
+
|
7
|
+
Installation
|
8
|
+
-----------
|
9
|
+
|
10
|
+
First install the gem:
|
11
|
+
|
12
|
+
gem install easy_multipart
|
13
|
+
|
14
|
+
Then you can just include easy_multipart in your mailers:
|
15
|
+
|
16
|
+
include EasyMultipart::Base
|
17
|
+
|
18
|
+
Alternatively, to make it available to all your mailers, put this line in an
|
19
|
+
initializer:
|
20
|
+
|
21
|
+
ActiveMailer::Base.extend EasyMultipart::Base
|
22
|
+
|
23
|
+
|
24
|
+
Rationale
|
25
|
+
---------
|
26
|
+
|
27
|
+
If you use Rails you probably know ActiveMailer, the core gem that
|
28
|
+
provides all necessary functionality to send and receive email.
|
29
|
+
ActiveMailer does let you build and send a multipart message,
|
30
|
+
with support for such features as alternative text (plain text,
|
31
|
+
HTML etc) and attachments.
|
32
|
+
|
33
|
+
However, using ActiveMailer in a practical way requires a working
|
34
|
+
understanding of the ins and outs of MIME, the relevant RFCs and
|
35
|
+
most troubling of all--the quirks of different email clients.
|
36
|
+
For instance, sending a newsletter that can be reliably rendered
|
37
|
+
by all popular email clients can be a daunting task.
|
38
|
+
|
39
|
+
easy_multipart aims to help with that; it provides a small (but
|
40
|
+
hopefully growing) set of tools to deal with the most common
|
41
|
+
tasks. It doesn't try to do too much; it does a few things, but
|
42
|
+
it tries to do them in an easy and pleasant way that should feel
|
43
|
+
familiar.
|
44
|
+
|
45
|
+
|
46
|
+
Features
|
47
|
+
--------
|
48
|
+
|
49
|
+
*Note: at this time, easy_mailer has only been tested on Rails 2.3.8
|
50
|
+
with Ruby 1.8.7, and the documentation reflects that. Expect that to
|
51
|
+
change in the near future.*
|
52
|
+
|
53
|
+
With easy_multipart you write your ActiveMailer model like you are
|
54
|
+
used to. You must not include a `body` or `part`; instead you should
|
55
|
+
invoke `easy_multipart`.
|
56
|
+
|
57
|
+
class TestModel
|
58
|
+
def test
|
59
|
+
from 'billing@example.com'
|
60
|
+
recipients 'dear.customer@some.big.company'
|
61
|
+
subject 'Your monthly invoice'
|
62
|
+
|
63
|
+
easy_multipart :body => { :name => 'Dear Customer',
|
64
|
+
:amount => '9.99' }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Your views and layouts don't need to change either; easy_multipart
|
69
|
+
respects conventions from ActiveMailer and will find them.
|
70
|
+
|
71
|
+
With this basic support in place, you are ready to take advantage of
|
72
|
+
easy_multipart features.
|
73
|
+
|
74
|
+
### Embedded images
|
75
|
+
|
76
|
+
Embedded images are a way of sending HTML email messages that
|
77
|
+
images inside your email are loaded from the same message, instead
|
78
|
+
of off a website.
|
79
|
+
|
80
|
+
Technically, this functionality is achieved using a MIME type
|
81
|
+
of multipart/related. The concept is quite easy; however, getting
|
82
|
+
the details right can be tricky.
|
83
|
+
|
84
|
+
easy_multipart provides a very convenient helper that hides all this
|
85
|
+
complexity from you:
|
86
|
+
|
87
|
+
<%= related_image_tag 'logo.png', :file => 'email/logo.png' %>
|
88
|
+
|
89
|
+
The path is assumed to be relative to your `public/images` folder
|
90
|
+
(in fact, `image_tag` is used internally).
|
91
|
+
|
92
|
+
This helper will attach the image to the email and generate an
|
93
|
+
appropriate HTML tag:
|
94
|
+
|
95
|
+
<img src="cid:some-random-string">
|
96
|
+
|
97
|
+
The email messages generated by easy_multipart have been tested to
|
98
|
+
display correctly with:
|
99
|
+
|
100
|
+
* Apple Mail
|
101
|
+
* Gmail
|
102
|
+
* Thunderbird
|
103
|
+
* Postbox
|
104
|
+
|
105
|
+
|
106
|
+
Testing
|
107
|
+
-------
|
108
|
+
|
109
|
+
To run the tests:
|
110
|
+
|
111
|
+
**TODO**
|
112
|
+
|
113
|
+
|
114
|
+
Maintainers
|
115
|
+
-----------
|
116
|
+
|
117
|
+
* Andrea Campi (http://github.com/andreacampi)
|
118
|
+
|
119
|
+
|
120
|
+
Bugs and Feedback
|
121
|
+
-----------------
|
122
|
+
|
123
|
+
If you discover any bugs or want to drop a line, feel free to create an issue on GitHub.
|
124
|
+
|
125
|
+
http://github.com/zephirworks/easy_multipart/issues
|
126
|
+
|
127
|
+
BSD License. Copyright 2010 ZephirWorks. http://www.zephirworks.com
|
128
|
+
|
129
|
+
|
130
|
+
Contributing
|
131
|
+
------------
|
132
|
+
|
133
|
+
1. Fork it.
|
134
|
+
2. Create a branch
|
135
|
+
3. Commit your changes
|
136
|
+
4. Push to the branch
|
137
|
+
5. Send a pull request
|
138
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'easy_multipart/helper'
|
2
|
+
|
3
|
+
module EasyMultipart #:nodoc:
|
4
|
+
# This module enables EasyMultipart functionality for the mailers it is
|
5
|
+
# included in.
|
6
|
+
#
|
7
|
+
# ==== Examples
|
8
|
+
# Import easy_mailer in one mailer:
|
9
|
+
#
|
10
|
+
# class MyMailer
|
11
|
+
# import EasyMultipart::Base
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# Import easy_mailer in all the mailers of a Rails application:
|
15
|
+
#
|
16
|
+
# ActiveMailer::Base.extend EasyMultipart::Base
|
17
|
+
#
|
18
|
+
module Base
|
19
|
+
|
20
|
+
def self.included(klass) #:nodoc:
|
21
|
+
klass.helper EasyMultipart::Helper
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
# Prepares the content of a multipart email.
|
26
|
+
# You can pass a +options+ hash with one key:
|
27
|
+
#
|
28
|
+
# * <tt>body</tt> - a hash which generates an instance variable named
|
29
|
+
# after each key in the hash containing the value that that key points to.
|
30
|
+
def easy_multipart(options = {}, &block)
|
31
|
+
content_type 'multipart/alternative'
|
32
|
+
TMail::HeaderField::FNAME_TO_CLASS.delete 'content-id'
|
33
|
+
|
34
|
+
if options.has_key?(:body)
|
35
|
+
body options.delete(:body)
|
36
|
+
end
|
37
|
+
|
38
|
+
add_plain_part
|
39
|
+
add_html_part
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_plain_part #:nodoc:
|
43
|
+
template = find_template_for("text.plain")
|
44
|
+
return unless template
|
45
|
+
|
46
|
+
part :content_type => "text/plain",
|
47
|
+
:body => render_message(template, @body)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_html_part #:nodoc:
|
51
|
+
template = find_template_for("text.html")
|
52
|
+
return unless template
|
53
|
+
|
54
|
+
@related = {}
|
55
|
+
body = render_message(template, @body)
|
56
|
+
|
57
|
+
if @related.empty?
|
58
|
+
part :content_type => "text/html",
|
59
|
+
:body => body
|
60
|
+
return
|
61
|
+
end
|
62
|
+
|
63
|
+
part :content_type => 'multipart/related' do |related|
|
64
|
+
related.part :content_type => "text/html",
|
65
|
+
:body => body
|
66
|
+
|
67
|
+
@related.each_pair do |content_id, img|
|
68
|
+
related.part(:content_type => img[0],
|
69
|
+
:headers => {'Content-ID' => format_content_id(content_id)}) do |image|
|
70
|
+
img[1].call(image)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def find_template_for(format) #:nodoc:
|
77
|
+
Dir.glob("#{template_path}/#{@template}.*").select do |path|
|
78
|
+
template = template_root["#{mailer_name}/#{File.basename(path)}"]
|
79
|
+
return template if template.format == format
|
80
|
+
end
|
81
|
+
nil
|
82
|
+
end
|
83
|
+
|
84
|
+
# XXX This should generate a globally-unique Content-Id.
|
85
|
+
def format_content_id(content_id) #:nodoc:
|
86
|
+
"<#{content_id}>"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module EasyMultipart #:nodoc:
|
2
|
+
# This module provides methods for generating HTML body parts that include
|
3
|
+
# embedded images.
|
4
|
+
module Helper
|
5
|
+
# Returns an HTML image tag for the +source+. The +source+ can be a full
|
6
|
+
# path or a file that exists in your public images directory.
|
7
|
+
# Alternatively, it can be a hash with these mandatory keys:
|
8
|
+
#
|
9
|
+
# * <tt>:body</tt> - An object representing the image content. Any kind of
|
10
|
+
# object can be used, as long as it responds to :to_s.
|
11
|
+
# * <tt>:content_id</tt> - A string that uniquely identifies the image
|
12
|
+
# within the current document.
|
13
|
+
#
|
14
|
+
# ==== Options
|
15
|
+
# You can add HTML attributes using the +image_options+. You can pass
|
16
|
+
# any option accepted by +image_tag+.
|
17
|
+
#
|
18
|
+
# You can pass additional options through +related_options+:
|
19
|
+
#
|
20
|
+
# * <tt>:content_type</tt> - The value to use for the Content-Type
|
21
|
+
# MIME header. If not provided it defaults to 'image/png'.
|
22
|
+
# * <tt>:transfer_encoding</tt> - The value to use for the
|
23
|
+
# Transfer-Encoding MIME header. If not provided it defaults
|
24
|
+
# to 'base64'. Unless you have special requirements, you should not
|
25
|
+
# provide a value for this key.
|
26
|
+
# * <tt>:content_disposition</tt> - The value to use for the
|
27
|
+
# Content-Disposition MIME header. If not provided it defaults to
|
28
|
+
# not generating a Content-Disposition header.
|
29
|
+
def related_image_tag(source, image_options = {}, related_options = {})
|
30
|
+
related_options.reverse_merge! :content_type => 'image/png',
|
31
|
+
:transfer_encoding => 'base64'
|
32
|
+
|
33
|
+
if source.is_a?(Hash)
|
34
|
+
unless source.has_key?(:content_id)
|
35
|
+
raise "You must specify a :content_id if you provide a :body"
|
36
|
+
end
|
37
|
+
|
38
|
+
content_id = source[:content_id]
|
39
|
+
source = source[:body].to_s
|
40
|
+
else
|
41
|
+
if source.first != '/'
|
42
|
+
assets_dir = defined?(Rails.public_path) ? Rails.public_path : "public"
|
43
|
+
source = File.join(assets_dir, "images", source)
|
44
|
+
end
|
45
|
+
|
46
|
+
content_id = File.basename(source)
|
47
|
+
source = File.read(source)
|
48
|
+
end
|
49
|
+
content_id = normalize_content_id(content_id)
|
50
|
+
|
51
|
+
@related[content_id] = [related_options[:content_type], lambda do |image|
|
52
|
+
image.body = source
|
53
|
+
image.transfer_encoding = related_options[:transfer_encoding]
|
54
|
+
image.content_disposition = related_options[:content_disposition] # default is none
|
55
|
+
end]
|
56
|
+
|
57
|
+
@template.tag(:img, image_options.merge(:src => "cid:#{content_id}"))
|
58
|
+
end
|
59
|
+
|
60
|
+
# XXX We should use a method in EasyMultipart::Base so we can share code
|
61
|
+
# with format_content_id.
|
62
|
+
def normalize_content_id(content_id) #:nodoc:
|
63
|
+
"#{content_id}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'easy_multipart/base'
|
@@ -0,0 +1,163 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Module: EasyMultipart::Base</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Module</strong></td>
|
53
|
+
<td class="class-name-in-header">EasyMultipart::Base</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../../files/easy_multipart/base_rb.html">
|
59
|
+
easy_multipart/base.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
</td>
|
63
|
+
</tr>
|
64
|
+
|
65
|
+
</table>
|
66
|
+
</div>
|
67
|
+
<!-- banner header -->
|
68
|
+
|
69
|
+
<div id="bodyContent">
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
<div id="contextContent">
|
74
|
+
|
75
|
+
<div id="description">
|
76
|
+
<p>
|
77
|
+
This module enables EasyMultipart functionality for the mailers it is
|
78
|
+
included in.
|
79
|
+
</p>
|
80
|
+
<h4>Examples</h4>
|
81
|
+
<p>
|
82
|
+
Import easy_mailer in one mailer:
|
83
|
+
</p>
|
84
|
+
<pre>
|
85
|
+
class MyMailer
|
86
|
+
import EasyMultipart::Base
|
87
|
+
end
|
88
|
+
</pre>
|
89
|
+
<p>
|
90
|
+
Import easy_mailer in all the mailers of a Rails application:
|
91
|
+
</p>
|
92
|
+
<pre>
|
93
|
+
ActiveMailer::Base.extend EasyMultipart::Base
|
94
|
+
</pre>
|
95
|
+
|
96
|
+
</div>
|
97
|
+
|
98
|
+
|
99
|
+
</div>
|
100
|
+
|
101
|
+
<div id="method-list">
|
102
|
+
<h3 class="section-bar">Methods</h3>
|
103
|
+
|
104
|
+
<div class="name-list">
|
105
|
+
<a href="#M000001">easy_multipart</a>
|
106
|
+
</div>
|
107
|
+
</div>
|
108
|
+
|
109
|
+
</div>
|
110
|
+
|
111
|
+
|
112
|
+
<!-- if includes -->
|
113
|
+
|
114
|
+
<div id="section">
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
<!-- if method_list -->
|
124
|
+
<div id="methods">
|
125
|
+
<h3 class="section-bar">Protected Instance methods</h3>
|
126
|
+
|
127
|
+
<div id="method-M000001" class="method-detail">
|
128
|
+
<a name="M000001"></a>
|
129
|
+
|
130
|
+
<div class="method-heading">
|
131
|
+
<a href="Base.src/M000001.html" target="Code" class="method-signature"
|
132
|
+
onclick="popupCode('Base.src/M000001.html');return false;">
|
133
|
+
<span class="method-name">easy_multipart</span><span class="method-args">(options = {}, &block)</span>
|
134
|
+
</a>
|
135
|
+
</div>
|
136
|
+
|
137
|
+
<div class="method-description">
|
138
|
+
<p>
|
139
|
+
Prepares the content of a multipart email. You can pass a <tt>options</tt>
|
140
|
+
hash with one key:
|
141
|
+
</p>
|
142
|
+
<ul>
|
143
|
+
<li><tt>body</tt> - a hash which generates an instance variable named after
|
144
|
+
each key in the hash containing the value that that key points to.
|
145
|
+
|
146
|
+
</li>
|
147
|
+
</ul>
|
148
|
+
</div>
|
149
|
+
</div>
|
150
|
+
|
151
|
+
|
152
|
+
</div>
|
153
|
+
|
154
|
+
|
155
|
+
</div>
|
156
|
+
|
157
|
+
|
158
|
+
<div id="validator-badges">
|
159
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
160
|
+
</div>
|
161
|
+
|
162
|
+
</body>
|
163
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>easy_multipart (EasyMultipart::Base)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File easy_multipart/base.rb, line 30</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">easy_multipart</span>(<span class="ruby-identifier">options</span> = {}, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span>)
|
15
|
+
<span class="ruby-identifier">content_type</span> <span class="ruby-value str">'multipart/alternative'</span>
|
16
|
+
<span class="ruby-constant">TMail</span><span class="ruby-operator">::</span><span class="ruby-constant">HeaderField</span><span class="ruby-operator">::</span><span class="ruby-constant">FNAME_TO_CLASS</span>.<span class="ruby-identifier">delete</span> <span class="ruby-value str">'content-id'</span>
|
17
|
+
|
18
|
+
<span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">:body</span>)
|
19
|
+
<span class="ruby-identifier">body</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">:body</span>)
|
20
|
+
<span class="ruby-keyword kw">end</span>
|
21
|
+
|
22
|
+
<span class="ruby-identifier">add_plain_part</span>
|
23
|
+
<span class="ruby-identifier">add_html_part</span>
|
24
|
+
<span class="ruby-keyword kw">end</span></pre>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>easy_multipart (EasyMultipart::Base)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File easy_multipart/base.rb, line 25</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">easy_multipart</span>(<span class="ruby-identifier">options</span> = {}, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span>)
|
15
|
+
<span class="ruby-identifier">content_type</span> <span class="ruby-value str">'multipart/alternative'</span>
|
16
|
+
<span class="ruby-constant">TMail</span><span class="ruby-operator">::</span><span class="ruby-constant">HeaderField</span><span class="ruby-operator">::</span><span class="ruby-constant">FNAME_TO_CLASS</span>.<span class="ruby-identifier">delete</span> <span class="ruby-value str">'content-id'</span>
|
17
|
+
|
18
|
+
<span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">:body</span>)
|
19
|
+
<span class="ruby-identifier">body</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">:body</span>)
|
20
|
+
<span class="ruby-keyword kw">end</span>
|
21
|
+
|
22
|
+
<span class="ruby-identifier">add_plain_part</span>
|
23
|
+
<span class="ruby-identifier">add_html_part</span>
|
24
|
+
<span class="ruby-keyword kw">end</span></pre>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>add_plain_part (EasyMultipart::Base)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File easy_multipart/base.rb, line 37</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">add_plain_part</span>
|
15
|
+
<span class="ruby-identifier">template</span> = <span class="ruby-identifier">find_template_for</span>(<span class="ruby-value str">"text.plain"</span>)
|
16
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">template</span>
|
17
|
+
|
18
|
+
<span class="ruby-identifier">part</span> <span class="ruby-identifier">:content_type</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"text/plain"</span>,
|
19
|
+
<span class="ruby-identifier">:body</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">render_message</span>(<span class="ruby-identifier">template</span>, <span class="ruby-ivar">@body</span>)
|
20
|
+
<span class="ruby-keyword kw">end</span></pre>
|
21
|
+
</body>
|
22
|
+
</html>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>add_html_part (EasyMultipart::Base)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File easy_multipart/base.rb, line 45</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">add_html_part</span>
|
15
|
+
<span class="ruby-identifier">template</span> = <span class="ruby-identifier">find_template_for</span>(<span class="ruby-value str">"text.html"</span>)
|
16
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">template</span>
|
17
|
+
|
18
|
+
<span class="ruby-ivar">@related</span> = {}
|
19
|
+
<span class="ruby-identifier">body</span> = <span class="ruby-identifier">render_message</span>(<span class="ruby-identifier">template</span>, <span class="ruby-ivar">@body</span>)
|
20
|
+
|
21
|
+
<span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@related</span>.<span class="ruby-identifier">empty?</span>
|
22
|
+
<span class="ruby-identifier">part</span> <span class="ruby-identifier">:content_type</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"text/html"</span>,
|
23
|
+
<span class="ruby-identifier">:body</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">body</span>
|
24
|
+
<span class="ruby-keyword kw">return</span>
|
25
|
+
<span class="ruby-keyword kw">end</span>
|
26
|
+
|
27
|
+
<span class="ruby-identifier">part</span> <span class="ruby-identifier">:content_type</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'multipart/related'</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">related</span><span class="ruby-operator">|</span>
|
28
|
+
<span class="ruby-identifier">related</span>.<span class="ruby-identifier">part</span> <span class="ruby-identifier">:content_type</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"text/html"</span>,
|
29
|
+
<span class="ruby-identifier">:body</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">body</span>
|
30
|
+
|
31
|
+
<span class="ruby-ivar">@related</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">content_id</span>, <span class="ruby-identifier">img</span><span class="ruby-operator">|</span>
|
32
|
+
<span class="ruby-identifier">related</span>.<span class="ruby-identifier">part</span>(<span class="ruby-identifier">:content_type</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">img</span>[<span class="ruby-value">0</span>],
|
33
|
+
<span class="ruby-identifier">:headers</span> =<span class="ruby-operator">></span> {<span class="ruby-value str">'Content-ID'</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">format_content_id</span>(<span class="ruby-identifier">content_id</span>)}) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">image</span><span class="ruby-operator">|</span>
|
34
|
+
<span class="ruby-identifier">img</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">call</span>(<span class="ruby-identifier">image</span>)
|
35
|
+
<span class="ruby-keyword kw">end</span>
|
36
|
+
<span class="ruby-keyword kw">end</span>
|
37
|
+
<span class="ruby-keyword kw">end</span>
|
38
|
+
<span class="ruby-keyword kw">end</span></pre>
|
39
|
+
</body>
|
40
|
+
</html>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>find_template_for (EasyMultipart::Base)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File easy_multipart/base.rb, line 71</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_template_for</span>(<span class="ruby-identifier">format</span>)
|
15
|
+
<span class="ruby-constant">Dir</span>.<span class="ruby-identifier">glob</span>(<span class="ruby-node">"#{template_path}/#{@template}.*"</span>).<span class="ruby-identifier">select</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">path</span><span class="ruby-operator">|</span>
|
16
|
+
<span class="ruby-identifier">template</span> = <span class="ruby-identifier">template_root</span>[<span class="ruby-node">"#{mailer_name}/#{File.basename(path)}"</span>]
|
17
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">template</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">template</span>.<span class="ruby-identifier">format</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">format</span>
|
18
|
+
<span class="ruby-keyword kw">end</span>
|
19
|
+
<span class="ruby-keyword kw">nil</span>
|
20
|
+
<span class="ruby-keyword kw">end</span></pre>
|
21
|
+
</body>
|
22
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>format_content_id (EasyMultipart::Base)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File easy_multipart/base.rb, line 80</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">format_content_id</span>(<span class="ruby-identifier">content_id</span>)
|
15
|
+
<span class="ruby-node">"<#{content_id}>"</span>
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
17
|
+
</body>
|
18
|
+
</html>
|