天天看点

Java代码实现邮件客户端_Java实现QQ邮件发送客户端

目录

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

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

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

二、封装SMTP操作

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

HELO hostname //回车,hostname可以是IP或其他随意别名

AUTH LOGIN //回车后,先粘贴base64程序编码的完整邮箱名并回车;再粘贴base64编码的授权码并回车

MAIL FROM: //在这里填写自己的邮箱地址,用于发送邮件(注意冒号后面别有空格)

RCPT TO: //接收方的邮箱,在这里暂时填写和上面一样的邮箱地址,即自己发送邮件给自己,验证是否成功

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:";

tcpMailClient.send(msg);

msg= "rcpt to:";

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 voidsend(String msg){//输出字符流,由socket调用系统底层函数,经网卡发送字节流

pw.println(msg);try{//进行邮件交互,发送smtp指令之间应该暂停一段时间

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

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

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

1、连接按钮

Java代码实现邮件客户端_Java实现QQ邮件发送客户端
Java代码实现邮件客户端_Java实现QQ邮件发送客户端

//连接按钮

btConn.setOnAction(event ->{

String ip=ipAddress.getText().trim();

String port=tfport.getText().trim();try{

tcpMailClient= newTCPMailClient(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

2、发送按钮

Java代码实现邮件客户端_Java实现QQ邮件发送客户端
Java代码实现邮件客户端_Java实现QQ邮件发送客户端

//发送按钮

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:";

tcpMailClient.send(msg);

msg= "rcpt to:";

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邮件发送效果演示

Java代码实现邮件客户端_Java实现QQ邮件发送客户端

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

Java代码实现邮件客户端_Java实现QQ邮件发送客户端

发送到自己QQ邮箱:

Java代码实现邮件客户端_Java实现QQ邮件发送客户端

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

Java代码实现邮件客户端_Java实现QQ邮件发送客户端

六、总结

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

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

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。