Javaネットワークプログラミング:QQメール送信クライアントを実現

目次

1.目標の紹介

1. SMTP(メール転送プロトコル)を知っている

 2. POP3(メール受信プロトコル)

2.Base64でエンコードされたメールボックスと認証コード

1.QQメールボックスSMTP / POP3サービスを開きます

2.JavaでBASE64エンコーディングプログラムを作成します

3、メールを送信するtelnetコマンド

4、SMTPインタラクティブメーリング用のJavaグラフィカルインターフェイス

1.クライアントクラスを作成します

2.QQメールを送信するためのグラフィカルインターフェイスを作成します 

V.まとめと次のプレビュー


1.目標の紹介

このブログ投稿では、Javaを使用してQQと同様のクライアントを実装してメールを送信する方法を学習しています。2つの部分に分かれる予定です。最初の部分は、コンピュータネットワークのメール転送プロトコル(SMTP、POP3)を理解するためにゼロから学習することです。 pop3サービスは、後続のプログラム設計の準備をし、それ自体で単純なJava GUIを実装し、コマンドを介して電子メールを送信します。次の部分は前の基盤に基づいており、通常のQQメール送信クライアントと同様に、シンプルなグラフィカルインターフェイスで基本的かつ完全な機能を実現します。さらに、送信操作が追加され、サーバーフィードバック情報を受信する機能が追加されます。将来的にはメール送信を使用できるようになります。あなたが他の人にメールを送るために書いたプログラム、それはより速くそしてより便利です。๑乛◡乛๑

1. SMTP(メール転送プロトコル)を知っている

SMTP(Simple Mail Transfer Protocol、RFC821)は、信頼性が高く効果的な電子メール転送プロトコルですSMTPは、FTPファイル転送サービスに基づく電子メールサービスです。主に、システム間で電子メール情報を転送し、着信レターに関する通知を提供するため使用されます。

 2. POP3(メール受信プロトコル)

POP3、フルネームはPost Office Protocol-バージョン3、つまりPost OfficeProtocolバージョン3です。これは、RFC1939で定義されているTCP / IPプロトコルスイートのメンバーです。このプロトコルは主に、サーバー上の電子メールをリモートで管理するためのクライアントの使用をサポートするために使用されます。

2.Base64でエンコードされたメールボックスと認証コード

サービスメールを送信するサーバーのポートは25、サービスメールを受信するサーバーのポートは110です。

メールの設定でSMTP / pop3サービスが有効になります。現在、ほとんどのメールでサービスを開く場合、サードパーティのクライアントが使用する認証コードを設定する必要があります。パスワードの代わりに認証コードを使用して、パスワードの漏洩を防ぎます。操作は次のとおりです。

1.QQメールボックスSMTP / POP3サービスを開きます

メールボックスにログインし、[設定] ---- [アカウント]をクリックします。

下にスクロールしてPOP3 / SMTPサービスを見つけ、[開く]をクリックし、確認が完了したらクリックして認証コードを生成します。コピーして保存し、後で使用することを忘れないでください

2.JavaでBASE64エンコーディングプログラムを作成します

電子メールを正常に送受信するには、ユーザー名とパスワード(電子メールアドレスと認証コード)をBASE64でエンコードしてから、効果的に送信する必要があります。

/*
 * BASE64.java
 * Copyright (c) 2020-12-09
 * author : Charzous
 * All right reserved.
 */

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.IOException;

public class BASE64 {
    public static void main(String[] args) throws IOException {
        String userName="你的邮箱";
        String authCode="生成的授权码";
        //显示邮箱名的base64编码结果
        System.out.println(encode(userName));
        //显示授权码的base64编码结果
        System.out.println(encode(authCode));

    }

    public static String encode(String str){
        return new BASE64Encoder().encode(str.getBytes());
    }
}

最後に、同様の文字列が生成されます。

Y3poX2NoYXJ6ZXVzQHFxLmNvbQ==

3、メールを送信するtelnetコマンド

1.コマンドプロンプトを開き、次のように入力します

telnet smtp.qq.com 25

 2.たとえば、次のように順番に入力します。

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次握手断开)

 結果の送信に成功しました:

4、SMTPインタラクティブメーリング用のJavaグラフィカルインターフェイス

端末を使用して送信する場合、入力エラー、戻って変更できない、Enterキーを押すだけで入力できるなど、多くの不便があります。これらの誤操作によるトラブルを回避するために、単純なJavaインターフェイスを作成してください。telnetの代わりに独自のプログラムを使用して、SMTPがメールに送信するプロセスを確認します。

1.クライアントクラスを作成します

/*
 * TCPMailClient.java
 * Copyright (c) 2020-12-09
 * author : Charzous
 * All right reserved.
 */

import java.io.*;
import java.net.Socket;

public class TCPMailClient {
    private Socket socket;

    private PrintWriter pw;
    private BufferedReader br;

    /**
     * @param ip
     * @param port
     * @return
     * @author Charzous
     * @date 2020/12/9 11:19
     *
     */
    public TCPMailClient(String ip, String port) throws IOException{
        //主动向服务器发起连接,实现TCP三次握手
        //不成功则抛出错误,由调用者处理错误
        socket =new Socket(ip,Integer.parseInt(port));

        //得到网络流输出字节流地址,并封装成网络输出字符流
        OutputStream socketOut=socket.getOutputStream();
        //参数true表示自动flush数据
        pw=new PrintWriter(new OutputStreamWriter(socketOut,"utf-8"),true);

        //得到网络输入字节流地址,并封装成网络输入字符流
        InputStream socketIn=socket.getInputStream();
        br=new BufferedReader(new InputStreamReader(socketIn,"utf-8"));

    }

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

    public String receive(){
        String msg=null;
        try {
            //从网络输入字符流中读取信息,每次只能接受一行信息
            //不够一行时(无行结束符),该语句阻塞
            //直到条件满足,程序往下运行
            msg=br.readLine();
        }catch (IOException e){
            e.printStackTrace();
        }
        return msg;
    }

    public void close(){
        try {
            if (socket!=null)
                socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

2.QQメールを送信するためのグラフィカルインターフェイスを作成します 

 以前のTCP通信と同様に、QQメールの送信サーバーsmtp.qq.comに接続するだけでよいことがここで簡単にわかります。

インターフェイスの作成にはJavaFxを使用します。私の記事を参照して、自分で実装することができます。これは比較的簡単です。

参考記事:

1.「TCPプロトコルに基づくネットワークソケットプログラミング(JavaはC / S通信を実現)

2.「JavaAdvanced:TCPベースのネットワークリアルタイムチャットルーム(ソケット通信の場合)

V.まとめと次のプレビュー

この記事では、Javaネットワークプログラミングを使用するための技術的なアイデアを詳細に記録し、最初にQQメール送信クライアントを実現します。ゼロから学び、コンピュータネットワークのメール転送プロトコル(SMTP、POP3)を理解し、QQメールボックスのsmtp / pop3サービスを開き、後続のプログラム設計の準備をし、自分で簡単なJava GUIを実装し、コマンドを介してメールを送信します。

サーバー情報を送信するコマンドを介してのみリクエストを送信できるようになったため、それでも便利ではないことがわかりました。次の記事では、非コマンドモードを実装してメールを送信し、ユーザーエクスペリエンスを向上させ、面倒なコマンド入力を回避します。次の記事を待つ内容が更新されました!

良いと思う場合は、ブックマーク、フォロー、質問がある場合は直接コメント、交換して学ぶなど、「ワンクリック、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 ]

私のCSDNブログ:https://blog.csdn.net/Charzous/article/details/110913974

おすすめ

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