zoukankan      html  css  js  c++  java
  • Java实现QQ邮件发送客户端

    目录

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

    二、封装SMTP操作

    三、实现多线程接收

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

        1、连接按钮

        2、发送按钮 

    五、QQ邮件发送效果演示

    六、总结


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

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

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

    二、封装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("
    ");
    //                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+"
    ");
            });
        }
        Platform.runLater(()->{
            taDisplay.appendText("对话已关闭!
    ");
        });
    });
     
    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+"
    ");
                    //用于接收服务器信息的单独线程
                    readThread = new Thread(()->{
                        String receiveMsg=null;//从服务器接收一串字符
                        while ((receiveMsg=tcpMailClient.receive())!=null){
                            //lambda表达式不能直接访问外部非final类型局部变量,需要定义一个临时变量
                            //若将receiveMsg定义为类成员变量,则无需临时变量
                            String msgTemp = receiveMsg;
                            Platform.runLater(()->{
                                taDisplay.appendText(msgTemp+"
    ");
                            });
                        }
                        Platform.runLater(()->{
                            taDisplay.appendText("对话已关闭!
    ");
                        });
                    });
     
                    readThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
     
    });
    View Code

    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("
    ");
    //      tcpMailClient.send("这是一封测试java客户端自动发送功能的邮件。");
            tcpMailClient.send(content);
     
            tcpMailClient.send(".");
     
            tcpMailClient.send("quit");
     
     
        }catch (Exception e){
            taDisplay.appendText("服务器连接失败!"+e.getMessage()+"
    ");
        }
    });
    View Code

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

    五、QQ邮件发送效果演示

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

     发送到自己QQ邮箱:

     

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

    六、总结

    这一篇为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
    ---------------------------------------------------------书上有路,学海无涯。 生活总是很忙碌,也许这才是生活真正的奥秘。--------------------------------------------------------- 作者:Charzueus 来源:博客园 本博文版权归作者所有! 禁止商业转载等用途或联系作者授权,非商业转载请注明出处! 版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。
  • 相关阅读:
    FastMM、FastCode、FastMove的使用(图文并茂)
    12种JavaScript MVC框架之比较
    十款最佳Node.js MVC框架
    Couchbase 服务器
    C#程序员阅读的书籍
    ORM的实现
    Linux内核策略介绍
    ASP.NET MVC + EF 利用存储过程读取大数据
    面向.Net程序员的dump分析
    动态加载与插件化
  • 原文地址:https://www.cnblogs.com/chenzhenhong/p/14331829.html
Copyright © 2011-2022 走看看