第12天:电子邮件
symfony前情提要ob娱乐下载
昨天,askeet应用程序被扩展到在另一种媒体上播放内容——RSS提要。ob娱乐下载Symfony不仅仅是关于网页的,今天的教程将再次说明它。我们将利用MVC实现来发送电子邮件。
密码恢复
登录表单(每个页面中的AJAX表单和上层菜单访问的经典表单)需要昵称和密码,但用户经常会忘记它们。在这种情况下,我们必须提供一种机制让它们再次连接。
由于我们不存储密码,我们将被迫重置为随机密码,并通过电子邮件发送给用户。目前,用户不能修改他/她的密码,所以随机的密码不太容易记住,但我们稍后会解决这个问题。
密码申请表格
在用户
模块中,我们将创建一个新动作,该动作显示请求电子邮件地址的表单。在使用/应用程序/前端/模块/ user /行动/ action.class.php
添加:
公共函数executePasswordRequest(){}
在模块/ user /模板/
,创建以下内容passwordRequestSuccess.php
:
通过电子邮件收到您的登录详细信息
您忘记密码了吗?输入您的邮箱以接收您的登录详细信息:
<?php回声form_tag(“@user_require_password”)? ><?php回声form_error(“电子邮件”)? ><标签为=“电子邮件”> >电子邮件:< /标签<?php回声input_tag(“电子邮件”,sf_params美元->得到(“电子邮件”),“风格=宽度:150 px”)? > < br / ><?php回声submit_tag(“发送”)? >> < /形式
这个表单必须可以从登录表单中访问,所以添加它们(在layout.php
而在loginSuccess.php
):
<?php回声link_to(“忘记密码了?”,“@user_require_password”)? >
在应用程序中添加密码请求规则routing.yml
:
user_require_password: url: /password_request参数:{模块:用户,动作:passwordRequest}
表单验证
首先,我们将为表单提交设置验证规则。创建一个passwordRequest.yml
在模块/ user /验证/
目录:
方法:post: [email]名称:email: required: Yes required_msg:你必须提供一个电子邮件验证器:emailValidator emailValidator: class: sfEmailValidator参数:email_error: '你没有输入一个有效的电子邮件地址(例如:name@domain.com)。请再试一次。”
接下来,使用passwordRequest
方法检测到错误时,将再次显示使用/应用程序/前端/模块/ user /行动/ actions.class.php
:
公共函数handleErrorPasswordRequest(){返回sfView::成功;}
处理请求
如在第六天,我们将使用相同的操作来处理表单提交,因此将其修改为:
公共函数executePasswordRequest(){如果(这个美元->getRequest()->getMethod()! = sfRequest::帖子){//显示表单返回sfView::成功;}//处理表单提交$ c=新标准();$ c->添加(UserPeer::电子邮件,这个美元->getRequestParameter(“电子邮件”));$ user= UserPeer::doSelectOne($ c);// email是否存在?如果($ user){//设置新的随机密码美元的密码=字符串的子串(md5(兰德(100000,999999)),0,6);$ user->向setPassword(美元的密码);这个美元->getRequest()->setAttribute(“密码”,美元的密码);这个美元->getRequest()->setAttribute(“昵称”,$ user->getNickname());raw_email美元=这个美元->sendEmail(“邮件”,“sendPassword”);这个美元->logMessage(raw_email美元,“调试”);//保存新密码$ user->保存();返回“MailSent”;}其他的{这个美元->getRequest()->setError(“电子邮件”,“没有此电子邮件地址的askeet用户。请再试一次。”);返回sfView::成功;}}
如果该用户存在,则该操作将确定提供给该用户的随机密码。然后它将请求传递给另一个动作(邮件/ sendPassword
)并在a中获取结果raw_email美元
变量。的- > sendEmail ()
方法sfAction
类是一种特殊的- >向前()
它执行另一个操作,但随后返回(它不会停止当前操作的执行)。此外,它还返回可写入日志文件的原始电子邮件(您将在调试章交响乐书)。ob娱乐下载
如果电子邮件成功发送,该操作将指定必须使用一个特殊模板来代替默认模板passwordRequestSuccess.php
:返回“mailsent”;
将启动passwordRequestMailSent.php
模板。
请注意
我们有没有效仿一天6,电子邮件地址是否存在的验证应该在自定义验证器中完成。但是你知道“有不止一种方法来做这件事”,并且使用- > setError ()
方法避免了对数据库的双重请求,以及创建更长的验证文件。
因此,创建新模板passwordRequestMailSent.php
确认页面:
confirm - login information sent
Your login information was sent to
回声sf_params美元->得到(“电子邮件”)?>
您应该很快就会收到它,所以您可以继续到<?php回声link_to(“登录页面”,“@login”)? >. < / p >
发送电子邮件
好的,如果用户输入了一个有效的电子邮件地址,a邮件/ sendPassword
行动被称为。现在我们需要创建它。
邮件发送动作
创建一个新的邮件
模块:
初始ob娱乐下载化模块前端邮件
添加一个新的sendPassword
对该模块的操作:
公共函数executeSendPassword(){美元的邮件=新sfMail();美元的邮件->addAddress(这个美元->getRequestParameter(“电子邮件”));美元的邮件->setFrom(“Askeet < askeetob娱乐下载@symfony-project.com >”);美元的邮件->setSubject(“Askeet密码恢复”);美元的邮件->setPriority(1);美元的邮件->addEmbeddedImage(sfConfig::得到(“sf_web_dir”).' /遗留/图片/ askeet_logo.gif ',“CID1”,使用商标的,“base64”,“图像/ gif”);这个美元->邮件=美元的邮件;这个美元->昵称=这个美元->getRequest()->getAttribute(“昵称”);这个美元->密码=这个美元->getRequest()->getAttribute(“密码”);}
动作使用sfMail
对象,它是邮件发送者的接口。所有的电子邮件标题都在动作中定义,但由于正文比简单的文本更复杂,因此我们选择为其使用模板-否则,我们可以使用一个简单的- > setBody ()
方法。
类来添加嵌入的图像- > addEmbeddedImage ()
方法,以及服务器上的图像路径,插入模板的唯一ID,替代文本和格式描述必须作为参数传递。
请注意
的sfMail
对象也是一个向邮件中添加附件的好方法:
//文件附件美元的邮件->addAttachment(sfConfig::得到(“sf_data_dir”).' / MyDocument.doc ');//字符串连接美元的邮件->addStringAttachment(“这是一些很酷的文本嵌入”,“file.txt”);
您将找到更多关于sfMail
对象中的邮件一章交响乐书的。ob娱乐下载
邮件模板
操作执行之后,邮件视图将已定义的变量处理为sendPasswordSuccess.php
,这是电子邮件正文的默认HTML模板:
Dear askeet user,
一个请求为<?php回声美元的邮件->getSubject()? >寄到这个地址。
出于安全考虑,askeet网站不将密码存储在clear中。当您忘记密码时,askeet将创建一个新可以就地使用的。
您现在可以连接到您的askeet配置文件:
昵称:< strong>回声美元的昵称?>
密码:回声美元的密码?>需要连接<?php回声link_to(“登录页面”,“@login”,数组(“绝对”= >真正的))? >输入这些代码。
我们希望很快能在“cid: CID1”/>
askeet email robot
.
就像在任何其他模板中一样,标准helper(如link_to ()
这里使用的助手)在电子邮件模板中无缝工作。您还可以插入任何演示HTML,您需要使电子邮件看起来更好。
嵌入图像就像传递一个席德:
与操作中加载的图像的唯一id相对应的参数。
备用邮件模板
如果视图找到sendPasswordSuccess.altbody.php
,它将使用它来添加一个替代(文本)主体的电子邮件。这允许你为不接受HTML的电子邮件客户端定义一个纯文本模板:
亲爱的askeet用户,一个请求为<?php回声美元的邮件->getSubject()? >寄到这个地址。为出于安全考虑,askeet网站不明确存储密码。当您忘记密码时,askeet将创建一个新可以就地使用的。您现在可以连接到您的askeet配置文件:昵称:<?php回声美元的昵称? >密码:<?php回声美元的密码? >要连接,请进入登录页面(http:/ / www.askeet.com/login)输入这些代码。我们希望很快在askeet上见到你!askeet邮件机器人
配置
的sfMail
作为为该操作定义的视图,它可以接受其他配置。创建一个mailer.yml
配置文件:
Dev: deliver: off all: mailer: sendmail
这规定了用于发送邮件的mailer程序,并在开发环境中禁用了邮件的发送—无论如何,测试数据中的电子邮件都是假的。
您不希望用户直接访问此邮件操作。创建一个module.yml
在模块中配置/
目录:
All: is_internal:开启
测试
测试新的密码恢复系统通过创建一个自定义用户在测试数据与您的个人电子邮件,启动import_data.php
批处理。
清理缓存,进入生产环境密码恢复界面。在输入您的电子邮件地址并提交表格后,您应该很快就会收到电子邮件。
明天见
symfony的电子邮件系统既简单又强大ob娱乐下载。简单的电子邮件尽可能容易发送;复杂的电子邮件并不比复杂的HTML页面更难编写,并且您可以充分利用MVC架构。因此,对于你的下一个电子邮件活动,也许你应该使用symfony而不是商业电子邮件解决方案……ob娱乐下载
不管怎样,明天是标签日。Askeet问题将被标记,标签将是可搜索的,我们将给你你曾经梦想过的最好的标签云。ob直播app
像往常一样,今天的代码可在askeet SVN存储库、标记/标签/ release_day_12
.我们仍然不确定在第21天讨论什么,所以把你的建议发表到使用邮件列表或者使用论坛.
本作品采用创作共用署名-非商业性-禁止派生作品3.0未移植许可协议授权。