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

2015-3-13   /   字数:1145   /   阅读数:193413   /   分类: 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

评论:

阿阳
2019-10-23 15:48
博主你好,我配的QQ邮箱服务,发邮件到类似123@qq.com, 357@qq.com这样的就会报:Expected response code 354 but got code "503", with message "503 Error: need RCPT command "这个错误,这个怎么回事呢?我拦截采用的:
//判断发送情况
        if (Mail::failures()){
            \Log::debug('Mail not sent');
            return false;
        }else{
            \Log::debug('Mail sent successfully.');
            return true;
        }
可是这个拦截不到这个错误。
豪杰
2021-01-03 17:26
@阿阳:对于无法到达的地址或者非法的邮箱地址会报你这个错误的
猪猪侠
2019-08-23 16:41
Swift_TransportException: Connection could not be established with host smtp.qq.com [No route to host #113] in file /www/wwwroot/www.syswz.com/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php on line 269
报这个错 不知道 怎么解决
.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=XXXXXXXX@qq.com
MAIL_PASSWORD=XXXXXXXXX
MAIL_ENCRYPTION=SSL


'driver' => env('MAIL_DRIVER', 'smtp'),
  'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'xxxxxxxx@qq.com'),
        'name' => env('MAIL_FROM_NAME', '项目'),
    ],
Sunshaolei
2019-08-09 23:14
邮件发送不出去是什么问题导致的,邮箱接收不到邮件
我的配置是这样配置的:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_FROM_ADDRESS=ssl15081228231@163.com
MAIL_FROM_NAME=CoreBlog
MAIL_PORT=465
MAIL_USERNAME=ssl15081228231@163.com
MAIL_PASSWORD=********
MAIL_ENCRYPTION=ssl
larwas
2018-06-29 11:23
报错:Expected response code 220 but got code "", with message ""
那一抹火焰
2018-05-29 21:55
发邮件的553的问题解决了:
要.env中配置MAIL_FROM_NAME且需要与MAIL_USERNAME一致。
x
2018-05-24 10:45
hello, 我想请教下,发送邮件总是会报错超时是什么原因?是发送的gmail的smtp
高捧归
2018-01-15 16:31
上线可以运行吗??
imooto_cc
2017-12-11 14:28
Swift_TransportException thrown with message "Expected response code 250 but got code "553", with message "553 authentication is required,163 smtp14,EsCowAA3T3YLJS5ajXK1Dg--.35823S2 1512973579
这个是什么原因呢?换了qq 163  都是提示这个错误
Geniy
2018-01-12 11:15
@imooto_cc:你可以去你设置的发送邮箱看下 POP3/SMTP服务 是否开启
alex
2017-11-06 23:31
这个code是随机生成的吗
winnie
2017-11-01 17:35
===============mail.php文件
<?php
return [
    'driver' => env('MAIL_DRIVER', 'smtp'),
    'host' => env('MAIL_HOST', 'smtp.163.com'),
    'port' => env('MAIL_PORT', 587),
    'from' => ['address' => 'xxxh@163.com', 'name' => 'Test'],
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_USERNAME', null),
    'password' => env('MAIL_PASSWORD', null),
    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => false,
];

=============
.env文件配置
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=xxxh@163.com
MAIL_PASSWORD=xxxh

这样配置后发邮件出现 Expected response code 250 but got code "553", with message "553 Local user only,163 smtp14,EsCowAB3_akEk_lZvAjPBg--.25694S2 1509528324 " 错误,如果是按照博主的来配置port=25会出现“Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required”

163的邮箱已经开启了smtp服务,而且使用的是客户端授权码作为MAIL_PASSWORD 本机可以ping通smtp.163.com
JohnLui
2017-11-01 18:21
@winnie:from 和 username 必须一致呦。如果不行试试清空缓存,还不行就不用加密了,端口用 25 加密设置成 null。
winnie
2017-11-02 10:13
@JohnLui:from 里的address和username配置是同一个163邮箱,我清空了缓存试了也不行.我尝试了端口25不加密也还是报553的错误.每次编辑配置后都有php artisan config:clear 及php artisan cache:clear 好想知道是哪里错了.程序是在docker中运行的
JohnLui
2017-11-02 12:12
@winnie:可能是你的 ip 被封了。。。
YuGuo
2018-02-09 11:32
@winnie:不知道你解决没有。不管你用什么邮箱,把邮件发送的方法中的 $from和$name也需要设置成一样的。。。
小李子
2018-06-01 15:57
@winnie:@winnie  遇到相同问题,不知道你是怎么解决的??
Watts
2017-04-05 15:01
请问5.1中,注册时邮箱验证应该怎么写,要重写postRegister方法吗?不知道你上面的uid和uname 怎么获取的,可以把完整的代码展示出来吗
悦宝宝
2017-03-21 20:08
Connection could not be established with host stmp.163.com [php_network_getaddresses: getaddrinfo failed: ��֪������������ #0]


求解这个是因为什么阿  就是提示连不上163主机。  不知道怎么解决~
icymoon
2017-01-04 16:26
Expected response code 220 but got code \"\", with message \"\"",
。。不知道怎么解决。。配置完全一样, 163的客户端授权码也开了
yeruja
2017-01-05 11:14
@icymoon:您好, 我也刚刚遇到相同的问题, 请问您解决了吗?
yeruja
2017-01-05 11:21
@icymoon:我刚刚端口号改为25就OK了,  之前别的例子用的都是端口号465
icymoon
2017-01-06 19:52
@yeruja:我也是。。。 但是用25端口依然会报错,但是邮件收到了。。。很不可思议,,
自恋狂
2017-01-04 11:10
用的5.1,学习的时间不久,现在发送普通邮件是正常的,但是发送有view视图的邮件时就一直超时了,一直搞不明白!
Whoops, looks like something went wrong.

1/1
Swift_TransportException in StreamBuffer.php line 269:
Connection could not be established with host smtp.163.com [Connection timed out #110]
in StreamBuffer.php line 269
at Swift_Transport_StreamBuffer->_establishSocketConnection() in StreamBuffer.php line 62
at Swift_Transport_StreamBuffer->initialize(array('protocol' => '', 'host' => 'smtp.163.com', 'port' => '25', 'timeout' => '30', 'blocking' => '1', 'tls' => false, 'type' => '1', 'stream_context_options' => array())) in AbstractSmtpTransport.php line 113
at Swift_Transport_AbstractSmtpTransport->start() in Mailer.php line 79
at Swift_Mailer->send(object(Swift_Message), array()) in Mailer.php line 374
at Mailer->sendSwiftMessage(object(Swift_Message)) in Mailer.php line 196
at Mailer->send('notifications::email', array('level' => 'info', 'subject' => null, 'greeting' => null, 'introLines' => array('You are receiving this email because we received a password reset request for your account.'), 'outroLines' => array('If you did not request a password reset, no further action is required.'), 'actionText' => 'Reset Password', 'actionUrl' => 'http://test.z-love.com/password/reset/dafb5d7b21597b7ede8cedab5df7c6ef196c2ac1d298235052308773b8020f0c', 'message' => object(Message)), object(Closure)) in MailChannel.php line 81
kaka
2016-12-21 14:37
Connection could not be established with host smtp.qq.com [ #0]  这是什么意思呀 ,,,有没有解决的办法
菜鸟程序员
2016-12-06 16:26
请问用laravel框架  发送邮件找回密码怎么写
阿斯达撒旦
2019-03-28 14:25
@菜鸟程序员:拿手写

2016-12-02 20:10
Expected response code 250 but got code "530", with message "530 5.7.1 Authe 博主您好!你能帮我看看这是怎么回事么?我很急!谢谢!!
function sendMail()
    {
//        $name = '学院君';
//        $flag = Mail::send('Login.active',['name'=>$name],function($message){
//            $to = '1298528156@qq.com';
//            $message ->to($to)->subject('测试邮件');
//        });
//        if($flag){
//            echo '发送邮件成功,请查收!';
//        }else{
//            echo '发送邮件失败,请重试!';
//        }
         Mail::raw('水水水水',function ($message){
            $message->subject('提醒邮件');
            $message->to('1298528156@qq.com');
         });

    }



上面是控制器代码


'driver' => env('MAIL_DRIVER', 'smtp'),
    'host' => env('MAIL_HOST', 'smtp.163.com'),
    'port' => env('MAIL_PORT', 25),
    'encryption' => env('MAIL_ENCRYPTION', null),
    'username' => env('13521107990@163.com'),
    'password' => env('bai123'),
    'from' => ['address' => '13521107990@163.com', 'name' => '白'],
    'sendmail' => '/usr/sbin/sendmail -bs',

这是mail.php 各种方法都试了 都是这个错
JohnLui
2016-12-02 20:19
@白:'driver' => env('MAIL_DRIVER', 'smtp'), 这个函数的意思是先从 .env 里面读 MAIL_DRIVER 的值,如果没有,就赋值为 smtp,所以,你需要检查一下你的 .env。
zab
2017-11-03 21:40
@JohnLui:用163发送邮件,有时成功,大多情况不成功,返回554,总是被163视为垃圾邮件怎么办呢?如果这不能解决,那通过163发送邮件就没有什么鸟用了
骚年不再少
2017-06-06 16:54
@白:哥们 你这个问题解决了吗 我跟你的问题一样
安小游
2018-01-18 14:02
@骚年不再少:我这样设置的

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=471607346@qq.com
MAIL_PASSWORD=xxxxxxxx
MAIL_ENCRYPTION=ssl
lllllll
2016-11-13 09:26
验证的时候route怎么写啊
wentailai
2016-09-26 16:21
求帮助,,,为什么我下载的框架没有 mail这个类啊。这样子的话应该怎么结局这个问题?
wotemenige
2017-10-12 10:53
@wentailai:需要做一个事件监听  命令行
MONkye___
2016-09-12 13:29
博主我想请问一下  怎么样判断邮件到底发送成功没有
you件
2016-09-08 09:12
Failed to authenticate(鉴定) on SMTP server with username "13141224138@163.com" using 2 possible authenticators(认证者)   怎么弄。。
gmzhang
2016-09-10 11:34
@you件:在设置163的SMTP时,163需要我们设置一个授权码!然后在laravel中,将这个授权码代替邮箱密码使用,就可以了。
张小白
2016-10-25 18:03
@gmzhang:腾讯的企业邮箱也出现同样的问题,但貌似没有授权吗,要怎么解决?多谢!
mushroom
2016-10-27 15:25
@张小白:解决了吗
张小白
2016-10-27 17:56
@mushroom:解决了。端口写错了!smtp.exmail.qq.com (端口 25),使用SSL,端口号465
333
2016-08-24 10:41
发送邮件提示: ErrorException in SimpleMimeEntity.php line 83: getmypid() has been disabled for security reasons
因为是在服务器上,空间买的,无法更改php.ini设置,请问这个函数被屏蔽了,怎么发邮件呢。
claire
2016-08-09 17:07
Maximum function nesting level of '100' reached, aborting!
这个什么错误 求救
stermpuppy
2016-12-11 22:06
@claire:在bootstrap/autoload.php最上面加上一句
ini_set('xdebug.max_nesting_level', 120);
初学者
2016-08-04 10:30
老师 我为什么本地发邮箱报错超时啊
CanoeChow
2016-08-02 09:52
您好博主! 我出现了问题.
我采用的框架版本是 laravel5.2

以下是我config/mail.php 的配置
<?php
return [
    'driver' => 'smtp',
    'host' => 'smtp.qq.com',
    'port' => 465,
    'from' => ['address' => '285549199@qq.com', 'name' => 'Welcome'],
    'encryption' => null,
    'username' => '285549199@qq.com',
    'password' => 'xxxxx',
    'sendmail' => '/usr/sbin/sendmail -bs',
];

app/Http/routes.php采用如下代码

Route::get('mail', function () {
    $data = ['name' => 'CanoeChow'];
    Mail::send('emails.hello', $data, function ($message) {
        $message->to('a17855827493@icloud.com')->subject('Welcome!');
        $message->attach(public_path().'img/pic.jpg');
    });
    return 'OK!';
});

结果:
Swift_TransportException in AbstractSmtpTransport.php line 404:
Connection to smtp.qq.com:465 Timed Out

求您解答~谢谢~
JohnLui
2016-08-02 11:48
@CanoeChow:错误提示很明显呀:Connection to smtp.qq.com:465 Timed Out
CanoeChow
2016-08-02 11:50
@JohnLui:我解决了.
因为qq邮箱采用了ssl加密
因此encryption要设置为ssl.
这样就能发送成功了.
jL
2016-06-22 00:09
发送成功了,感谢!
wuzhyong
2016-06-16 10:38
很简单的问题,账号和密码问题,
( ! ) Fatal error: Uncaught exception 'Swift_TransportException' with message ' in C:\wamp\www\news\lib\mail\classes\Swift\Transport\AbstractSmtpTransport.php on line 383
( ! ) Swift_TransportException: Expected response code 250 but got code "553", with message "553 Mail from must equal authorized user " in C:\wamp\www\news\lib\mail\classes\Swift\Transport\AbstractSmtpTransport.php on line 383
这个错误导致原因很简单,发件人不对
setFrom账号要与setUsername统一

2016-03-01 19:09
老师,我用qq邮箱,上午还能够发送邮件,下午就不能发送邮件了,

mail.php 中换成别人的账号就有能发送了。

为什么我原来的账号不能发送????
charles
2016-02-02 18:20
能不能贴一下完整的代码????
小新
2016-01-29 11:41
老师,您好:
           config/mail.php  配置了'from' => ['address' => '***@163.com', 'name' => 'TestMail'],

          .env 配置了
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=*******@163.com
MAIL_PASSWORD=*******


发送代码:
            $data = ['email'=>'******@qq.com', 'name'=>'小新', 'uid'=>'100', 'activationcode'=>'123456'];
        Mail::send('activemail', $data, function($message) use($data)
        {
            $message->to($data['email'], $data['name'])->subject('欢迎注册我们的网站,请激活您的账号!');
        });
为什么发出去的邮件的发件人显示的是 “手机邮箱”
charles
2016-02-02 17:38
@小新:为什么我本地开发,好像发不出邮件?配置什么的都是跟你差不多
curry
2016-01-13 17:12
Address in mailbox given [823232600@qq.com ] does not comply with RFC 2822, 3.6.2.   这个怎么解决
curry
2016-01-14 17:59
@curry:不用了
mayao
2016-03-22 16:21
@curry:Address in mailbox given [823232600@qq.com ] does not comply with RFC 2822, 3.6.2.   这个怎么解决 这个问题怎么解决的
求助
2015-12-02 15:07
哪位大大看到可以给个完整的发送邮件的代码啊  使用的是laravel 5
发邮件耗时
2015-11-01 19:23
博主, 请问发邮件耗时阻塞怎么处理? 请问博主queue如何使用?
发不了邮件
2015-10-30 17:57
博主, 为什么发不了邮件, 报错 Connection could not be established with host smtp.163.com, 开启了ssl,
Lisam
2015-10-22 16:34
Swift_TransportException in AbstractSmtpTransport.php line 383:
Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required
"博主又遇到了这个错误了,但是邮箱那半边smtp已开启  
nihao
2015-12-16 11:54
@Lisam:你这个问题怎么解决的哪
瑛民星
2016-01-26 15:12
@Lisam:您解决了么?我也遇到这个问题了
亲爱的楼主
2015-09-24 18:49
Failed to authenticate on SMTP server with username "xxxxxx@163.com" using 2 possible authenticators

这个是什么错误啊
hi_tp
2015-10-08 18:03
@亲爱的楼主:哈哈,你觉得应该是什么错误呢
一叶之秋
2016-07-10 21:06
@亲爱的楼主:有解决方案了吗?我也一样!求回复
Lisam
2015-09-23 19:12
博主 那use \Mail在哪个文件 他所在的文件是什么性质
Lisam
2015-09-05 10:08
博主  Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required
出现上面的问题了  我把'driver' => env('MAIL_DRIVER', 'smtp'),换成'driver' => 'smtp'还是一样的情况
xiang
2016-06-01 09:03
@Lisam:我的也是这个错    你是怎么解决的????
huangdr
2015-08-26 22:36
按照手册配置以后用下面的发送程序,既没有报错也收不到邮件,楼主求救
            $email = '981902663@qq.com';
            $name = 'test';
            $uid = '123';
            $code = 'test123';
            $data = ['email'=>$email, 'name'=>$name, 'uid'=>$uid, 'activationcode'=>$code];
            Mail::send('activemail', $data, function($message) use($data)
            {
                $message->to($data['email'], $data['name'])->subject('测试邮箱验证!');
            });
virtual
2016-06-30 18:14
@huangdr:看看垃圾箱里有没有??

2015-08-01 22:36
求完整源码!
求助
2015-12-02 15:40
@王:收到源码请给我发送一份
spenceacc
2016-02-18 11:11
@求助:我也要一份
dragon
2016-02-19 14:39
@spenceacc:我也要一份
Watts
2017-04-05 15:03
@王:我也要一份!!
周周
2015-07-26 22:26
Laravel 5.1 全局配置文件如下(.env):
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=zhuxmei520@163.com
MAIL_PASSWORD=198****
MAIL_ENCRYPTION=null

哪里错了,发不出邮件!
JohnLui
2015-07-27 01:12
@周周:1. 检查这个邮箱是否开启了 SMTP 服务。
2. 如果还不行,贴 email.php 的代码,可能有低级错误。
leake
2015-09-08 21:26
@JohnLui:看到评论里面的内容,我也解决了问题了
我这边是5.1的,配置文件.env里面MAIL_DRIVER配成了log模式,难怪一直只能看到日志缺发不出去。
感谢各位大大的智慧。

2015-07-07 14:24
怎么有的邮箱服务器连接不上啊。。。。我用163的邮箱服务器就可以发送邮件,用公司的邮箱服务器就发送不了,汗。
初来乍到
2015-06-02 11:52
能不能教我文件上传功能啊
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-2024 岁寒  |  Powered by Emlog