想从gmail中收取邮件,但总是报错。classpath设置无误,可以用gmail发送邮件
Exception in thread "main" javax.mail.NoSuchProviderException:No provider for pop3
请大家帮忙找出错误原因
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;
}
}

解决方案 »

  1.   

    关于使用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,同时应该注意协议的名称必须要小写。
      

  2.   

    你的classpath下有pop3.jar吗?The POP3 provider is not part of the standard JavaMail download. You'll have to download the pop3.jar seperatly and include it in your classpath. I'm pretty sure you can grab it from the java.sun.com site with the other java mail downloads. 
      

  3.   

    感想你的回答
    我的classpath指向javamail包
    包中含有com.sun.mail.pop3
    .DefaultFolder
    .POP3Folder
    .POP3Message
    .POP3SSLStore
    .POP3Store
    .Protocol
    .Response
    .SharedByteArrayOutputStream
    .Status有缺少的类吗
      

  4.   

    呵呵,我也遇到了这个问题,感谢哥们儿的提醒,pop3.jar  没添加进去,哈哈
      

  5.   

     <<********// 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");   **********》不知道你的是不是这里出问题了,我的是,调试成功的
    Properties props = new Properties();
    props.setProperty("mail.smtp.host", "smtp.sina.com");  
        props.setProperty("mail.smtp.auth", "true"); 
    Session session = Session.getDefaultInstance(props);
    URLName urlname = new URLName("pop3","pop.sina.com",110,null,"[email protected]","xxxxxxx");
    Store store=null;
    Folder inbox=null;
    try{
    store=session.getStore(urlname);
    希望对你有启发