laravel 使用不同账号发送邮件的问题
业务背景:
公司自己做的oa系统,不同的模块需要用不同的邮箱发送信息给收件人。比如:员工离职的时候用离职的邮箱发送离职邮件通知,员工入职的时候用入职的邮箱发送入职邮件通知。发邮件是一件耗时的任务,如果用同步执行的话会影响用户体验,就想到能不能把发邮件的操作放到队列中来进行。后来发现laravel其实是做不到的。
瓶颈:
我们用的是laravel框架,经过踩坑发现其实laravel并不支持我们上述的业务需求。大家可以参照一下这个url:https://learnku.com/laravel/t/3285/resolved-how-to-make-laravel-53-support-multiple-mail-driver-and-can-switch-in-operation
解决问题的思路:
使用队列来保证异步,在出队的时候获取请求数据,更新账号发送邮件,来保证使用的是不同邮箱。
那有的人可能就会问了:你怎么能保证使用异步的同时又能够用不同的账号发送邮件呢?有两点:
(1)我试过,而且成功了。
(2)这个时候就需要论证一下了。首先这样做是一定能保证异步的,这一点想必大家都没疑问。那有疑问的应该就是,如何能保证用不同的账号发送邮件呢?我们这样想:队列在出队后,执行一个laravel相关的脚本,在执行脚本的过程中,我们可以理解为又新起了一个进程,这个进程有自己的容器,那么我们就可以为这个进程设置它自己的邮件账号。这样理解应该就没有什么问题了。下图是artisan命令的介绍,来论述我自己的理论。

实现方法:
(1)数据放到redis中,使用key存储起来
为啥这样做?试想一下,你在传参的过程中,如果传的是个数组,你是不是要把它给json_encode一下?因为command命令是不支持直接传数组的,只能传字符串。用json字符串做参数你要考虑的有一下几点:你的command的命令能写对吗?你传的字符串的格式能写对吗?laravel在执行你的command命令的时候会不会对你的json字符串做一下处理,导致结果错误?你在decode的时候能不能得到想要的结果?我试了几种方法,没成功,还是乖乖的用了redis。
$this->msg = serialize($this->msg);
$key = $this->from .'_' . (microtime(true) * 1000);
Redis::set($key, $this->msg);
Redis::expire($key, 60 * 10);
$command = 'php artisan email:send --msgKey='. $key . ' --from=' . $this->from;
shell_exec($command);
(2)出队执行发送邮件操作
$this->info('start');
$msgKey= $this->option('msgKey');
$from = $this->option('from');
if (empty($msgKey) || empty($from)) {
return [];
}
$msg = Redis::get($msgKey);
if (empty($msg)) {
return [];
}
$msg = unserialize($msg);
\Log::info('EmailSendMes', [$msg, $from]);
MailHelper::sendMail($msg, $from);
$this->info('end');
(3)设置发送邮件的邮箱

感悟:
今天下午在公司门口走了走,阳光已经不是很烈了,能闻到草和泥土的味道。不知名的花在悠闲的开着,白鹭在水面上自由的飞、叫、盘旋。海风吹来,整个人都感觉很舒服,很幸福。这样的日子好久没有过了。想想自己,从高中,到大学,到毕业,一直都在奔波,都在与别人竞争,与自己竞争,像这样生活已经很久没有过了。你就感觉很舒服,很安心,很踏实。不会再去想,人活着的意义,人奋斗的意义,因为那一刻的美好,就是一切的答案。趁年轻,想做的事,赶紧吧,不要给自己留遗憾。
laravel 使用不同账号发送邮件的问题的更多相关文章
- 如何在 Laravel 中使用 SMTP 发送邮件(适用于 163、QQ、Gmail 等)
Laravel 和 Laravel 的邮件发送使用方式完全一致.Laravel 的邮件发送中文文档在:http: 邮箱为例,展示如何用 Laravel 内置的邮件发送类来发送邮件. 配置 修改邮 ...
- python使用随机的163账号发送邮件
import linecache import smtplib import time import linecache import random #算出txt的行数,163账号_2.txt中,每一 ...
- Laravel中利用队列发送邮件的方法示例
https://www.jb51.net/article/121647.htm 本文主要给大家介绍了关于Laravel中队列发送邮件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的 ...
- laravel 定时任务通过队列发送邮件
https://www.jianshu.com/p/f6b94596098e 关于laravel发送邮件,请先参考我的另一片文章:laravel sendcloud发送邮件,再继续往下看. 1.用da ...
- python实战===使用随机的163账号发送邮件
import linecache import smtplib import time import linecache import random #算出txt的行数,163账号_2.txt中,每一 ...
- [麦先生]在Laravel框架里实现邮箱验证---发送邮件
在经过一段时间的使用后,发现在项目中很多地方需要用到用户验证,以短信验证和邮箱验证为主流趋势,小麦总结了如果在Laravel框架中实现发送邮件功能,以后会陆续更上如何实现短信验证..... 在.env ...
- L05 Laravel 教程 - 电商实战
https://laravel-china.org/courses/laravel-shop https://laravel-china.org/topics/13206/laravel-shop-c ...
- 用Node.js发送邮件
本文讲的是用Node.js通过一个开启smtp的已有的邮箱账号发送邮件,而不是如何创建一个邮件服务器 开启smtp服务 首先要去要使用的邮箱中设置开启smtp,才能正常发送邮件 这边以163邮箱为例 ...
- [Outlook] Outlook2013能收但无法发送邮件-0x800CCC13, 0x800CCC0B, 0x8004210B
[20140704更新],在公司收邮件的时候,问题再次出现,错误码:0x800ccc13,按照以下方法测试成功: 1. 按照以前办法,反复重启,失败 2. 按照以下参考连接A中的步骤 a. Click ...
随机推荐
- git 常用命令语句(个人笔记)
切换账户 git config user.name xxxxx 查看用户名 ex: git config user.name tongjiaojiao git config user.e ...
- b/s和c/s
一.B/S结构 B是英文单词“Browser”的首字母,即浏览器的意思:S是英文单词“Server”的首字母,即服务器的意思.B/S就是“Browser/Server”的缩写,即“浏览器/服务器”模式 ...
- C#中实现Hash应用
在C#中,数据的Hash以MD5或SHA1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比MD5强度高. 1.1 SHA- ...
- Spring IOC的简单实现
简单的说,Spring就是通过工厂+反射将我们的bean放到它的容器中的,当我们想用某个bean的时候,只需要调用getBean("beanID")方法即可. 原理简单说明: Sp ...
- 百度的echarts报表数据直接显示
最近在使用百度的echarts开发,在使用过程中,遇到点需求,就是希望显示的数据直接在图标上显示,而不是鼠标滑动以后才显示,于是百度搜了下相关的文章正好找到了,然后使用了这个方法是可以用的,所以这里记 ...
- jQuery ajax 提交表单图片
基于 jQuery HTML: <form id="form" enctype="multipart/form-data"> <input t ...
- MobileNet系列
最近一段时间,重新研读了谷歌的mobilenet系列,对该系列有新的认识. 1.MobileNet V1 这篇论文是谷歌在2017年提出了,专注于移动端或者嵌入式设备中的轻量级CNN网络.该论文最大的 ...
- centos7 yum快速安装LNMP
1.安装nginx yum install nginx ##开启nginx service nginx start 2.安装MYSQL yum localinstall http://dev.mysq ...
- trigger添加及表达式
创建触发器 点击Configuration(配置) → Hosts(主机) 点击hosts(主机)相关行的trigger 点击右上角的创建触发器(create trigger) name : 触发器名 ...
- 怎么去掉zencart模板网址后面的zenid=数字这个东西
搜索引擎优化后第一次进入商店网址URL后面会出现zenid=XXXX 如:http://afish.cnblogs.com/zencart-zenid.html?zenid=tbisz675099db ...