如何让应用服务器和邮件服务器联动,自动化创建新用户并实时读取该用户的新邮件内容

61 阅读3分钟

1. 背景介绍

最近我们产品上有个这样的需求,就是我们的新用户lucas在注册Saas服务后,我们的Saas服务可以为该用户分配一个独立的邮箱地址,这个邮箱地址的命名是根据该用户的昵称得来(比如lucas_001@xcc.com)。

那么该用户就可以拿着该邮箱地址给到他的客户,他的客户就可以给这个邮箱地址发送带附件的邮件,我们的邮件服务器就可以接收到这封邮件,并由我们的Saas服务程序读取该邮件并做相应的后续处理服务。

下图就是我们想要的业务流程

image.png

图:邮件整体业务流程方案

安装环境:

  • 一台阿里云云服务器ECS 2C4G
  • 操作系统 CentOS 7.9 64位

2. 实现思路

这里面我们可以将整体方案做个分解,大致我可以分解成以下几个步骤:

  • 邮件服务器部署

    因为要给用户分配特定的邮箱地址,并且能够接受发送过来的邮件

    邮件服务器部署的方法可以看我之前的文章

  • 自动分配邮箱新用户

    Saas应用服务器需要和邮件服务器之间能够联动,可以让邮件服务器按照应用服务器的诉求来创建新邮箱用户。

    邮件服务器在创建完新邮箱用户后还可以通知到Saas应用服务器能够让其感知到新邮箱已经分配完成

  • 自动读取新用户的新邮件

    Saas应用服务器需要能够定期读取到邮箱服务器的新邮件,并能够读取对应的正文,附件等内容,便于后期的邮件处理。

下面我们重点描述下后两个步骤。

应用服务器和邮件服务器如何联动,自动分配邮箱新用户

image.png

图:应用服务器和邮件服务器联动自动分配邮箱新用户

当用户注册Saas服务后,我们就通过用户昵称给其生成对应的邮箱地址,不过状态为INIT状态,只有状态扭转为NORMAL状态才表示该邮箱地址可用。然后通过中间的文件存储,以及应用服务器和邮箱服务器不断轮训的方式做到信息的及时获取并联动。

详细的四个步骤如下:

  • 应用服务器的定时任务每1分钟触发1次,捞取数据库中状态为INIT状态的邮箱,并写入到文件createNewEmailUser.txt中,并上传至对应的文件存储上(阿里云OSS / AWS S3)

其中createNewEmailUser.txt内容类似于:

lucas_001
lucas_002
lucas_003
  • 然后应用服务器将所有写入文件的邮箱用户名称都注册一次重试任务,用于不断校验邮箱是否可用。

  • 同时Linux服务器上使用Cron定时触发(1分钟触发1次),执行Shell脚本createNewEmailUser.sh。 脚本的功能即通过URL固定拉取文件存储上的createNewEmailUser.txt文件到本地,并读取创建邮箱用户。

    createNewEmailUser.sh脚本内容如下:

#!/bin/sh
source /etc/profile

#createNewEmailUser.txt为需要创建的用户的文件
FILE_URL="https://amazonaws.com/assets/file/common/createNewEmailUser.txt"
curl -O "$FILE_URL"

for user in `cat /root/createNewEmailUser.txt`
do
id $user &> /dev/null  #查看用户是否存在
if [ $? -eq 0 ]
then
echo "The $user already exist"
else
useradd $user    #创建用户
if [ $? -eq 0 ]
then
echo "$user create sucessful"
echo 000000 |passwd --stdin $user &>/dev/null   #修改用户密码为000000
fi
fi
done

如何让脚本定时执行呢?这时候cron就上场了。

$ crontab -e
# 执行策略,即每间隔1分钟执行脚本
# 其中/root/cron.log为打印日志文件,可以查看运行有没有问题
* * * * * bash /root/createNewEmailUser.sh >> /root/cron.log 2>&1

这里有个点,就是手动可以运行脚本成功,cron不一定成功,需要通过/root/cron.log日志观察cron调用脚本有没有报错。

然后通过以下命令确认是否每个1分钟触发一次

$ tail -5 /var/log/cron

image.png

如上图所示即可以看出已经每隔1分钟执行一次

应用程序如何准实时的探测用户有新邮件,并读取对应的邮件内容

这块就比较简单了,应用程序不断轮训探测。或者通过邮件服务器接收到邮件并发出通知的方式。此处就一笔带过,不再赘述。