QQメール送信クライアントプログラム設計のJava実現

目次

1.まえがき:QQメール送信プログラム

2、SMTP操作をカプセル化する

3、マルチスレッド受信を実現する

4.QQメールクライアントインターフェイスの設計

1.接続ボタン

2.送信ボタン 

5、QQメール送信効果のデモンストレーション

6、まとめ


1.まえがき:QQメール送信プログラム

前回の記事「Javaネットワークプログラミング:QQメール送信クライアントの実装」では、telnet端末の誤操作によるメール送信のトラブルを解決し、独自のシンプルなJavaインターフェースを実装してQQメールを送信しました。インターフェースは直接接続できます。 to smtp.qq .comサーバーは接続を確立し、コマンドを介して電子メールメッセージを送信します。

この記事の第2部は、QQメール送信クライアントプログラム向けに設計されています。より完全な機能を実現します。コマンドを送信する必要はありません。日常生活でメールを送信するのと似ています。タイトルと内容を直接書き込むことができます。メールを送信して直接送信する、基本的にはQQメールを実現するクライアントを送信する機能、操作がより便利で、自分のQQメール送信終了を実現し、将来これを利用します。

一連の記事のソケット通信ネットワークプログラミングのJava実装:

  1. UDPプロトコルに基づくネットワークソケットプログラミング(C / S通信ケースのJava実装) [ https://blog.csdn.net/Charzous/article/details/109016215 ]
  2. TCPプロトコルに基づくネットワークソケットプログラミング(JavaはC / S通信を実現します [ https://blog.csdn.net/Charzous/article/details/109016215 ]
  3. TCPネットワークを実現するJavaマルチスレッドソケットプログラミング(C / S通信) [ https://blog.csdn.net/Charzous/article/details/109283697 ]
  4. Javaマルチスレッドは、マルチユーザーおよびサーバー側のソケット通信を実現します[ https://blog.csdn.net/Charzous/article/details/109440277 ]
  5. 高度なJava:TCPベースのネットワークリアルタイムチャットルーム(ソケット通信の場合) [ https://blog.csdn.net/Charzous/article/details/109540279 ]
  6. Javaネットワークプログラミング:QQメール送信クライアントを実現[ https://blog.csdn.net/Charzous/article/details/110913974 ]

2、SMTP操作をカプセル化する

ステップバイステップの操作を送信する元の端末は次のとおりです。

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


MAIL FROM:<[email protected]>   //在这里填写自己的邮箱地址,用于发送邮件(注意冒号后面别有空格)
RCPT TO:<[email protected]>  //接收方的邮箱,在这里暂时填写和上面一样的邮箱地址,即自己发送邮件给自己,验证是否成功
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メール受信サーバーが時間内にエラーに応答しないのを防ぐために、自動中に特定のスリープ待機時間を設定する必要があります。プログラムの送信200msまたは500ms待機するようにsendメソッドを設定します。

QQメールクライアントの実装コードは、以前のJavaネットワークプログラミングで見ることができます:QQメール送信クライアントの実装。これはここでは繰り返されません。

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

4.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プロトコルに基づくネットワークソケットプログラミング(JavaはC / S通信を実現します)

5、QQメール送信効果のデモンストレーション

 注意深く読んでいると、送信をクリックした後、プログラムがしばらくスタックしていることがわかります。実際には、送信スリープを1000ミリ秒に設定し、実際に送信に成功したためです。200ミリ秒以上を設定することをお勧めします。

 自分のQQメールボックスに送信:

 

テストのために自分の126メールボックスに送信します。

6、まとめ

この記事は、QQメール送信クライアントプログラム向けに設計された2番目の記事です。実装の重要な部分を記録します。送信するコマンドは必要ありません。毎日メールを送信するのと似ています。タイトルと内容を直接書き込むことができます。基本的にQQメールを実現します。クライアント送信機能の方が操作が簡単です。この記事の知識内容によると、一連の小さな関数を追加することで、より完全なQQメール送信アプレットを後で実現できます。

良いと思う場合は、ブックマーク、フォロー、質問がある場合は直接コメント、交換して学ぶなど、「ワンクリック、3リンク」へようこそ。

一連の記事のソケット通信ネットワークプログラミングのJava実装:

  1. UDPプロトコルに基づくネットワークソケットプログラミング(C / S通信ケースのJava実装) [ https://blog.csdn.net/Charzous/article/details/109016215 ]
  2. TCPプロトコルに基づくネットワークソケットプログラミング(JavaはC / S通信を実現します [ https://blog.csdn.net/Charzous/article/details/109016215 ]
  3. TCPネットワークを実現するJavaマルチスレッドソケットプログラミング(C / S通信) [ https://blog.csdn.net/Charzous/article/details/109283697 ]
  4. Javaマルチスレッドは、マルチユーザーおよびサーバー側のソケット通信を実現します[ https://blog.csdn.net/Charzous/article/details/109440277 ]
  5. 高度なJava:TCPベースのネットワークリアルタイムチャットルーム(ソケット通信の場合) [ 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

おすすめ

転載: blog.csdn.net/Charzous/article/details/111148425