业务背景:

  公司自己做的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 使用不同账号发送邮件的问题的更多相关文章

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

    Laravel  和 Laravel  的邮件发送使用方式完全一致.Laravel  的邮件发送中文文档在:http: 邮箱为例,展示如何用 Laravel 内置的邮件发送类来发送邮件. 配置 修改邮 ...

  2. python使用随机的163账号发送邮件

    import linecache import smtplib import time import linecache import random #算出txt的行数,163账号_2.txt中,每一 ...

  3. Laravel中利用队列发送邮件的方法示例

    https://www.jb51.net/article/121647.htm 本文主要给大家介绍了关于Laravel中队列发送邮件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的 ...

  4. laravel 定时任务通过队列发送邮件

    https://www.jianshu.com/p/f6b94596098e 关于laravel发送邮件,请先参考我的另一片文章:laravel sendcloud发送邮件,再继续往下看. 1.用da ...

  5. python实战===使用随机的163账号发送邮件

    import linecache import smtplib import time import linecache import random #算出txt的行数,163账号_2.txt中,每一 ...

  6. [麦先生]在Laravel框架里实现邮箱验证---发送邮件

    在经过一段时间的使用后,发现在项目中很多地方需要用到用户验证,以短信验证和邮箱验证为主流趋势,小麦总结了如果在Laravel框架中实现发送邮件功能,以后会陆续更上如何实现短信验证..... 在.env ...

  7. L05 Laravel 教程 - 电商实战

    https://laravel-china.org/courses/laravel-shop https://laravel-china.org/topics/13206/laravel-shop-c ...

  8. 用Node.js发送邮件

    本文讲的是用Node.js通过一个开启smtp的已有的邮箱账号发送邮件,而不是如何创建一个邮件服务器 开启smtp服务 首先要去要使用的邮箱中设置开启smtp,才能正常发送邮件 这边以163邮箱为例 ...

  9. [Outlook] Outlook2013能收但无法发送邮件-0x800CCC13, 0x800CCC0B, 0x8004210B

    [20140704更新],在公司收邮件的时候,问题再次出现,错误码:0x800ccc13,按照以下方法测试成功: 1. 按照以前办法,反复重启,失败 2. 按照以下参考连接A中的步骤 a. Click ...

随机推荐

  1. git 常用命令语句(个人笔记)

    切换账户 git config user.name xxxxx     查看用户名  ex: git config user.name tongjiaojiao   git config user.e ...

  2. b/s和c/s

    一.B/S结构 B是英文单词“Browser”的首字母,即浏览器的意思:S是英文单词“Server”的首字母,即服务器的意思.B/S就是“Browser/Server”的缩写,即“浏览器/服务器”模式 ...

  3. C#中实现Hash应用

    在C#中,数据的Hash以MD5或SHA1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比MD5强度高. 1.1 SHA- ...

  4. Spring IOC的简单实现

    简单的说,Spring就是通过工厂+反射将我们的bean放到它的容器中的,当我们想用某个bean的时候,只需要调用getBean("beanID")方法即可. 原理简单说明: Sp ...

  5. 百度的echarts报表数据直接显示

    最近在使用百度的echarts开发,在使用过程中,遇到点需求,就是希望显示的数据直接在图标上显示,而不是鼠标滑动以后才显示,于是百度搜了下相关的文章正好找到了,然后使用了这个方法是可以用的,所以这里记 ...

  6. jQuery ajax 提交表单图片

    基于 jQuery HTML: <form id="form" enctype="multipart/form-data"> <input t ...

  7. MobileNet系列

    最近一段时间,重新研读了谷歌的mobilenet系列,对该系列有新的认识. 1.MobileNet V1 这篇论文是谷歌在2017年提出了,专注于移动端或者嵌入式设备中的轻量级CNN网络.该论文最大的 ...

  8. centos7 yum快速安装LNMP

    1.安装nginx yum install nginx ##开启nginx service nginx start 2.安装MYSQL yum localinstall http://dev.mysq ...

  9. trigger添加及表达式

    创建触发器 点击Configuration(配置) → Hosts(主机) 点击hosts(主机)相关行的trigger 点击右上角的创建触发器(create trigger) name : 触发器名 ...

  10. 怎么去掉zencart模板网址后面的zenid=数字这个东西

    搜索引擎优化后第一次进入商店网址URL后面会出现zenid=XXXX 如:http://afish.cnblogs.com/zencart-zenid.html?zenid=tbisz675099db ...