哪个网站做相册好,php企业网站通讯录管理系统,手机端传奇,wordpress分类不显示利用 Composer 完善自己的 PHP 框架(二)——发送邮件2014-10-18 / 阅读数#xff1a;23506 / 分类#xff1a; PHP回顾上一篇文章中#xff0c;我们手工建造了一个简易的视图加载器#xff0c;顺便引入了错误处理包#xff0c;让我们的 MFFC 框架在 M、V、C 三个方面都达到…利用 Composer 完善自己的 PHP 框架(二)——发送邮件2014-10-18 / 阅读数23506 / 分类 PHP回顾上一篇文章中我们手工建造了一个简易的视图加载器顺便引入了错误处理包让我们的 MFFC 框架在 M、V、C 三个方面都达到了“好用”的水平。View 是一个可插拔组件在本篇文章中我们要创建另一个可插拔组件——邮件发送模块。正文我们采用 nette/mail 包作为我们的邮件发送基础模块在它的基础上封装一个 Mail 类暴露出简洁的 API 给控制器使用下面我们正式开始。引入 nette/mail 包修改 composer.jsonrequire: {codingbean/macaw: dev-master,illuminate/database: *,filp/whoops: *,nette/mail: *},运行 composer update等待安装完成。nette/mail 的文档位于http://doc.nette.org/en/2.2/mailing 让我们阅读它然后设计 Mail 类新建 services/Mail.php 文件内容如下?php use Nette\Mail\Message;/*** \Mail*/class Mail extends Message{public $config;// [String] e-mailprotected $from;// [Array] e-mail listprotected $to;protected $title;protected $body;function __construct($to){$this-config require BASE_PATH./config/mail.php;$this-setFrom($this-config[username]);if ( is_array($to) ) {foreach ($to as $email) {$this-addTo($email);}} else {$this-addTo($to);}}public function from($fromnull){if ( !$from ) {throw new InvalidArgumentException(邮件发送地址不能为空);}$this-setFrom($from);return $this;}public static function to($tonull){if ( !$to ) {throw new InvalidArgumentException(邮件接收地址不能为空);}return new Mail($to);}public function title($titlenull){if ( !$title ) {throw new InvalidArgumentException(邮件标题不能为空);}$this-setSubject($title);return $this;}public function content($contentnull){if ( !$content ) {throw new InvalidArgumentException(邮件内容不能为空);}$this-setHTMLBody($content);return $this;}}Mail 类和 View 类工作的方式基本一致$this-mail Mail::to([ooxxgmail.com, ooxxqq.com])-from(MotherFucker )-title(Fuck Me!)-content(Hello~~);上面这段代码位于 HomeController 中 View::make() 那行代码的下面。新建 MFFC/config/mail.php请自行替换邮件地址和密码?php return [host smtp.163.com,username ooxx163.com,password password,secure ];Mail 和 View 一样也在 BaseController 的析构函数 __destruct() 函数中处理现在这个 function 长这样public function __destruct(){$view $this-view;if ( $view instanceof View ) {extract($view-data);require $view-view;}$mail $this-mail;if ( $mail instanceof Mail ) {$mailer new Nette\Mail\SmtpMailer($mail-config);$mailer-send($mail);}}OK准备的差不多了运行 composer dump-autoload 把 Mail 类加入自动加载刷新页面如果你看到以上页面恭喜你邮件发送成功了赶快去检查一下收件箱有木有邮件:-D 这次页面加载可能会稍慢因为邮件是同步发送的。异步的队列系统我们会在以后讲到。分析邮件发送的整体流程想必大家已经轻车熟路了现在主要叙述一下 Mail 类的设计过程邮件发送的核心参数是 目标地址即邮件要发送到的 E-mail 地址所以我们设计 Mail::to(ooxx.me) 作为发送的 触发 API。目前我们采用最简单的 SMTP 方式发送邮件文档在 这里。配置文件放置在 MFFC/config/mail.php 中依旧返回一个数组。Mail 类继承了 Nette\Mail\Message 类。Mail::to() 的时候创建一个 Mail 类的实例(对象)并返回这时候其实 BaseController 中的析构函数中的代码已经会被触发并处理这个对象了。默认的发送人是从配置文件中读取的 username。Mail::to() 支持 字符串 或者数组作为参数可以一次发送一封或多封邮件。from()、title() 和 content() 方法用于丰富邮件内容。content() 方法可以直接传递 HTML 代码。from() 配置不一定都能够成功部分邮件服务商不支持修改发送人地址。这个变量全部组装完成后被赋值给控制器的 $mail 成员变量然后被析构函数处理邮件被发送成功后页面代码被发送回客户端流程结束。WRITTEN BY程序员Swift Contributor正在写《iOS 可视化编程与 Auto Layout》。评论lhh2018-03-02 14:10phpstorm 点进去能找到mail类但是报错是Class Services\Mail not founddaode2020-08-25 18:31lhhcomposer dump-autoload 试试小样2018-01-31 15:37按照配置配置完成mail服务之后报错SMTP server did not accept . with error: 554 DT:SPM 163 smtp2,DNGowACnMfatcXFaOgQVAA--.297S2 1517384109,please see http://mail.163.com/help/help_spam_16.htm?ip61.149.143.14hostidsmtp2time1517384109请问博主这是啥情况呢是配置项没有配对还是程序验证上哪里出问题了呢jason2017-07-10 16:43我想请教大佬JohnLui到目前为止View或者Mail这类功能再析构中触发是基于性能考虑或者是什么考虑2017-07-10 16:49jason我把 TinyView 放到析构中触发是为了不侵入主流程。。。至于 Mail这东西比较耗时实际场景下一般使用队列系统异步发送。haha2017-06-06 19:25config/mail.php 由163换车搜狐的邮箱就可以了163的邮箱安全验证比较严格导致return [host smtp.sohu.com,username xxxxxsohu.com,password xxxxx,secure ];kun2017-04-05 19:44我的也没有报错效果也和博主的一样可为什么没有收到呢 应该还是发送不成功。crlt_2018-01-17 10:34kun可以看看你的垃圾箱风无心2016-08-18 18:22markdown写出来的文档直接让人有种跪舔的冲动woodstig32015-08-21 21:48按照教主的示例做下来总是返回“No connection could be made because the target machine actively refused it.”这好像是SMTP服务器的设置问题但是查看了163的邮箱设置确实打开了SMTP服务了为什么无法连接上呢woodstig32015-08-23 15:25woodstig3问题没有找到但是从教主的github主页上把Mail.php下下来重新跑就没这个问题了。但是邮件似乎还没有发出去。再查发表评论昵称邮件地址 (选填)个人主页 (选填)