Java实现QQ邮件发送客户端程序设计

目录

一、前言:QQ邮件发送程序

二、封装SMTP操作

三、实现多线程接收

四、QQ邮件客户端界面设计

1、连接按钮

2、发送按钮 

五、QQ邮件发送效果演示

六、总结


一、前言:QQ邮件发送程序

在上一篇《Java网络编程:实现QQ邮件发送客户端》,我们解决了telnet终端发送邮件误操作带来的麻烦,实现了自己的简单Java界面进行发送QQ邮件,界面可直接与smtp.qq.com服务器端建立连接,通过命令方式发送邮件信息。

这一篇为QQ邮件发送客户端程序设计的下篇,将实现更加完善的功能,不用命令发送方式,类似日常发送邮件,直接编写邮件标题、内容,然后直接发送即可,基本实现了QQ邮件发送客户端的功能,操作更加简便,实现自己的QQ邮件发送端,以后就用这个啦。

Java实现socket通信网络编程系列文章:

  1. 基于UDP协议网络Socket编程(java实现C/S通信案例)https://blog.csdn.net/Charzous/article/details/109016215
  2. 基于TCP协议网络socket编程(java实现C/S通信)https://blog.csdn.net/Charzous/article/details/109016215
  3. Java多线程实现TCP网络Socket编程(C/S通信)https://blog.csdn.net/Charzous/article/details/109283697
  4. Java多线程实现多用户与服务端Socket通信https://blog.csdn.net/Charzous/article/details/109440277
  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)https://blog.csdn.net/Charzous/article/details/109540279
  6. Java网络编程:实现QQ邮件发送客户端https://blog.csdn.net/Charzous/article/details/110913974

二、封装SMTP操作

原来的终端发送逐步操作如下:

HELO hostname   //回车,hostname可以是IP或其他随意别名
AUTH LOGIN //回车后,先粘贴base64程序编码的完整邮箱名并回车;再粘贴base64编码的授权码并回车


MAIL FROM:<czh_charzeus@qq.com>   //在这里填写自己的邮箱地址,用于发送邮件(注意冒号后面别有空格)
RCPT TO:<czh_charzeus@qq.com>  //接收方的邮箱,在这里暂时填写和上面一样的邮箱地址,即自己发送邮件给自己,验证是否成功
DATA       //回车,接下来开始发送邮件头相关内容
Subject: the simple mail     // 邮件的标题,回车  
//在这里再多发送一行空行,来分隔邮件内容,下面就是邮件正文内容
Hello,the mail content!
测试发送邮件!   //控制台中中文会变成?的乱码,但不影响接受者接收到中文内容
.   //在邮件正文发送完毕后,单独用一行输入一个小圆点,作为结束标志,然后回车
QUIT   //结束通信(含4次握手断开)

因此,我们要避免这种繁琐的命令形式,只需要将每个语句封装到发送程序里面,在用户界面则无需进行命令的输入,只需要输入内容。

实现的方法很简单,只需要在发送按钮中,把命令加进去就可以,如下:

tcpMailClient.send("HELO friend");
tcpMailClient.send("auth login");

String userNameBase64= encode(senderMail);
tcpMailClient.send(userNameBase64);
String authCode = encode("你的授权码");
tcpMailClient.send(authCode);
String msg = "mail from:<"+senderMail+">";
tcpMailClient.send(msg);

msg = "rcpt to:<"+receiverMail+">";
tcpMailClient.send(msg);

tcpMailClient.send("data");

msg="from:"+senderMail;
tcpMailClient.send(msg);

msg="to:"+receiverMail;
tcpMailClient.send(msg);

msg="subject:"+sub;
tcpMailClient.send(msg);

tcpMailClient.send("\n");
//                tcpMailClient.send("这是一封测试java客户端自动发送功能的邮件。");
tcpMailClient.send(content);

tcpMailClient.send(".");

tcpMailClient.send("quit");

 从代码可以看到,当发送按钮一点击后,程序会执行所有语句,我们从上一篇知道,邮件服务器也会返回信息,所以QQ客户端需要使用多线程的技术,来处理返回信息,避免单线程阻塞导致发送不成功。

三、实现多线程接收

根据前面分析,将客户端接收的功能交给一个线程处理,就能够达到目的,不会因为接收语句阻塞使得主进程卡住。

所以,将线程放到连接按钮里面为好,在成功连接服务器之后,程序就启动线程,时机正好。连接按钮中的线程代码如下:

//用于接收服务器信息的单独线程
readThread = new Thread(()->{
    String receiveMsg=null;//从服务器接收一串字符
    while ((receiveMsg=tcpMailClient.receive())!=null){
        String msgTemp = receiveMsg;
        Platform.runLater(()->{
            taDisplay.appendText(msgTemp+"\n");
        });
    }
    Platform.runLater(()->{
        taDisplay.appendText("对话已关闭!\n");
    });
});

readThread.start();

程序执行发送每一条命令语句的速度比我们自己输入发送要快许多,为了避免QQ邮件接收服务器无法及时响应出错,程序自动发送过程中需要设置一定的睡眠等待时间,在send方法设置等待200ms或者500ms。

QQ邮件客户端实现代码可见上一篇Java网络编程:实现QQ邮件发送客户端,这里不再重复介绍。

public void send(String msg){
    //输出字符流,由socket调用系统底层函数,经网卡发送字节流
    pw.println(msg);
    try {
        //进行邮件交互,发送smtp指令之间应该暂停一段时间
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

四、QQ邮件客户端界面设计

界面的设计与以往类似,可以根据自己的需求设计不同的界面风格,可参考本文前言或者总结部分的系列文章进行实现。这里给出关键按钮的完整代码。

1、连接按钮

//连接按钮
btConn.setOnAction(event -> {
    String ip=ipAddress.getText().trim();
    String port=tfport.getText().trim();
    try {

        tcpMailClient = new TCPMailClient(ip, port);


        //成功连接服务器,接受服务器发来的第一条欢迎信息
        String firstMsg=tcpMailClient.receive();
        taDisplay.appendText(firstMsg+"\n");
                //用于接收服务器信息的单独线程
                readThread = new Thread(()->{
                    String receiveMsg=null;//从服务器接收一串字符
                    while ((receiveMsg=tcpMailClient.receive())!=null){
                        //lambda表达式不能直接访问外部非final类型局部变量,需要定义一个临时变量
                        //若将receiveMsg定义为类成员变量,则无需临时变量
                        String msgTemp = receiveMsg;
                        Platform.runLater(()->{
                            taDisplay.appendText(msgTemp+"\n");
                        });
                    }
                    Platform.runLater(()->{
                        taDisplay.appendText("对话已关闭!\n");
                    });
                });

                readThread.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

});

2、发送按钮 

//发送按钮
btnSend.setOnAction(event -> {
    String senderMail = mail.getText().trim();
    String receiverMail = toMail.getText().trim();
    String sub = subject.getText();
    String content = tfSend.getText();
    try {

        tcpMailClient.send("HELO friend");
        tcpMailClient.send("auth login");

        String userNameBase64= encode(senderMail);
        tcpMailClient.send(userNameBase64);
        String authCode = encode("你的授权码");
        tcpMailClient.send(authCode);
        String msg = "mail from:<"+senderMail+">";
        tcpMailClient.send(msg);

        msg = "rcpt to:<"+receiverMail+">";
        tcpMailClient.send(msg);

        tcpMailClient.send("data");

        msg="from:"+senderMail;
        tcpMailClient.send(msg);

        msg="to:"+receiverMail;
        tcpMailClient.send(msg);

        msg="subject:"+sub;
        tcpMailClient.send(msg);

        tcpMailClient.send("\n");
//      tcpMailClient.send("这是一封测试java客户端自动发送功能的邮件。");
        tcpMailClient.send(content);

        tcpMailClient.send(".");

        tcpMailClient.send("quit");


    }catch (Exception e){
        taDisplay.appendText("服务器连接失败!"+e.getMessage()+"\n");
    }
});

QQ客户端的程序可以沿用之前的内容,详见这篇:基于TCP协议网络socket编程(java实现C/S通信)

五、QQ邮件发送效果演示

 细心的读者可以发现,在我点击发送之后,程序卡断了一会,其实就是因为我设置发送睡眠1000ms,实际可以发送成功,建议设置200ms或以上!

 发送到自己QQ邮箱:

 

发送到自己的126邮箱进行测试:

六、总结

这一篇为QQ邮件发送客户端程序设计的下篇,记录了实现的关键部分,不用命令发送方式,类似日常发送邮件,直接编写邮件标题、内容,然后直接发送即可,基本实现了QQ邮件发送客户端的功能,操作更加简便。根据本篇的知识内容,后面可以实现更加完善的QQ邮件发送小程序,增加一系列小功能!

如果觉得不错欢迎“一键三连”哦,点赞收藏关注,有问题直接评论,交流学习!

Java实现socket通信网络编程系列文章:

  1. 基于UDP协议网络Socket编程(java实现C/S通信案例)https://blog.csdn.net/Charzous/article/details/109016215
  2. 基于TCP协议网络socket编程(java实现C/S通信)https://blog.csdn.net/Charzous/article/details/109016215
  3. Java多线程实现TCP网络Socket编程(C/S通信)https://blog.csdn.net/Charzous/article/details/109283697
  4. Java多线程实现多用户与服务端Socket通信https://blog.csdn.net/Charzous/article/details/109440277
  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)https://blog.csdn.net/Charzous/article/details/109540279
  6. Java网络编程:实现QQ邮件发送客户端https://blog.csdn.net/Charzous/article/details/110913974

我的CSDN博客:https://blog.csdn.net/Charzous/article/details/111148425

<p> <span style="color:#424242;font-size:14px;background-color:#FFFFFF;">熟悉项目开发过程中SSM框架、JSP、Mysql使用,知道各技术之间的如何衔接;</span> </p> <p> <span style="color:#424242;font-size:14px;background-color:#FFFFFF;"> </span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <strong><strong><strong>考虑到部分学生只需要学习前台(买家)或是后台(后台),故将电商系统分为电商系统前台和电商系统后台两个项目,</strong></strong></strong> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <strong><strong><strong>当前课程包含电商系统前台和电商系统后台</strong></strong></strong> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span><strong></strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span><strong>该课程主要涉及到的技术有:</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <strong> 项目涉及的技术:</strong> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;">  1、前端:jsp、css、javascript、jQuery(js框架)、bootstrap框架 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;">  2、后台:Spring MVC、Spring、Mybatis框架、javaMail进行邮件发送、jstl 、jstl自定义分页标签、代码生成器等 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;">  3、数据库:Mysql </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;">  4、服务器:Tomcat </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <strong>项目开发涉及的功能:</strong> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span>1、项目以及数据库搭建</span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 2、用户登录、退出 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 3、用户注册、邮件发送、以及用户信息激活 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 4、首页商品信息页面搭建以及查询功能实现 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 5、查询商品明细 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 6、加入商品至购物车、删除、更新、清除购物车商品信息 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 7、确认订单信息 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 8、订单页面搭建以及下订单功能实现 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 9、查询我的购物车以及订单信息 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 10、商品明细查看,商品修改,商品下架 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 11、商品类型管理 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 12、订单管理 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> 13、代码机器人使用等等 </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p> <br /> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong>其他实战项目:<br /> java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)<br /> https://edu.csdn.net/course/detail/25771</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> java项目之oa办公管理系统(java毕业设计)<br /> https://edu.csdn.net/course/detail/23008</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> java项目之hrm人事管理项目(java毕业设计)<br /> https://edu.csdn.net/course/detail/23007</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> JavaWeb项目实战之点餐系统前台<br /> https://edu.csdn.net/course/detail/20543</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> JavaWeb项目实战之点餐系统后台<br /> https://edu.csdn.net/course/detail/19572</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> JavaWeb项目实战之宿舍管理系统(Java毕业设计含源码)<br /> https://edu.csdn.net/course/detail/26721</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> JavaWeb项目实战之点餐系统全套(前台和后台)<br /> https://edu.csdn.net/course/detail/20610</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> java项目实战之电子商城后台(java毕业设计SSM框架项目)<br /> https://edu.csdn.net/course/detail/25770</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> java美妆商城项目|在线购书系统(java毕业设计项目ssm版)<br /> https://edu.csdn.net/course/detail/23989</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> 系统学习课程:<br /> JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10<br /> https://edu.csdn.net/course/detail/26941</strong></span> </p> <p style="color:#424242;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:18px;"><strong><br /> Java Web从入门到电商项目实战挑战万元高薪(javaweb教程)<br /> https://edu.csdn.net/course/detail/25976<br /> 其他素材版(毕业设计或课程设计)项目:点击老师头像进行相关课程学习</strong></span> </p> <br />
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页