如何發送郵件
在任何Web程式開發中,發送郵件都是個經典任務,而且格外複雜、充滿陷阱。不去發明輪子的一個郵件發送解決方案是,使用SwiftmailerBundle,它發揮了Swift Mailer類別庫的威力。這個bundle已被內建於Symfony標準版框架之中。
設定 ¶
要使用Swift Mailer,你需要設定它以便在郵件伺服器上能夠使用。
有別於設定/使用你自己的郵件伺服器,你可能想要選擇一個郵件託管服務商例如Mandrill, SendGrid, Amazon SES或其他品牌。它們會提供你一個SMTP伺服器,使用者名稱以及密碼(一般稱為keys),這些都是要用到Swift Mailer設定的。
在標準版Symfony的安裝中,有些swiftmailer
設定資訊已經被包含進來:
# 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檔案中所設定的參數中讀出來的。你可以在那個檔案中修改這些值,或直接在這裡設定。
下列設定屬性都是可用的:
transport
(smtp
,mail
,sendmail
, 或gmail
)username
password
host
port
encryption
(tls
, 或ssl
)auth_mode
(plain
,login
, orcram-md5
)# spool
type
(如何對資訊(messages)進行排序,file
或memory
都是被支援的,參考如何捲動傳送郵件)path
(儲存資訊的路徑)
# delivery_address
(一個郵件地址,用於發送所有郵件)disable_delivery
(設為true即可徹底關閉郵件發送)
發送郵件¶
Swift Mailer類別庫在工作時,依照建立、配置、然後發送Swift_Message
物件來進行。 「mailer」負責的是訊息的真實發送,它可以透過mailer
服務來得到。總地說,發送郵件相當直接了當:
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 * 如果你同时希望包容一个“纯文本”版本的信息 ->addPart( $this->renderView( 'Emails/registration.txt.twig', array('name' => $name) ), 'text/plain' ) */ ; $this->get('mailer')->send($message); return $this->render(...);}
為了實現鬆散耦合,郵件本體(body)被儲存到一個模板中,並使用renderView()
方法進行渲染。 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" #}{# 示例,假设你有一个名为"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”是一个绝对路径 #}<img src="{{ absolute_url(asset('images/logo.png')) }}">
$message
物件支援許多選項,例如包容附件,新增HTML內容,等等。幸運的是,Swift Mailer在它自己的文檔中涵蓋了Creating Messages(創建資訊)的相關內容。