Java基于smtp与pop3实现收发邮件的功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lijunfan1994/article/details/49873129

前言

最近用java实现了收发邮件的功能,网上虽然已经有很多资料,但实际开发过程中还是遇到了一些问题。查阅了不少资料才最终完成,在此分享一下,希望帮助更多的人少走弯路。

背景

javaMail

JavaMail是java提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序,完成收发邮件的功能。
JavaMail并不包含在JDK中,需要我们手动下载并导入。
JavaMail官方下载地址
想要深入了解JavaMail还是要阅读官方文档。
JavaMail官方文档
下载javax.mail.jar包,使用时导入即可。

smtp

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。我们将利用smtp协议来发送邮件。

pop3

POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。
我们将使用pop3协议来接收邮件。

发送邮件

Talk is cheap.Show me the code!

下面是我实现的一个通过QQ邮箱的smtp服务器发送邮件的demo,通过这个demo,你将看到整个发送邮件的流程。

    public static void main(String[] args){
        try {
            String host = "smtp.qq.com";//这是QQ邮箱的smtp服务器地址
            String port = "25"; //端口号
            /*
            *Properties是一个属性对象,用来创建Session对象
            */
            Properties props = new Properties();
            props.setProperty("mail.smtp.host", host);
            props.setProperty("mail.smtp.port", port);
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.ssl.enable", "false");//"true"
            props.setProperty("mail.smtp.connectiontimeout", "5000");
            final String user = "******@qq.com";//用户名
            final String pwd = "******";//密码
            /*
            *Session类定义了一个基本的邮件对话。
            */
            Session session = Session.getInstance(props, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //登录用户名密码
                    return new PasswordAuthentication(user,pwd);
                }
            });
            session.setDebug(true);
            /*
            *Transport类用来发送邮件。
            *传入参数smtp,transport将自动按照smtp协议发送邮件。
            */
            Transport transport = session.getTransport("smtp");//"smtps"
            transport.connect(host,user,pwd);
            /*
            *Message对象用来储存实际发送的电子邮件信息
            */
            MimeMessage message = new MimeMessage(session);
            message.setSubject("邮件标题");
            //消息发送者接收者设置(发件地址,昵称),收件人看到的昵称是这里设定的
            message.setFrom(new InternetAddress(user,"二师兄"));
            message.addRecipients(Message.RecipientType.TO,new InternetAddress[]{
                //消息接收者(收件地址,昵称)
                //不过这个昵称貌似没有看到效果
                    new InternetAddress("510172916@qq.com","大师兄"),
            });
            message.saveChanges();

            //设置邮件内容及编码格式
            //后一个参数可以不指定编码,如"text/plain",但是将不能显示中文字符
            message.setContent("邮件内容..", "text/plain;charset=UTF-8");
            //发送
            //transport.send(message);
            Transport.send(message);
            transport.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

接收邮件

仍然用一个demo来总结接收邮件的过程。

public static void main(String[] args){
       String protocol = "pop3";//使用pop3协议
       boolean isSSL = true;//使用SSL加密
       String host = "pop.qq.com";//QQ邮箱的pop3服务器
       int port = 995;//端口
       String username = "******@qq.com";//用户名
       String password = "******";//密码

       /*
       *Properties是一个属性对象,用来创建Session对象
       */
       Properties props = new Properties();
       props.put("mail.pop3.ssl.enable", isSSL);
       props.put("mail.pop3.host", host);
       props.put("mail.pop3.port", port);
       /*
       *Session类定义了一个基本的邮件对话。
       */
       Session session = Session.getDefaultInstance(props);

       /*
        * Store类实现特定邮件协议上的读、写、监视、查找等操作。
        * 通过Store类可以访问Folder类。 
        * Folder类用于分级组织邮件,并提供照Message格式访问email的能力。
        */
       Store store = null;
       Folder folder = null;
       try {
           store = session.getStore(protocol);
           store.connect(username, password);

           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();
           Date date = message.getSentDate();

           System.out.println("From: " + from);
           System.out.println("Subject: " + subject);
           System.out.println("Date: " + date);
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           try {
               if (folder != null) {
                   folder.close(false);
               }
               if (store != null) {
                   store.close();
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
       System.out.println("接收完毕!");
}

总结

上面两个demo可以完成最简单的收发邮件功能。
想要实现更加丰富的功能,就去读文档和协议的内容吧。

对本篇博客有疑问可联系leejf1994@outlook.com交流。

展开阅读全文

没有更多推荐了,返回首页