如何在 Laravel 中使用 SMTP 发送邮件(适用于 163、QQ、Gmail 等)

2015-3-13   /   阅读数:136459   /   分类: Laravel

Laravel 提供了非常简单的邮件发送 API,但是文档却不是太清晰,再加上它采用传递闭包(回调函数)的方式调用,导致邮件发送的使用门槛偏高。

Laravel 4 和 Laravel 5 的邮件发送使用方式完全一致。Laravel 5 的邮件发送中文文档在:http://laravel-china.org/docs/5.0/mail

本文中,我将以 163 邮箱为例,展示如何用 Laravel 内置的邮件发送类来发送邮件。

配置

修改邮件发送配置。4.2 在 app/config/mail.php,5 在 config/mail.php,修改以下配置:

'host' => 'smtp.163.com',
'port' => 25,
'from' => array('address' => '***@163.com', 'name' => 'TestMail'),
'username' => '***@163.com', // 注意,这里必须和上一行配置里面的邮件地址一致
'password' => '****',

发送

在控制器或者模型里,调用以下代码:

$data = ['email'=>$email, 'name'=>$name, 'uid'=>$uid, 'activationcode'=>$code];
Mail::send('activemail', $data, function($message) use($data)
{
    $message->to($data['email'], $data['name'])->subject('欢迎注册我们的网站,请激活您的账号!');
});


邮件视图为 views/activemail.blade.php:

<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
  </head>
<body>
  <a href="{{ URL('active?uid='.$uid.'&activationcode='.$activationcode) }}" target="_blank">点击激活你的账号</a>
</body>
</html>


搞定!

WRITTEN BY

avatar

评论:

QQQQ
2015-05-14 10:13
530错误? 需要认证,在哪里设置?
JohnLui
2015-05-14 10:25
@QQQQ: 仔细检查一下配置文件和上面列出的有什么不同~
redstone
2015-04-28 09:17
恩,我找了一下,改了一下端口,我改成了25,结果就成功了,……谢谢博主了,很是受益,
redstone
2015-04-27 18:35
恩,确实是一句惊醒梦中人,可以,我也是高兴有点早了,我加了之后,还是出错来了,Swift_TransportException in AbstractSmtpTransport.php line 383:
Expected response code 220 but got code "", with message "",
JohnLui
2015-04-27 18:39
@redstone:服务器连接失败
黄传备
2016-01-14 10:30
@JohnLui:楼主,想问下。服务器连接失败该怎么解决
redstone
2015-04-27 18:26
博主,你好,我想请教一下,如果我的$Email,等变量直接赋值的话,邮件可以发送,但是如果从input获取值,,就失败了,TokenMismatchException in compiled.php line 2486。这个怎么办呢?
JohnLui
2015-04-27 18:29
@redstone:TokenMismatchException 是表单提交失败,没有加入 input name=_token 那一行,跟邮件发送无关。
极乐
2015-04-26 10:12
水一把!
neo
2015-04-23 15:59
请问Mail::send 方法怎么来的, 按照您的方法提示 Mail::send 找不到。谢谢
JohnLui
2015-04-23 16:16
@neo:Laravel 5 需要在前面 use \Mail;
Sara
2015-04-23 22:05
@JohnLui:博主,试了您提供的方法,遇到点问题,能否解惑啊。
1 设置'host' => 'smtp.163.com', 但是公司电脑上smtp.163.com, ping 不通,连接不了服务器端。请问该怎么办呢?

2 在自己笔记本上能ping通,但是返回
“Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required”
网上说 SMTP服务器不允许从外部域发送邮件,即使是通过验证的,发送邮件必须使用同一个域。不太理解。

谢谢了。
JohnLui
2015-04-23 22:19
@Sara:邮件发送的细节太多了,我只能保证正确的基本用法。你的这个问题会不会是这个邮箱没开SMTP 服务?
Sara
2015-04-26 09:35
@JohnLui:谢谢博主,我的mail.config配错了,把'driver' => env('MAIL_DRIVER', 'smtp'),换成'driver' => 'smtp', 就好了。
beysong
2015-05-26 22:15
@Sara:把'driver' => env('MAIL_DRIVER', 'smtp'),换成'driver' => 'smtp', 就好了。
这个没啥用啊,我也是同样的问题,是不是因为本地环境不行啊
JohnLui
2015-05-27 10:14
@beysong:可能是本地的 .env 文件里面没有 MAIL_DRIVER 这一项配置?
beysong
2015-05-27 10:16
@beysong:对的,已经好了。谢谢。

发表评论:

© 2011-2019 岁寒  |  Powered by Emlog