电子邮件
由法比力量
symfony是简单而强大的发送邮件,感ob娱乐下载谢的用法斯威夫特梅勒图书馆。虽然斯威夫特梅勒发送邮件简单,symfony提供了一个基于它的瘦包装器使发送邮件更加灵活和强大。ob娱乐下载本章将教你如何把所有的力量在你的处置。
请注意
ob娱乐下载symfony 1.3嵌入迅速梅勒4.1版。
介绍
电子邮件管理在symfony是围绕一个梅ob娱乐下载勒对象。和许多其他核心symfony对象一样,梅勒是一个工ob娱乐下载厂。中配置factories.yml
配置文件,总是可以通过上下文实例:
梅勒美元= sfContext::getInstance()- >getMailer();
提示
与其他工厂不同,梅勒加载和初始化的需求。如果你不使用它,没有任何性能影响。
这篇教程解释了斯威夫特梅勒在symfony的集成。ob娱乐下载如果你想学迅速梅勒库本身的细节,参考其专用的欧宝官网下载app。
发送邮件的行动
从一个动作,检索梅勒是由简单的实例getMailer ()
快捷方法:
梅勒美元=这个美元- >getMailer();
最快的方法
然后发送邮件简单使用sfMailer: composeAndSend ()
方法:
这个美元- >getMailer()- >composeAndSend(“from@example.com”,“fabien@example.com”,“主题”,“身体”);
的composeAndSend ()
方法接受四个参数:
- 发件人电子邮件地址(
从
); - 收件人的电子邮件地址(es) (
来
); - 消息的主体;
- 消息的主体。
当一个方法接受一个电子邮件地址作为一个参数,您可以传递一个字符串或一个数组:
美元的地址=“fabien@example.com”;美元的地址=数组(“fabien@example.com”= >“法比效力”);
当然,您可以将电子邮件发送到几个人立刻通过电子邮件作为第二个参数数组的方法:
美元,=数组(“foo@example.com”,“bar@example.com”,);这个美元- >getMailer()- >composeAndSend(“from@example.com”,美元,,“主题”,“身体”);美元,=数组(“foo@example.com”= >“Foo”先生,“bar@example.com”= >“酒吧小姐”,);这个美元- >getMailer()- >composeAndSend(“from@example.com”,美元,,“主题”,“身体”);
灵活的方式
如果你需要更大的灵活性,您还可以使用sfMailer:组成()
方法来创建一个消息,定制你所希望的方式,并最终将其发送。这是有用的,例如,当您需要添加附件,如下所示:
/ /创建一个消息对象美元的消息=这个美元- >getMailer()- >组成(“from@example.com”,“fabien@example.com”,“主题”,“身体”)- >附加(Swift_Attachment::fromPath(“/道路/ / / file.zip”));/ /发送消息这个美元- >getMailer()- >发送(美元的消息);
强大的方式
您还可以创建一个消息对象直接甚至更大的灵活性:
美元的消息= Swift_Message::newInstance()- >setFrom(“from@example.com”)- >该太空站(“to@example.com”)- >setSubject(“主题”)- >setBody(“身体”)- >附加(Swift_Attachment::fromPath(“/道路/ / / file.zip”));这个美元- >getMailer()- >发送(美元的消息);
使用Symfony视ob娱乐下载图
发送你的电子邮件从你的行为允许您利用泛音和组件很容易的力量。
美元的消息- >setBody(这个美元- >getPartial(“partial_name”,美元的参数));
配置
像其他symfony工厂,ob娱乐下载梅勒可以配置的factories.yml
配置文件。缺省配置读取如下:
梅勒:类:sfMailer参数:日志:% SF_LOGGING_ENABLED %字符集:% SF_CHARSET % delivery_strategy:实时交通:类:Swift_SmtpTransport参数:主持人:本地主机端口:25加密:~用户名:密码:~ ~
当创建一个新的应用程序,当地factories.yml
配置文件覆盖默认配置的一些合理的默认值刺激
,env
,测试
环境:
测试:梅勒:param: delivery_strategy:没有开发:梅勒:param: delivery_strategy:没有
交付策略
的一个最有用的特性迅速梅勒集成在symfony交付策略。ob娱乐下载交付策略允许您告诉symfony提供邮件和如何通过配置ob娱乐下载delivery_strategy
设置factories.yml
。战略变化的方式send ()
|sfMailer:发送()
方法的行为。四个策略可用默认情况下,哪些应该适合所有常见的需求:
实时
:在即时消息被发送。single_address
:消息被发送到一个地址。线轴
:存储在队列的消息。没有一个
:消息被简单地忽略。
的实时
策略
的实时
策略是默认的交付策略,和最容易的设置有什么特殊的事要做。
电子邮件消息被发送通过运输中配置运输
部分的factories.yml
配置文件(有关更多信息,请参见下一节关于如何配置邮件传输)。
的single_address
策略
与single_address
战略,所有消息被发送到一个地址,通过配置delivery_address
设置。
这种策略是非常有用的在开发环境中避免真实用户发送消息,但仍允许开发人员检查消息呈现在读者的电子邮件。
提示
如果你需要验证来
,cc
,bcc
接受者,他们可用的值以下标题:X-Swift-To
,X-Swift-Cc
,X-Swift-Bcc
分别。
电子邮件消息被发送通过电子邮件传输一样使用的实时
策略。
的线轴
策略
与线轴
策略,存储在队列的消息。
生产环境中,这是最好的战略作为web请求不等待发送电子邮件。
的线轴
类是配置了spool_class
设置。默认情况下,symfonob娱乐下载y其中三个捆绑在一起:
Swift_FileSpool
:信息是存储在文件系统上。Swift_DoctrineSpool
:信息存储在一个理论模型。Swift_PropelSpool
:信息存储在一个驱动模型。
线轴被实例化时,spool_arguments
设置作为构造函数参数。这是内置的队列类的选项:
Swift_FileSpool
:- 消息队列目录的绝对路径(存储在该目录)
Swift_DoctrineSpool
:理论模型用于存储信息(
MailMessage
默认情况下)列名用于信息存储(
消息
默认情况下)的方法调用来检索消息发送(可选)。它接收队列选择作为一个参数。
Swift_PropelSpool
:推动模型用于存储信息(
MailMessage
默认情况下)列名用于信息存储(
消息
默认情况下)的方法调用来检索消息发送(可选)。它接收队列选择作为一个参数。
这里是一个典型的配置一个教义线轴:
#模式配置模式。yml MailMessage:找:{Timestampable: ~}列:信息:{类型:blob, notnull:真}
#配置在工厂。yml梅勒:类:sfMailer参数:delivery_strategy:线轴spool_class: Swift_DoctrineSpool spool_arguments: [MailMessage、消息getSpooledMessages]
和驱动轴的相同的配置:
#模式配置模式。yml mail_message:消息:{类型:blob,要求:真}created_at: ~
#配置在工厂。yml dev:梅勒:param: delivery_strategy:线轴spool_class: Swift_PropelSpool spool_arguments: [MailMessage、消息getSpooledMessages]
储存在一个队列发送消息,您可以使用项目:发送电子邮件
任务(注意,这个任务是完全独立的队列实现,和所需的选项):
美元php ob娱乐下载symfony项目:发送电子邮件
请注意
的项目:发送电子邮件
接受一个任务应用程序
和env
选项。
当调用项目:发送电子邮件
任务,电子邮件消息被发送通过相同的运输使用的实时
策略。
提示
请注意,项目:发送电子邮件
可以在任何机器上运行的任务,不一定的机器上创建了消息。它工作,因为一切都是存储在消息对象,甚至文件附件。
请注意
内置的队列的实现非常简单。他们发送电子邮件没有任何错误的经营管理,比如他们会发送如果你使用了实时
策略。当然,默认队列类可以扩展到实现自己的逻辑和错误管理。
的项目:发送电子邮件
任务有两个可选的选项:
message-limit
:限制发送的消息数量。时限
:限制发送消息的时间(以秒为单位)。
这两种选择都可以组合:
美元php ob娱乐下载symfony项目:发送电子邮件——message-limit = 10——期限= 20
上面的命令将停止发送消息后,10消息被发送或20秒。
即使使用线轴
策略,你可能需要发送消息立即不存储在队列中。这是可能通过使用特殊sendNextImmediately ()
梅勒的方法:
这个美元- >getMailer()- >sendNextImmediately()- >发送(美元的消息);
在前面的例子中,美元的消息
不会存储在队列,并将立即发送。顾名思义,sendNextImmediately ()
方法只会影响下一个要发送的消息。
请注意
的sendNextImmediately ()
方法交付策略时没有特别的效果线轴
。
的没有一个
策略
这一战略是有用的在开发环境中避免邮件发送给实际用户。消息仍然可用的web调试工具栏(更多信息在下面部分的梅勒面板web调试工具栏)。
这也是最好的策略测试环境,在那里sfTesterMailer
对象允许您内省而不需要实际发送的消息他们(在下面的部分中关于测试的更多信息)。
邮件运输
发送的邮件消息实际上是一个交通工具。运输中配置factories.yml
配置文件,默认的配置使用SMTP服务器的本地机器:
交通:类:Swift_SmtpTransport参数:主持人:本地主机端口:25加密:~用户名:密码:~ ~
迅速与三种不同的运输类:梅勒捆绑在一起
Swift_SmtpTransport
:使用一个SMTP服务器发送消息。Swift_SendmailTransport
:使用sendmail
发送消息。Swift_MailTransport
:使用原生PHP邮件()
函数来发送消息。
提示
的“运输类型”斯威夫特的梅勒官方文档描述了所有你需要知道的关于内置的运输类及其不同的参数欧宝官网下载app。
发送一个电子邮件从一个任务
发送一个电子邮件从一个任务非常类似于发送一封电子邮件从一个行动,任务系统也提供了getMailer ()
方法。
创建梅勒时,任务系统依赖于当前配置。所以,如果你想使用一个配置从一个特定的应用程序,你必须接受——应用程序
选项(见章节任务有关这个主题的更多信息)。
请注意,使用相同的配置作为控制器的任务。所以,如果你想迫使交货时线轴
使用策略,使用sendNextImmediately ()
:
这个美元- >getMailer()- >sendNextImmediately()- >发送(美元的消息);
调试
传统上,调试电子邮件是一个噩梦。symfoob娱乐下载ny,它很容易,多亏了web调试工具栏。
从舒适的浏览器,您可以很容易地和迅速看到多少消息发送的动作电流:
如果你点击电子邮件图标,发送消息显示在面板的原始形式如下所示。
请注意
每次发送一封电子邮件,symfony日志中还添加了一个消ob娱乐下载息。
测试
当然,集成就没有不完整的测试邮件消息的一种方法。默认情况下,symfonob娱乐下载y会注册一个梅勒
测试人员(sfMailerTester
),以缓解邮件测试功能测试。
的hasSent ()
方法测试在当前请求发送的消息数量:
美元的浏览器- >得到(' / foo ')- >与(“梅勒”)- >hasSent(1);
前面的代码检查/ foo
URL发送只有一个电子邮件。
每个发送电子邮件可以进一步的帮助下进行测试checkHeader ()
和checkBody ()
方法:
美元的浏览器- >得到(' / foo ')- >与(“梅勒”)- >开始()- >hasSent(1)- >checkHeader(“主题”,“/主题/”)- >checkBody(“身体/”)- >结束();
第二个参数的checkHeader ()
的第一个参数checkBody ()
可以是下列之一:
一个字符串来检查一个精确匹配;
一个正则表达式检查对它;
消极的正则表达式(一个正则表达式从一开始
!
)检查值不匹配。
默认情况下,检查完成第一次发送的消息。如果几个消息已发送,你可以选择一个你想要测试的withMessage ()
方法:
美元的浏览器- >得到(' / foo ')- >与(“梅勒”)- >开始()- >hasSent(2)- >withMessage(“foo@example.com”)- >checkHeader(“主题”,“/主题/”)- >checkBody(“身体/”)- >结束();
的withMessage ()
需要收件人作为它的第一个参数。它还需要第二个参数指示哪些信息你想测试如果几个相同的已发送到收件人。
最后但不是最少,调试()
方法转储发送消息来测试失败时发现问题:
美元的浏览器- >得到(' / foo ')- >与(“梅勒”)- >调试();
电子邮件为类
在本章的介绍,您已经学会了如何发送电子邮件从一个行动。这可能是最简单的方法发送电子邮件在symfony应用程序时,最好的你只需要发送一些简单的消息。ob娱乐下载
但是,当您的应用程序需要管理大量不同的电子邮件信息,你应该有一个不同的策略。
请注意
还有一个额外的好处,使用类邮件意味着相同的电子邮件消息在不同的应用程序可以使用;前端和后端。
消息是纯PHP对象,明显的方式来组织你的消息是为每个人创造一个类:
/ / lib /电子邮件/ ProjectConfirmationMessage.class.php类ProjectConfirmationMessage扩展Swift_Message{公共函数__construct(){父:__construct(“主题”,“身体”);这个美元- >setFrom(数组(“app@example.com”= >“我的应用机器人”))- >附加(“……”);}}
发送消息从一个动作,或者从别的地方,很简单的类实例化正确的信息:
这个美元- >getMailer()- >发送(新ProjectConfirmationMessage());
当然,添加一个基类集中共享的头一样从
头,或者添加一个共同签名可以方便:
/ / lib /电子邮件/ ProjectConfirmationMessage.class.php类ProjectConfirmationMessage扩展ProjectBaseMessage{公共函数__construct(){父:__construct(“主题”,“身体”);/ /具体的标题,附件,…这个美元- >附加(“……”);}}/ / lib /电子邮件/ ProjectBaseMessage.class.php类ProjectBaseMessage扩展Swift_Message{公共函数__construct(美元的主题,美元的身体){美元的身体= < < < EOF -我发送的电子邮件应用Bot EOF;父:__construct(美元的主题,美元的身体);/ /设置所有共享的头这个美元- >setFrom(数组(“app@example.com”= >“我的应用机器人”));}}
如果消息取决于一些模型对象,你当然可以将它们作为参数传递给构造函数:
/ / lib /电子邮件/ ProjectConfirmationMessage.class.php类ProjectConfirmationMessage扩展ProjectBaseMessage{公共函数__construct($ user){父:__construct(“确认”。$ user- >getName(),“身体”);}}
食谱
通过Gmail发送邮件
如果你没有一个SMTP服务器但Gmail账户,使用以下配置使用谷歌服务器发送和存档的消息:
交通:类:Swift_SmtpTransport参数:主持人:smtp.gmail.com端口:465加密:用户名:ssl your_gmail_username_goes_here密码:your_gmail_password_goes_here
取代用户名
和密码
与Gmail凭证和您的工作也就完成了。
定制梅勒对象
如果配置梅勒通过factories.yml
是不够的,你能听吗mailer.configure
事件,进一步定制梅勒。
你可以连接到这个事件ProjectConfiguration
类像如下所示:
类ProjectConfiguration扩展sfProjectConfiguration{公共函数设置(){/ /……这个美元- >调度程序- >连接(“mailer.configure”,数组(这个美元,“configureMailer”));}公共函数configureMailer(sfEvent美元的事件){梅勒美元=美元的事件- >getSubject();/ /做一些与梅勒}}
下面的部分展示了一个强大的使用这种技术。
使用快速梅勒插件
使用快速梅勒插件,听mailer.configure
事件(见上面的部分):
公共函数configureMailer(sfEvent美元的事件){梅勒美元=美元的事件- >getSubject();美元的插件=新Swift_Plugins_ThrottlerPlugin(One hundred.,Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE);梅勒美元- >registerPlugin(美元的插件);}
一些插件应该被触发时,电子邮件是发送(AntiFlood BandwithMonitor,节流器)。他们应该注册仅供实时传输。否则他们会触发邮件时排队而不是队列时刷新。
为了让这些插件预期行为,下面的代码应该被用来注册插件线轴时使用。注意比这个代码仍然有效时,梅勒不使用一个线轴。
公共函数configureMailer(sfEvent美元的事件){梅勒美元=美元的事件- >getSubject();美元的运输=梅勒美元- >getRealtimeTransport();美元的运输- >registerPlugin(新Swift_Plugins_ThrottlerPlugin(One hundred.,Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE));美元的运输- >registerPlugin(新Swift_Plugins_AntiFloodPlugin(30.));}
提示
的“插件”斯威夫特的梅勒官方文档描述了所有你需要知道的关于内置插件。欧宝官网下载app
定制线轴的行为
线轴的内置的实现非常简单。每个卷轴从队列中检索所有邮件并发送一个随机的顺序。
您可以配置一个线轴限制发送邮件的时间(以秒为单位),或限制发送的消息数量:
美元的线轴=梅勒美元- >getSpool();美元的线轴- >setMessageLimit(10);美元的线轴- >setTimeLimit(10);
在本节中,您将学习如何实现一个队列的优先级系统。它会给你所需的所有信息来实现自己的逻辑。
首先,添加一个优先级
列模式:
为推动mail_message #:信息:{类型:blob,要求:真}created_at: ~优先:{类型:整数,默认值:3}#教义MailMessage:找:{Timestampable: ~}列:信息:{类型:blob, notnull:真}优先:{类型:整数}
在发送电子邮件时,设置优先级标题(1意味着最高):
美元的消息=这个美元- >getMailer()- >组成(“john@doe.com”,“foo@example.com”,“主题”,“身体”)- >setPriority(1);这个美元- >getMailer()- >发送(美元的消息);
然后,覆盖默认的setMessage ()
法改变的优先级MailMessage
对象本身:
/ /推动类MailMessage扩展BaseMailMessage{公共函数setMessage(美元的消息){美元味精=非系列化(美元的消息);这个美元- >setPriority(美元味精- >getPriority());返回父::setMessage(美元的消息);}}/ /为原则类MailMessage扩展BaseMailMessage{公共函数setMessage(美元的消息){美元味精=非系列化(美元的消息);这个美元- >优先级=美元味精- >getPriority();返回这个美元- > _set(“消息”,美元的消息);}}
注意,被序列化的消息队列,因此它必须是unserialize之前优先级值。现在,创建一个订单的消息优先级的方法:
/ /推动类MailMessagePeer扩展BaseMailMessagePeer{静态公共函数getSpooledMessages(标准美元标准){美元标准- >addAscendingOrderByColumn(自我::优先级);返回自我::doSelect(美元标准);}/ /……}/ /为原则类MailMessageTable扩展Doctrine_Table{公共函数getSpooledMessages(){返回这个美元- >createQuery(“米”)- >orderBy(“m.priority”);}/ /……}
最后一步是定义的检索方法factories.yml
配置更改默认方式从队列中获取消息:
spool_arguments (MailMessage、消息getSpooledMessages):
这就是所有。现在,每次运行项目:发送电子邮件
任务,每个电子邮件将发送根据其优先级。
侧边栏
与任何标准定制线轴
前面的示例使用一个标准的消息头,优先级。但如果你想使用任何标准,或者如果你不想改变发送消息,你也可以存储标准作为一个自订标头,并删除它在发送邮件之前。
首先,添加一个自定义标题发送消息:
公共函数executeIndex(){美元的消息=这个美元- >getMailer()- >组成(“john@doe.com”,“foo@example.com”,“主题”,“身体”);美元的消息- >getHeaders()- >addTextHeader(“X-Queue-Criteria”,“foo”);这个美元- >getMailer()- >发送(美元的消息);}
然后,从这头当检索值存储消息在队列中,并立即删除它:
公共函数setMessage(美元的消息){美元味精=非系列化(美元的消息);美元的头=美元味精- >getHeaders();美元标准=美元的头- >得到(“X-Queue-Criteria”)- >getFieldBody();这个美元- >setCriteria(美元标准);美元的头- >删除(“X-Queue-Criteria”);返回父:_set(“消息”,序列化(美元味精));}
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。