Java实战之基于swing的QQ邮件收发功能实现

一、电子邮件详解

  • 假设自己的电子邮件是me@163.com,对方的邮件是you@163.com

我们编写好文件填写好对方文件,点击发送,这些电子邮件就发出去了

而这些电子邮件被称为MUA:Mail User Agent——邮件用户代理。

  • Email发送出去的时候,不是直接到达对方的电脑,而是先发送到MTA:Mail Transfer Agent——邮件传输代理。如:网易
  • Email到达MTA后,MTA会把Emain投递到邮件的最终目的MDA:Mail Delivery Agent——邮件投递代理。如何存放在某个服务器上,我们将这个长期保存的地方叫做电子邮件邮箱。

Email不会直接到达对方的电脑,因为电脑不一定开机,开机不一定对方要取邮件,必须通过MUA从MDA把邮件取到自己的电脑上面。

有了上述概念,编写程序来收发和接受文件,本质上就是:

1.编写MUA把邮件发送到MTA

2.编写MUA从MDA上收邮件

发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。

收邮件的时候,MUA和MDA使用的协议有两种:POP:Post Office Protocol,即POP3;IMAP:Internet Message Access Protocol

二、邮件发送

import com.sun.mail.util.MailSSLSocketFactory;

import javax.swing.*;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Properties;
/**
 * 邮件发送
 *
 * @author ltl
 */
public class SendEmailManger extends Thread {
    private String mailAdr;//邮箱
    private String content;//邮件的内容
    private String subject;//邮件的题目
    public SendEmailManger(String mailAdr, String subject, String content) {
        super();
        this.mailAdr = mailAdr;
        this.subject = subject;
        this.content = content;
    }
    @Override
    public void run() {
        super.run();
        try {
            sendMail(mailAdr, subject, content);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void sendMail(String mailAdr, String subject, String content) throws Exception {
        //加密的邮件套接字协议工厂
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        final Properties props = new Properties();
        // 表示SMTP发送邮件,需要进行身份验证
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.qq.com");
        // smtp登陆的账号、密码 ;需开启smtp登陆
        props.setProperty("mail.debug", "true");
        props.put("mail.user", "此处写你的qq邮箱");
        props.put("mail.password", "此处写你的QQ授权码");
        // 特别需要注意,要将ssl协议设置为true,否则会报530错误
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);
        Authenticator authenticator = new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                // 用户名、密码
                String userName = props.getProperty("mail.user");
                String password = props.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };
        // 使用环境属性和授权信息,创建邮件会话
        Session mailSession = Session.getInstance(props, authenticator);
        // 创建邮件消息
        MimeMessage message = new MimeMessage(mailSession);
        // 设置发件人
        try {
            InternetAddress form = new InternetAddress(props.getProperty("mail.user"));
            message.setFrom(form);
            // 设置收件人
            InternetAddress to = new InternetAddress(mailAdr);
            message.setRecipient(Message.RecipientType.TO, to);
            // 设置邮件标题
            message.setSubject(subject);
            // 设置邮件的内容体
            message.setContent(content, "text/html;charset=UTF-8");

            // 发送邮件
            Transport.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        // 1. 创建一个顶层容器(窗口)
        JFrame jf = new JFrame("发送邮件");
        jf.setSize(500, 500);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // 2. 创建中间容器(面板容器)
        JPanel panel = new JPanel(null);

        // 3. 创建一个基本组件(按钮),并添加到 面板容器 中

        JLabel jla1 = new JLabel("收件邮箱: ");
        jla1.setLocation(50,50);
        jla1.setSize(100, 50);
        jla1.setFont(new Font("123", 5, 20));

 final  JTextField textField = new JTextField(8);
        textField.setFont(new Font("mailAdr", Font.PLAIN, 20));
        textField.setLocation(150,50);
        textField.setSize(250, 50);

        JLabel jla2 = new JLabel("邮件标题: ");
        jla2.setLocation(50,150);
        jla2.setSize(100, 50);
        jla2.setFont(new Font("123", 5, 20));

final   JTextField textField1 = new JTextField(8);
        textField1.setFont(new Font("subject", Font.PLAIN, 20));
        textField1.setLocation(150,150);
        textField1.setSize(250, 50);

        JLabel jla3 = new JLabel("邮件内容: ");
        jla3.setLocation(50,250);
        jla3.setSize(100, 50);
        jla3.setFont(new Font("123", 5, 20));

final   JTextField textField3 = new JTextField(8);
        textField3.setFont(new Font("content", Font.PLAIN, 20));
        textField3.setLocation(150,250);
        textField3.setSize(250, 50);

        JButton btn = new JButton("发送邮件");
        btn.setLocation(50,350);
        btn.setSize(100, 50);
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                SendEmailManger d = new SendEmailManger(textField.getText(), textField1.getText(), textField3.getText());
                d.start();

            }
        });

        panel.add(jla1);
        panel.add(jla2);
        panel.add(jla3);
        panel.add(textField);
        panel.add(textField1);
        panel.add(textField3);
        panel.add(btn);

        // 4. 把 面板容器 作为窗口的内容面板 设置到 窗口
        jf.setContentPane(panel);

        // 5. 显示窗口,前面创建的信息都在内存中,通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上。
        jf.setVisible(true);
    }

}

三、邮件接收

import com.sun.mail.util.MailSSLSocketFactory;
import com.sun.org.apache.bcel.internal.generic.NEW;

import javax.mail.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

public class ReceiveEmailManger extends Thread {

    public static void main(String[] args){

// 1. 创建一个顶层容器(窗口)
        JFrame jf = new JFrame("接收邮件");
        jf.setSize(500, 500);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(null);

        JLabel jla2 = new JLabel("标题: ");
        jla2.setLocation(50,50);
        jla2.setSize(150, 50);
        jla2.setFont(new Font("123", 5, 20));

        final   JTextField textField1 = new JTextField(8);
        textField1.setFont(new Font("subject", Font.PLAIN, 20));
        textField1.setLocation(150,50);
        textField1.setSize(250, 50);

        JLabel jla3 = new JLabel("邮件内容: ");
        jla3.setLocation(50,150);
        jla3.setSize(150, 50);
        jla3.setFont(new Font("123", 5, 20));

        final   JTextField textField3 = new JTextField(8);
        textField3.setFont(new Font("content", Font.PLAIN, 20));
        textField3.setLocation(150,150);
        textField3.setSize(250, 50);

   final      JTextArea jta = new JTextArea();
        jta.setLocation(150,150);
        jta.setSize(250, 200);
        jta.setFont(new Font("content", Font.PLAIN, 30));
        JButton btn = new JButton("接收邮件");
        btn.setLocation(150,380);
        btn.setSize(100, 50);
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

        try {
        ReceiveEmailManger re = new ReceiveEmailManger();
         String [] mess =  re.ReceiveEmailManger();
            textField1.setText(mess[1]);
            jta.setText(mess[2]);
        }catch (Exception ea){
         ea.printStackTrace();
        }

            }
        });

        panel.add(jla2);
        panel.add(jla3);
        panel.add(textField1);

        panel.add(btn);
        panel.add(jta);

        // 4. 把 面板容器 作为窗口的内容面板 设置到 窗口
        jf.setContentPane(panel);

        // 5. 显示窗口,前面创建的信息都在内存中,通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上。
        jf.setVisible(true);

 }

    public String[] ReceiveEmailManger() throws Exception {
        //加密的邮件套接字协议工厂
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        String pop3Server = "pop.qq.com";
        String protocol = "pop3";
        String username = "此处填写qq邮箱";
        String password = "此处填写QQ授权码";
        Properties prop = new Properties();
        prop.put("mail.store.protocol", protocol);
        prop.put("mail.pop3.host", pop3Server);
        // 特别需要注意,要将ssl协议设置为true,否则会报530错误
        prop.put("mail.pop3.ssl.enable", "true");
        prop.put("mail.pop3.ssl.socketFactory", sf);
        Session mailSession = Session.getDefaultInstance(prop,null);
        mailSession.setDebug(false);
        String [] mess = new  String[3];
        try {
            Store store = mailSession.getStore(protocol);
            //登录验证
            store.connect(pop3Server,username,password);
            //获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox
            Folder folder = store.getFolder("inbox");
            //设置访问权限
            folder.open(Folder.READ_ONLY);
            //获取所有邮件
            int size = folder.getMessageCount();
            Message message = folder.getMessage(size);
            //获取第一封发件人地址
            String from = message.getFrom()[0].toString();
            //获取第一封邮件标题
            String subject = message.getSubject();
            //获取第一封邮件内容
            String conten = message.getContent().toString();

            mess[0]=from;
            mess[1]=subject;
            mess[2]=conten;

            folder.close(false);
            store.close();
        }catch(Exception e) {
            e.printStackTrace();
        }
        return mess;
    }
}

四、导包

使用IDEA编程,在pom.xml文件下导入依赖包

<!-- java发送邮件jar包 -->
<dependencies>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
</dependencies>

到此这篇关于Java实战之基于swing的QQ邮件收发功能实现的文章就介绍到这了,更多相关基于Java swing的QQ邮件收发功能实现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java swing实现简单的五子棋游戏

    用java swing写的一个简单的五子棋游戏. 下面是Main.java. package com.crossing.main; import com.crossing.view.GameWindow; public class Main { /** * @param args */ public static void main(String[] args) { GameWindow gameWindow = new GameWindow(); } } 下面是GameWindow.java.

  • Java swing 图像处理多种效果实现教程

    项目记录: 1.图像原理 通常图像都是2D,对一副图像,可以看做其宽w*高h的一个二维数组, 即 图像=int[w][h],在w和h位置的每一个 int 值,就是这个点的像素值. 图像处理的本质是:对代表图像二维数组中的值进行重新计算. 2.思路: 将一张图片转化成一个int型癿二维数组 对于每一个像素点大小和颜色进行计算达到图像处理的效果. 在画笔中设置好颜色,填充形状然后将新的图片画出. 3.实现效果 获取像素点方法,首先利用文件imageIO读取图片,然后根据图片长宽进行遍历得到每个像素点

  • Eclipse+Java+Swing实现学生成绩管理系统的实例代码

    一.系统介绍 本系统实现了用户登录,实现了对学生成绩的增删改查,实现了用户修改密码功能,采用MD5加密算法,数据库使用Mysql8.0.13,界面良好. 二.系统展示 1.登录页 2.主页面 3.查询学生成绩 4.修改学生成绩 5.添加学生成绩 6.修改系统密码 三.系统实现 Student.java package com.sjsq.model; import java.util.ArrayList; import java.util.List; /** * 学生实体类 * @author s

  • Java swing读取txt文件实现学生考试系统

    本文实例为大家分享了Java swing读取txt文件实现学生考试系统的具体代码,供大家参考,具体内容如下 主要实现了一个简单的倒计时答题系统 源码Testquestion 类 public class Testquestion { private String questionText ="";//定义题目 private String standardkey = "";// 定义正确答案 private String selectKey =""

  • Java Swing实现餐厅点餐系统源码(收藏版)

    本文适合Java初级选手,主要技术是Java和MySQL.主要功能如下: (1)注册功能 (2)管理员可以新增套餐 (3)管理员可以管理套餐 (4)管理员可以处理订单 (5)管理员可以修改密码 (6)顾客可以点餐 (7)顾客可以查看订单信息 (8)顾客可以修改个人信息 下面是项目目录 源码有点多,不太好贴,如果需要源码,可以关注公众号[Java技术迷]回复[2021]编号03即是该系统的源码. 即可获取整套源码,也可以直接扫码关注 下面是系统运行图 如果需要源码,可以关注公众号回复[2021]即

  • Java Swing 只关闭当前窗体的实现

    看到很多人都在询问怎么在java swing中只关闭当前的窗体,因此写下此文. 主界面主要是有两个JButton,一个是通过按钮事件调起另一个JFame,另一个是关闭当前窗体. 1.关闭当前窗体不能使用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)方法,可以使用 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 2.通过JButton事件不能使用exit(),这样会使得整个程序的窗体全部关闭,可以使

  • Java中Swing类实例讲解

    Swing类部分画图方法讲解 定义框架 JFrame jFrame=new JFrame("标题名字"); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置用户在此窗体上发起 "close" 时默认执行的操作. //有两种选择,默认是 HIDE_ON_CLOSE即点击关闭时隐藏界面. jFrame.setBounds(0,0,1200,1200); //设置框架的大小 jFrame.setVisi

  • java实现猜数字小游戏(Swing版)

    2008年的时候,在学习Java how to program第五版的时候,写过一个猜数字小游戏,是用Applet写的: 现在,我要用Swing重写这个小游戏,同时,加入一些新功能,如:背景颜色(红色表示偏高,蓝色表示偏低).弹框.字体控制.布局管理器的使用. 运行截屏: 代码如下: //Guess a number between 1 and 1000 //Java how to program, 10/e, Exercise 12.14 //by pandenghuang@163.com /

  • java swing实现贪吃蛇双人游戏

    本文实例为大家分享了java swing实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 游戏截图 代码 Java14写的哦低版本会报错 文件列表 package Sys; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; import java.util.Timer; import java.util.TimerTask; public class Ma

  • java swing 创建一个简单的QQ界面教程

    记录自己用java swing做的第一个简易界面. LoginAction.java package com.QQUI0819; import javax.swing.*; import java.awt.event.*; //首先,编写按钮癿监听器实现类 public class LoginAction implements ActionListener { private int count=0; //当前为null,创建后指向界面输入框 private JTextField ulName;

  • java swing框架实现贪吃蛇游戏

    本文实例为大家分享了java swing实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.编写main方法 package game; import java.awt.Graphics; import javax.swing.*; public class snakeMain extends JFrame { public snakeMain() { snakeWin win = new snakeWin(); add(win); setTitle("̰贪吃蛇v1.0"); se

  • java Swing实现五子棋游戏

    本文实例为大家分享了java实现五子棋项目,供大家参考,具体内容如下 运行结果 视频经过压缩画质略显粗糙. 标题 1)绘制网格棋盘: 重写JPanel的paint(Graphics g)方法,绘制16*16网格. 如图: 2)代码如下(仅包含部分代码): public class Board extends JPanel{ int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.get

随机推荐