-
Notifications
You must be signed in to change notification settings - Fork 16
/
apdx-email.lyx
275 lines (224 loc) · 5.54 KB
/
apdx-email.lyx
1
2
3
4
5
6
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#LyX 1.6.1 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass book
\use_default_options false
\language english
\inputencoding auto
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\author ""
\author ""
\end_header
\begin_body
\begin_layout Chapter
Sending Email
\begin_inset CommandInset label
LatexCommand label
name "cha:Sending-Email"
\end_inset
\end_layout
\begin_layout Standard
Sending email is a common enough task (user registration, notifications,
etc) within a web application that we've decided to cover it here.
Although email isn't Lift's primary focus, Lift does provide some facilities
to simplify email transmission.
\end_layout
\begin_layout Section
Setup
\end_layout
\begin_layout Standard
Configuration of the mailer is handled in a few different ways.
The
\family typewriter
net.liftweb.util.Mailer
\family default
object defines a
\family typewriter
hostFunc
\family default
function var,
\begin_inset Formula $()\Rightarrow String$
\end_inset
, that is used to compute the hostname of your SMTP server to be used for
transmission.
The default value is a function that looks up the
\family typewriter
mail.smtp.host
\family default
system property and uses that String.
If that property isn't defined then the mailer defaults to
\family typewriter
localhost
\family default
.
Setting the system property is the simplest way to change your SMTP relay,
although you could also define your own function to return a custom hostname
and assign it to
\family typewriter
Mailer.hostFunc
\family default
.
\end_layout
\begin_layout Section
Sending Emails
\end_layout
\begin_layout Standard
The mailer interface is simple but covers a wide variety of cases.
The
\family typewriter
Mailer
\family default
object defines a number of case classes that correspond to the components
of an RFC822 email.
The addressing and subject cases classes,
\family typewriter
From
\family default
,
\family typewriter
To
\family default
,
\family typewriter
CC
\family default
,
\family typewriter
BCC
\family default
,
\family typewriter
ReplyTo
\family default
and
\family typewriter
Subject
\family default
should all be self-explanatory.
For the body of the email you have three main options:
\end_layout
\begin_layout Description
PlainMailBodyType Represents a plain-text email body based on a given String
\end_layout
\begin_layout Description
XHTMLMailBodyType Represents an XHTML email body based on a given NodeSeq
\end_layout
\begin_layout Description
XHTMLPlusImages Similar to XHTMLMailBodyType, but in addition to the NodeSeq,
you can provide one or more PlusImageHolder instances that represent images
to be attached to the email (embedded images, so to speak)
\end_layout
\begin_layout Standard
The
\family typewriter
Mailer.sendMail
\family default
function is used to generate and send an email.
It takes three arguments: the
\family typewriter
From
\family default
sender address, the
\family typewriter
Subject
\family default
of the email, and a varargs list of recipient addresses and body components.
The mailer creates MIME/Multipart messages, so you can send more than one
body (i.e.
plain text and XHMTL) if you would like.
Listing
\begin_inset CommandInset ref
LatexCommand ref
reference "lst:Sending-a-two-part-email"
\end_inset
shows an example of sending an email to a group of recipients in both plain
text and XHTML format.
The Mailer object defines some implicit conversions to PlainMailBodyType
and XHTMLMailBodyType, which we use here.
We also have to do a little List trickery to be able to squeeze multiple
arguments into the final vararg argument since Scala doesn't support mixing
regular values and coerced sequences in vararg arguments.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
\begin_inset Caption
\begin_layout Plain Layout
Sending a two-part email
\begin_inset CommandInset label
LatexCommand label
name "lst:Sending-a-two-part-email"
\end_inset
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
import net.liftweb.util.Mailer
\end_layout
\begin_layout Plain Layout
import Mailer._
\end_layout
\begin_layout Plain Layout
...
\end_layout
\begin_layout Plain Layout
val myRecips : List[String] = ...
\end_layout
\begin_layout Plain Layout
val plainContent : String = "..."
\end_layout
\begin_layout Plain Layout
val xhtmlContent : NodeSeq = ...
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
Mailer.sendMail(From("no-reply@foo.com"), Subject("Just a test"),
\end_layout
\begin_layout Plain Layout
(plainContent :: xhtmlContent :: myRecips.map(To(_))) : _*)
\end_layout
\end_inset
\end_layout
\begin_layout Standard
When you call
\family typewriter
sendMail
\family default
you're actually sending a message to an actor in the background that will
handle actual mail delivery; because of this, you shouldn't expect to see
a synchronous relay of the message through your SMTP server.
\end_layout
\end_body
\end_document