如何發(fā)送郵件
在任何Web程序開發(fā)中,發(fā)送郵件都是個(gè)經(jīng)典任務(wù),而且格外復(fù)雜、充滿陷阱。不去發(fā)明輪子的一個(gè)郵件發(fā)送解決方案是,使用SwiftmailerBundle,它發(fā)揮了Swift Mailer類庫的威力。這個(gè)bundle已被內(nèi)置于Symfony標(biāo)準(zhǔn)版框架之中。
配置 ?
要使用Swift Mailer,你需要配置它以便在郵件服務(wù)器上能夠使用。
有別于設(shè)置/使用你自己的郵件服務(wù)器,你可能希望選擇一個(gè)郵件托管服務(wù)商比如Mandrill, SendGrid, Amazon SES或其他品牌。它們會(huì)給你提供一個(gè)SMTP服務(wù)器,用戶名以及密碼(一般被稱為keys),這些都是要用到Swift Mailer配置中的。
在標(biāo)準(zhǔn)版Symfony的安裝中,一些swiftmailer
配置信息已經(jīng)被包括進(jìn)來:
# app/config/config.yml swiftmailer: transport: '%mailer_transport%' host: '%mailer_host%' username: '%mailer_user%' password: '%mailer_password%'
<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="symfony.com/schema/dic/services" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:swiftmailer="symfony.com/schema/dic/swiftmailer" xsi:schemaLocation="hsymfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd symfony.com/schema/dic/swiftmailer symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd"> <swiftmailer:config transport="%mailer_transport%" host="%mailer_host%" username="%mailer_user%" password="%mailer_password%" /> </container>
// app/config/config.php$container->loadFromExtension('swiftmailer', array( 'transport' => "%mailer_transport%", 'host' => "%mailer_host%", 'username' => "%mailer_user%", 'password' => "%mailer_password%",));
這些值(例如%mailer_transport%
),是從parameters.yml文件中所設(shè)置的參數(shù)中讀出來的。你可以在那個(gè)文件中修改這些值,或是直接在這里進(jìn)行設(shè)置。
下列配置屬性都是可用的:
transport
(smtp
,mail
,sendmail
, orgmail
)username
password
host
port
encryption
(tls
, orssl
)auth_mode
(plain
,login
, orcram-md5
)spool
type
(如何對(duì)信息(messages)進(jìn)行排序,file
或memory
都是被支持的,參考 如何滾動(dòng)發(fā)送郵件)path
(存儲(chǔ)信息的路徑)
delivery_address
(一個(gè)郵件地址,用于發(fā)送所有郵件)disable_delivery
(設(shè)為true即可徹底關(guān)閉郵件發(fā)送)
發(fā)送郵件 ?
Swift Mailer類庫在工作時(shí),依照創(chuàng)建、配置、然后發(fā)送Swift_Message
對(duì)象來進(jìn)行。“mailer”負(fù)責(zé)的是信息的真實(shí)發(fā)送,它可以通過mailer
服務(wù)來得到??偟卣f,發(fā)送郵件相當(dāng)直接了當(dāng):
public function indexAction($name){ $message = \Swift_Message::newInstance() ->setSubject('Hello Email') ->setFrom('send@example.com') ->setTo('recipient@example.com') ->setBody( $this->renderView( // app/Resources/views/Emails/registration.html.twig 'Emails/registration.html.twig', array('name' => $name) ), 'text/html' ) /* * If you also want to include a plaintext version of the message * 如果你同時(shí)希望包容一個(gè)“純文本”版本的信息 ->addPart( $this->renderView( 'Emails/registration.txt.twig', array('name' => $name) ), 'text/plain' ) */ ; $this->get('mailer')->send($message); return $this->render(...);}
為了實(shí)現(xiàn)松耦合,郵件本體(body)被存儲(chǔ)到一個(gè)模板中,并使用renderView()
方法進(jìn)行渲染。registration.html.twig
模板可能像下面這樣:
{ # app/Resources/views/Emails/registration.html.twig #}<h3>You did it! You registered!</h3> Hi {{ name }}! You're successfully registered. {# example, assuming you have a route named "login" #}{# 示例,假設(shè)你有一個(gè)名為"login"的路由 #}To login, go to: <a href="{{ url('login') }}">...</a>. Thanks! {# Makes an absolute URL to the /images/logo.png file #}{# 確保“/images/logo.png file”是一個(gè)絕對(duì)路徑 #}<img src="{{ absolute_url(asset('images/logo.png')) }}">
$message
對(duì)象支持許多選項(xiàng),例如包容附件,添加HTML內(nèi)容,等等。幸運(yùn)的是,Swift Mailer在它自己的文檔中涵蓋了Creating Messages(創(chuàng)建信息)的相關(guān)內(nèi)容。