业务背景:

  公司自己做的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. luogu P2154 [SDOI2009]虔诚的墓主人

    luogu 下面记一个点上下左右点数分别为\(u_i,d_i,l_i,r_i\) 枚举每个中间点太慢了,考虑枚举两个点之间横的一条线段,这里面的点左边点数目都相同,右边点数目都相同,然后只要查一下区间 ...

  2. java在遍历列表的时候删除列表中某个元素

    在遍历list的时候需要删除其中的某些元素,不要用foreach遍历,需要用Iterator. List<String> list = new ArrayList<String> ...

  3. 垃圾回收gc --翻译

    原文在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management.基本保持了平译,并在一些地方做了概念解释.(转 ...

  4. xhost + command not found

    如下是一个示例: 原本我以为在没有联网的情况下.不能使用yum 的.可能是本地配置了yum 了吧也可以使用 1. [oracle@11GR2-test ~]$ export DISPLAY=192.1 ...

  5. poj3522 苗条树(极差最小生成树)

    给你N个点和M条边 要求你求出一个生成树使得这个生成树里边权极差最小 做法① n*m做法 当最小的边已知的时候这个生成树就确定 所以最大的边也确定了 于是我们每次枚举最小的边 然后用kruskal做一 ...

  6. ubuntu下usb抓包方法步骤--usbmon

    开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包. 在ubuntu下使用步骤如下: 1 运行命令  sudo  mount -t debugfs none  /sys/ke ...

  7. 文件操作相关函数(POSIX 标准 open,read,write,lseek,close)

    POSIX标准 open函数属于Linux中系统IO,用于“打开”文件,代码打开一个文件意味着获得了这个文件的访问句柄. int fd = open(参数1,参数2,参数3): int fd = op ...

  8. java调用js函数

    问题:js函数可能有多个,之间有相互调用关系,有jquery jar包 org.mozilla.javascript-1.7.2 js   envjs-1.2.js java代码 import jav ...

  9. ESXi与物理交换机静态链路聚合配置过程中的小陷阱

    作者:陆斌文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影响 ...

  10. 交互式数据可视化-D3.js(三)比例尺

    线性比例尺 线性比例尺是常用比例尺常用方法有: var linear = d3.scaleLinear() - 创建一个定量的线性比例尺. linear.domain([numbers]) - 定义或 ...