Java实现QQ邮件发送客户端

目录html

1、前言:QQ邮件发送程序java

2、封装SMTP操做编程

3、实现多线程接收小程序

4、QQ邮件客户端界面设计服务器

    一、链接按钮网络

    二、发送按钮 多线程

5、QQ邮件发送效果演示app

6、总结socket


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

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

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

2、封装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客户端须要使用多线程的技术,来处理返回信息,避免单线程阻塞致使发送不成功。

3、实现多线程接收

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

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

//用于接收服务器信息的单独线程
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(); } }

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

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

一、链接按钮

//链接按钮
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();
    }
 
});
View Code

二、发送按钮 

//发送按钮
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");
    }
});
View Code

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

5、QQ邮件发送效果演示

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

 发送到本身QQ邮箱:

 

发送到本身的126邮箱进行测试:

6、总结

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

若是以为不错欢迎“一键三连”哦,点赞收藏关注,有问题直接评论,交流学习!


个人博客园:https://www.cnblogs.com/chenzhenhong/p/14331829.html

个人CSDN博客:https://blog.csdn.net/Charzous/article/details/111148425

版权声明:本文为博主原创文章,遵循  CC 4.0 BY-SA 版权协议,转载请附上原文出处连接和本声明。
本文连接: https://blog.csdn.net/Charzous/article/details/111148425
相关文章
相关标签/搜索