5.7 KiB
summary: Send HTML and plain text email from your SilverStripe application.
Creating and sending email in SilverStripe is done through the Email and Mailer classes. This document
covers how to create an Email
instance, customise it with a HTML template, then send it through a custom Mailer
.
Configuration
SilverStripe provides an API over the top of the SwiftMailer PHP library which comes with an extensive list of "transports" for sending mail via different services.
Out of the box, SilverStripe will use the built-in PHP mail()
command via the Swift_MailTransport
class. If you'd
like to use a more robust transport to send mail you can swap out the transport used by the Mailer
via config:
SilverStripe\Core\Injector\Injector:
Swift_Transport: Swift_SendmailTransport
Usage
Sending plain text only
$email = new Email($from, $to, $subject, $body);
$email->sendPlain();
Sending combined HTML and plain text
By default, emails are sent in both HTML and Plaintext format. A plaintext representation is automatically generated
from the system by stripping HTML markup, or transforming it where possible (e.g. <strong>text</strong>
is converted
to *text*
).
$email = new Email($from, $to, $subject, $body);
$email->send();
Templates
HTML emails can use custom templates using the same template language as your website template. You can also pass the
email object additional information using the setData
and addData
methods.
mysite/templates/Email/MyCustomEmail.ss
<h1>Hi $Member.FirstName</h1>
<p>You can go to $Link.</p>
The PHP Logic..
$email = SilverStripe\Control\Email\Email::create()
->setHTMLTemplate('Email\\MyCustomEmail')
->setData(array(
'Member' => Security::getCurrentUser(),
'Link'=> $link,
))
->setFrom($from)
->setTo($to)
->setSubject($subject);
if ($email->send()) {
//email sent successfully
} else {
// there may have been 1 or more failures
}
Custom plain templates
By default SilverStripe will generate a plain text representation of the email from the HTML body. However if you'd like
to specify your own own plaintext version/template you can use $email->setPlainTemplate()
to render a custom view of
the plain email:
$email = new SilverStripe\Control\Email\Email();
$email->setPlainTemplate('MyPlanTemplate');
$this->send();
Administrator Emails
You can set the default sender address of emails through the Email.admin_email
configuration setting.
mysite/_config/app.yml
SilverStripe\Control\Email\Email:
admin_email: support@silverstripe.org
Redirecting Emails
There are several other configuration settings to manipulate the email server.
SilverStripe\Control\Email\Email.send_all_emails_to
will redirect all emails sent to the given address. All recipients will be removed (including CC and BCC addresses). This is useful for testing and staging servers where you do not wish to send emails out. For debugging the original addresses are added asX-Original-*
headers on the email.SilverStripe\Control\Email\Email.cc_all_emails_to
andSilverStripe\Control\Email\Email.bcc_all_emails_to
will add an additional recipient in the BCC / CC header. These are good for monitoring system-generated correspondence on the live systems.
Configuration of those properties looks like the following:
mysite/_config.php
if(Director::isLive()) {
Config::inst()->update('Email', 'bcc_all_emails_to', "client@example.com");
} else {
Config::inst()->update('Email', 'send_all_emails_to', "developer@example.com");
}
Setting custom "Reply To" email address.
For email messages that should have an email address which is replied to that actually differs from the original "from" email, do the following. This is encouraged especially when the domain responsible for sending the message isn't necessarily the same which should be used for return correspondence and should help prevent your message from being marked as spam.
$email = new Email(..);
$email->setReplyTo('me@address.com');
Setting Custom Headers
For email headers which do not have getters or setters (like setTo(), setFrom()) you can manipulate the underlying
Swift_Message
that we provide a wrapper for.
$email = new Email(...);
$email->getSwiftMessage()->getHeaders()->addTextHeader('HeaderName', 'HeaderValue');
..
SwiftMailer Documentation
For further information on SwiftMailer, consult their docs: http://swiftmailer.org/docs/introduction.html