日期:2014-05-20  浏览次数:20984 次

No provider for pop3
想从gmail中收取邮件,但总是报错。classpath设置无误,可以用gmail发送邮件
Exception in thread "main" javax.mail.NoSuchProviderException:No provider for pop3
请大家帮忙找出错误原因
Java code
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;

/**
 * 用于收取Gmail邮件
 * @author Winter Lau
 */
public class MailFetch
{
    public static void main(String argv[]) throws Exception 
    {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        
        // Get a Properties object
        Properties props = System.getProperties();
        props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.pop3.socketFactory.fallback", "false");
        props.setProperty("mail.pop3.port", "995");
        props.setProperty("mail.pop3.socketFactory.port", "995");
        props.put("mail.pop3.host", "pop.gmail.com");   
        //以下步骤跟一般的JavaMail操作相同
        Session session = Session.getDefaultInstance(props,null);
        
        //请将红色部分对应替换成你的邮箱帐号和密码
        URLName urln = new URLName("pop3","pop.gmail.com",995,null,
        "账号", "密码");
        Store store = session.getStore(urln);////////、、//运行在该行时报错
        Folder inbox = null;
        try 
        {
            store.connect();
            inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
            FetchProfile profile = new FetchProfile();
            profile.add(FetchProfile.Item.ENVELOPE);
            Message[] messages = inbox.getMessages();
            inbox.fetch(messages, profile);
            System.out.println("收件箱的邮件数:" + messages.length);
            for (int i = 0; i < messages.length; i++) 
            {
                //邮件发送者
                String from = decodeText(messages[i].getFrom()[0].toString());
                InternetAddress ia = new InternetAddress(from);
                System.out.println("FROM:" + ia.getPersonal()+'('+ia.getAddress()+')');
                //邮件标题
                System.out.println("TITLE:" + messages[i].getSubject());
                //邮件大小
                System.out.println("SIZE:" + messages[i].getSize());
                //邮件发送时间
                System.out.println("DATE:" + messages[i].getSentDate());
            }
        } 
        finally 
        {
            try 
            {
                inbox.close(false);
            } 
            catch (Exception e) 
            {
                
            }
            try 
            {
                store.close();
            } 
            catch (Exception e) 
            {
                
            }
        }
    }
    
    protected static String decodeText(String text) throws UnsupportedEncodingException 
    {
        if (text == null)
        return null;
        if (text.startsWith("=?GB") || text.startsWith("=?gb"))
        text = MimeUtility.decodeText(text);
        else
        text = new String(text.getBytes("ISO8859_1"));
        return text;
    }
}




------解决方案--------------------
关于使用javamail时发生的异常javax.mail.NoSuchProviderException: No provider for pop3的分析:

JavaMail其实跟JDBC一样,都是规定了一些接口协议,真正的实现是由叫做 Provider的东西来负责,因此在使用JavaMail的时候需要让其知道由哪个Provider处理,就好像使用JDBC时候需要加载驱动程序类一个道理。SUN提供的javamail的jar文件包中有个文件,这个文件位于mail.jar/METE-INF /javamail.default.providers,该文件就保存着不同的协议使用不同的Provider类名,在以前版本的 javamail中,因为这个配置是存在于另外一个文件mail-api.jar中的,因此如果类路径中没有该jar文件就常常会导致上面提到那个异常,因此建议大家使用最新的JavaMail 1.3.1,同时应该注意协议的名称必须要小写。