如何使用ActiveMQ中间件方式发送邮件

前言

在大型互联网公司中,一般都会搭建内部的消息服务平台,处理公司内部的各种消息服务,比如:发送邮件、发送短信、微信推送等,公司内部消息平台再去调用第三发消息平台。消息服务平台的接口有两种:同步和异步,同步需求一般是需要返回调用第三方平台是否成功,否则都采用异步的。

公司内部消息服务平台

调用内部消息服务平台,使用消息中间件

发送消息一般都会做消息模板,调用的时候传模板id

整合Eamil实现异步发送邮件信息

采用163邮件接口,先注册163邮箱,并开通pop3协议,此时会有一个授权码,发送内容不能带有广告,否则会被163拦截,导致发送失败。

场景:会员服务调用内部消息服务平台发送邮件

会员服务(生产者)

Maven依赖

        <!-- SpringBoot整合web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- ActiveMQ依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <!-- FastJson工具包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>LATEST</version>
        </dependency>

YML配置文件

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616    # ActiveMQ消息中间件服务器通讯地址
    user: admin  # 用户名
    password: admin  #密码
queue: springboot-queue   #自定义队列名,等下程序中会用到
server:
  port: 8080

配置类

@Configuration
public class QueueConfig {
    //获取队列名
    @Value("${queue}")
    private String queue;
    //注册bean
    @Bean
    public Queue logQueue() {
        return new ActiveMQQueue(queue);
    }
}

创建Producer

@Component
@EnableScheduling
public class Producer {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queue;
    //每隔5秒向消息队列发送消息
    @Scheduled(fixedDelay = 5000)
    public void send(){
        //用户名,封装邮件内容时使用
        String userName = "张三"+ new Random().nextInt(20);
        //指定发送到哪个邮箱 (邮件接收者邮箱)
        String email = "593****77@qq.com";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("userName",userName);
        jsonObject.put("email",email);
        //将发送的消息转换为Json字符串
        String msg = jsonObject.toJSONString();
        System.out.println("生产者向消费者发送内容:" +  msg);
        jmsMessagingTemplate.convertAndSend(queue,msg);
    }
}

启动类

@EnableScheduling
@SpringBootApplication
public class ActivemqQueueApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivemqQueueApplication.class, args);
    }
}

消息服务平台(消费者)

Maven依赖

        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

       <!-- activemq依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <!-- SpringBoot 整合Emai -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!-- 工具包 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>LATEST</version>
        </dependency>

YML配置文件

spring:
  activemq:
    # ActiveMQ消息中间件服务器通讯地址
    broker-url: tcp://127.0.0.1:61616
    user: admin  # 用户名
    password: admin  #密码
  # 发送邮件配置
  mail:
    # 邮件服务器地址
    host: smtp.163.com
    # 邮箱用户名(邮件发送者)
    username: *********@163.com
    # 授权码,163邮箱开通协议时设置的那个授权码,不是登录密码
    password: wx1**********3
    enable:  true
    smtp:
      auth: true
    starttls:
      enable: true
      required: true
#自定义队列名属性,等下程序中会用到(以生产者的队列名一致)
queue: springboot-queue
server:
  port: 8081

创建Consumer

@Component
public class Consumer{
    @Autowired
    private JavaMailSender javaMailSender;
    @Value("${spring.mail.username}") //发送方邮箱
    private String toEmail;
    @JmsListener(destination = "${queue}")     //监听的队列,配置文件中的queue属性
    public void receive(String msg){
        if(StringUtils.isEmpty(msg)){
            return;
        }
        System.out.println("收到生产者消息:"+msg);
        JSONObject jsonObject = JSONObject.parseObject(msg);
        String userName = jsonObject.getString("userName");
        String eamil = jsonObject.getString("eamil");
        //发送邮件
        sendEmail(userName,toEmail);
    }
    /**
     * 发送简单邮件
     * @param userName  用户名,用户封装邮件内容
     * @param toEmail 通过哪个邮箱发送
     * @return
     */
    public String sendEmail(String userName,String toEmail){
        //发送消息对象
        SimpleMailMessage message = new SimpleMailMessage();
        //发送者
        message.setFrom(toEmail);
        //接收者
        message.setTo(toEmail);
        //主题(标题)
        message.setSubject("尊敬的"+userName);
        //内容
        message.setText("欢迎使用您使用本公司的产品!");  //发送html,发送html格式源码
        javaMailSender.send(message);
        System.out.println("邮件发送完成:"+ JSONObject.toJSONString(message));
        return  "send success!";
    }
}

启动类

@SpringBootApplication
public class ActivemqQueueConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivemqQueueConsumerApplication.class, args);
    }
}

测试

  • 启动会员服务和消息服务平台服务
  • 注意:启动前保证消息队列里面没有消息,有的话则先删除该队列,否则容易造成数据类型不一致导致Json解析异常出错。

会员服务:

消息服务平台:

此时消息服务平台发送邮件成功!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中间消息件ActiveMQ使用实例

    先来说一说我们为什么要用这个东西啊! 比如,我们现在有这样了个问题要解决: 这样,我们就要用到中间消息间了 然后我们就说一下什么是中间消息间吧. 采用消息传送机制/消息队列 的中间件技术,进行数据交流,用在分布式系统的集成. Java中对Jms有了定义,这是Java消息的统一接口.什么是ActiveMq呢?这是这个接口的一种实现,相当于数据库连接驱动一样,不同厂商有自己不同的实现,我们尽快看怎么用代码实现吧. 消息一共有两种接收和发送形式:点对点和发布定阅模式,也就是"一对一"和&qu

  • RocketMQ4.5.2 修改mqnamesrv 和 mqbroker的日志路径操作

    此解决方案是针对window的,因为日志默认保存路径在C盘,linux忽略. 学习RocketMQ过程中,总是出现 com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 14 DESC: service not available now, maybe disk full, CL: 0.87 CQ: 0.87 INDEX: 0.87, maybe your broker machine memory too small. 这

  • Springboot整合activemq的方法步骤

    今天呢心血来潮,也有很多以前的学弟问到我关于消息队列的一些问题,有个刚入门,有的有问题都来问我,那么今天来说说如何快速入门mq. 一.首先说下什么是消息队列? 1.消息队列是在消息的传输过程中保存消息的容器. 二.为什么要用到消息队列? 主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达 MySQL ,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误.通过使用消息队列

  • 解决rocketmq-client日志保存路径的问题

    rocketmq-client日志保存路径 由于使用rocketmq-client会生成一个rocketmq_client.log日志文件,一般默认存于系统盘内,且持续增长速度较快,为便于清理且避免影响操作系统资源使用,建议手动设置其日志存储路径为当前程序运行目录下的logs文件夹. 参考操作方式: 系统启动时代码显式设置全局变量"rocketmq.client.logRoot", 示例: System.setProperty("rocketmq.client.logRoot

  • RocketMQ4.5.X 实现修改生产者消费者日志保存路径

    RocketMQ修改生产者消费者日志保存路径 rocket默认是将所有日志文件保存到user.home的对于win系统就是C盘了. 1.修改RocketMQ中CLientLogger.class的源码,把经过更改的源码重新打包后,去自己的maven仓库替换rocketmq-client.-4.5.X.jar. 2.对于生产者的启动类里需要配置JVM系统属性: 如果不设置logUserSlf4j为true的话,启动生产者的时候会报找不到日志配置文件的警告. 3.对于消费者,仅仅添加rq.lordi

  • rocketmq如何修改存储路径

    一.下载rocketmq对应版本源码 修改消息存储路径需要修改rocketmq源码,因为rocketmq取的默认路径是user.home路径,也就是用户的根目录,如下所示 直接修改用户的user.home比较麻烦,我们打算直接修改源码里写死的路径,然后重新打包 下载rocketmq源码可以去GitHub,路径为https://github.com/apache/rocketmq 如果要下4.7.1版本的源码包可以选择对应release包 例如使用的rocketmq版本为4.7.1,则下载路径为h

  • 如何使用ActiveMQ中间件方式发送邮件

    前言 在大型互联网公司中,一般都会搭建内部的消息服务平台,处理公司内部的各种消息服务,比如:发送邮件.发送短信.微信推送等,公司内部消息平台再去调用第三发消息平台.消息服务平台的接口有两种:同步和异步,同步需求一般是需要返回调用第三方平台是否成功,否则都采用异步的. 公司内部消息服务平台 调用内部消息服务平台,使用消息中间件 发送消息一般都会做消息模板,调用的时候传模板id 整合Eamil实现异步发送邮件信息 采用163邮件接口,先注册163邮箱,并开通pop3协议,此时会有一个授权码,发送内容

  • c#使用netmail方式发送邮件示例

    复制代码 代码如下: /// <summary>    /// NetMail方式测试通过    /// </summary>    private void TestSend()    {        System.Net.Mail.MailMessage mm = new System.Net.Mail.MailMessage();        //收件人地址        mm.To.Add(new System.Net.Mail.MailAddress("xx

  • ASP.NET Core模仿中间件方式实现列表过滤功能

    我们的很多功能当中都会遇到对版本进行过滤的场合,例如你可能需要对列表中的数据的时间进行过滤.版本过滤.渠道以及地区信息进行过滤. 原本的做法:设计很多个过滤方法,通过枚举的方式组合,选择需要过滤哪些方法,然后一个方法一个方法的调用. 这样的做法本身没什么问题.但是感觉很面向过程,不够面向对象. 通过学习.Net Core的源码,我们可以了解到它采用了一种委托链表的方式,将所有的中间件都串了起来.所以我想要仿造它这个去实现一下这个功能. 这样做的好处:抽象出一些过滤的方法,对于不同的系统,只要通过

  • PHP实现自动发送邮件功能代码(qq 邮箱)

    最近做一个邮箱验证的功能,研究了一会,搞定了邮件的自动发送.下面用qq邮箱作为演示,一步一步来解释: 代码下载地址 首先,就是做到邮件的发送,代码如下: <?PHP //邮件发送 require './mailer/class.phpmailer.php'; require './mailer/class.smtp.php'; date_default_timezone_set('PRC');//设置邮件发送的时间,如果不设置,则会显示其他区的时间 $mail = new PHPMailer()

  • ecshop实现smtp发送邮件

    使用ECShop的smtp方式发送邮件时,在cls_smtp类文件中,执行到get_data方法中的语句: 复制代码 代码如下: $line    = fgets($this->connection, 512); ;时,发生超时错误. 注释掉该函数的执行,直接发送邮件,则返回错误ehlo command failed. 但打印出链接数据时,确实连上了. 之前用别的程序发送邮件也是可以正常发送的,于是重新发送函数,改用phpmailer发送邮件. 复制代码 代码如下: function smtp_

  • c#异步发送邮件的类

    首先要定义一个邮件信息的基类,如下所示: 复制代码 代码如下: /// <summary>/// Base message class used for emails/// </summary>public class Message{#region Constructor/// <summary>/// Constructor/// </summary>public Message(){}#endregion #region Properties/// &

  • Linux服务器下PHPMailer发送邮件失败的问题解决

    需求 更换服务器之后,我发现我的发送邮件功能失效了!原来的服务器是可以的,一定是哪里出问题了,决定来排查一下.我是用的PHPMailer,SMTP方式发送邮件的. 排查过程 这种方式首先PHP要开启sockets拓展,查了一下phpinfo页面,是开启的: 看了一下openssl也是开启(因为拿了qq邮箱来测),所以没问题: 那就再看一下allow_url_fopen,开启的,没问题: 是不是禁用了函数?没有禁用,没问题: 那配置上就没有问题了,我就想,是不是端口被占用了? 运行一下:netst

  • phpmail类发送邮件函数代码

    有了phpmail这个类,你就不用愁了.这是个外国人写的一个类,我们就只管"拿来主义"了.下面是基于这个类里面的send()方法写的一个函数: 复制代码 代码如下: function send_mail ($title,$content,$from,$to,$charset='gbk',$attachment ='') { include '/class/PHPMail.class.php'; header('Content-Type: text/html; charset='.$ch

  • c#利用webmail邮件系统发送邮件示例分享

    在C#中发送邮件的方式有2种,一种是使用webmail方式进行发送,另外一种就是采用netmail发送的方式,在采用这2种方式发送邮件时,如果采用公用的邮件服务器(如126邮件服务器,Sina的邮件服务器)都是需要授权认证才能够发送,如果是采用Gmail的话,还会有每天发送邮件的数量等限制.这2种方式是经过我测试通过了的代码,只需要将邮件的用户名和密码修改成自己的即可,同时也可以修改邮件服务器,改成自己配置的邮件服务器. 复制代码 代码如下: /// <summary>    /// 发送Em

  • php使用phpmailer发送邮件实例解析

    本人新手,由于要做邮件发送验证码,所以找到和搜集到这些,本人亲测完全可以用 这是163邮箱的   因为不是企业邮箱填写的账号是163的账号,但是密码是授权码 授权码的获取方式为: 然后 然后在这个页面向下看可以看到 接下来就是执行代码了 //引入PHPMailer的核心文件 使用require_once包含避免出现PHPMailer类重复定义的警告 include("PHP/class.smtp.php"); include("PHP/class.phpmailer.php&

随机推荐