一、电子邮件详解

  • 假设自己的电子邮件是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邮件收发功能实现内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!