基于SMTP协议的模拟邮件系统(附完整代码)

  • Post author:
  • Post category:其他


技术简介:依托Java,利用smtp,pop3协议的邮件收发系统,其中涉及少量java swing编程

本文主要介绍利用java实现的一个简单的邮件收发系统

大体思路:

1. 配置自己的邮箱,和邮箱授权密码(smtp,pop3需要授权密码,而不是登录密码)

2. 填写好收件人邮箱,邮件主题,邮件内容,然后利用现有的smtp包,调用函数,邮件发送成功

3.利用pop3协议,一次性获取自己的邮箱中所有的邮件,逐层剥离,然后用swing渲染出来

接下来展示利用smtp协议的发送邮件函数与利用pop3协议的接收邮件函数

SendMail.java

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class SendMail {
    public static boolean sendMail(String account,String subject,String content,String fromUser){
        if (fromUser == null){
            fromUser = "Sayello";
        }
        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 = "*********";//smtp/pop3授权密码
            /*
             *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(subject);
            //消息发送者接收者设置(发件地址,昵称),收件人看到的昵称是这里设定的
            message.setFrom(new InternetAddress(user, fromUser));
            message.addRecipients(Message.RecipientType.TO, new InternetAddress[]{
            //消息接收者(收件地址,昵称)
            // 不过这个昵称貌似没有看到效果
            new InternetAddress(account, "Sayello"),});
            message.saveChanges();
            //设置邮件内容及编码格式
            // 后一个参数可以不指定编码,如"text/plain",但是将不能显示中文字符
            message.setContent(content, "text/plain;charset=UTF-8");
            //发送
            Transport.send(message);
            transport.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return true;
    }
}

ReceiveMail.java

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import java.util.Date;
import java.util.Properties;

public class ReceiveMail {
    public static Message[] getAllMails() {
        String protocol = "pop3";//使用pop3协议
        boolean isSSL = true;//使用SSL加密
        String host = "pop.qq.com";//QQ邮箱的pop3服务器
        int port = 995;//端口
        final String username = "****@qq.com";//邮箱账户
        final String password = "******";//smtp/pop3授权密码
        /*
         *Properties是一个属性对象,用来创建Session对象
         */
        try{
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            Properties props = new Properties();
            props.put("mail.pop3.auth.plain.disable",true);
            props.put("mail.pop3.ssl.enable",true);

            props.put("mail.pop3.auth", "true"); //这样才能通过验证

            props.put("mail.pop3.ssl.socketFactory", sf);
            props.put("mail.pop3.host", host);
            props.put("mail.pop3.port", port);

            MyAuthenticator myauth = new MyAuthenticator(username, password);

            Session session = Session.getDefaultInstance(props,myauth);
            /*
             * 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_WRITE); // 设置对邮件帐户的访问权限
                Message[] messages = folder.getMessages();
                System.out.println("count="+messages.length);
                int n = folder.getUnreadMessageCount();// 得到未读数量
                int n1 = folder.getMessageCount();// 得到邮件总数量
                return messages;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("接收完毕!");
        return null;
    }
}

然后附上完整代码包 ,由于本文并没有涉及到很厉害的技术,因此代码包我也就不会长存了,我就放到csdn上面存着了


csdn完整代码包下载

我写这些代码的过程中遇到很多坑,一直有个坑是控制台报错,说ReceiveMail.java中的下面这个代码报错

store.connect(username, password);

Login fail,缺少SSL什么的,但我确定我在其中配置好了,花了差不多5个小时,后来我感觉是我引入的两个包:mail.jar和javax.mail-1.6.0.jar的冲突问题(按道理不会冲突,代码中也并没有报错)

把mail.jar删了之后竟然就好了,困扰5个小时的问题就好了!!!

现在想想可能是两个jar包里面有些接口是一样的,但是底层有些不同,javax.mail-1.6.0.jar版本新一些,一些安全措施也更加完善,符合了QQ一些摸不着头脑的安全规范

提示一点,用的邮箱不要是最近申请的,我是基于QQ邮箱的,其他邮箱使用时注意端口号可能有所不同,没记错的话,pop3端口163邮箱的是110,QQ邮箱是995

其实只要看懂上面两个函数,代码包也就不用下载了

希望能有所帮助!



版权声明:本文为qq_37508554原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。