JavaMail收发163邮件

时间:2022-06-20 00:10:45
最近系统中要加Mail功能,我查了查,下了JavaMail相关jar,
搜了几个例子,硬是跑不起来,望大家多多指教,谢谢!!!

错误信息:
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:264)
at javax.mail.Service.connect(Service.java:134)
at org.jonsenelizee.javamail.demo.NewDemo.execute(NewDemo.java:50)
at org.jonsenelizee.javamail.demo.NewDemo.main(NewDemo.java:22)
---------------------------------------------
源代码:

import java.util.Date;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class NewDemo
{
/**
 * @param args
 */
public static void main(String[] args)
{

try
{
execute();
} catch (Exception e)
{
e.printStackTrace();
}
}

public static void execute() throws Exception
{
Properties props = System.getProperties();
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(session);

InternetAddress toList[] = InternetAddress.parse("liufangmeng@163.com", false);
msg.addRecipients(MimeMessage.RecipientType.TO, toList);

InternetAddress fromAddress = new InternetAddress("dingjunfen@163.com");
msg.setFrom(fromAddress);
msg.setSentDate(new Date());

msg.setSubject("mail", "ISO-2022-JP");

String txt = "hello test mail OK?";
msg.setText(txt, "ISO-2022-JP");

Transport transport = session.getTransport("smtp");
transport.connect("smtp.163.com", "account@163.com", "password");
transport.sendMessage(msg, toList);
}
}

14 个解决方案

#1


好像新注册的163用户不支持smtp服务

#2


从错误信息可以知道验证非通过,连不上邮箱服务器,你的163邮箱可能是最近申请的吧,那是不能使用smtp,pop功能的,据了解06年前的可用,换个邮箱如新浪的试试

#3


需要认证,你要写一个类,继承自Authenticator类。我给个例子你,测试通过的。

package com.yuson.j2ee.javamail.core;

 

import java.util.Date;

import java.util.Properties;

 

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

 

import com.yuson.j2ee.javamail.struts.form.EmailForm;

 

public class YusonJavaMail {

 

       private String from;

 

       private String to;

 

       private String subject;

 

       private String content;

 

       private String smtpServer;

 

       private String smtpAuth;

 

       private String smtpUsername;

 

       private String smtpPassword;

 

       public YusonJavaMail(EmailForm emailForm) {

              this.from = emailForm.getFrom();

 

              this.to = emailForm.getTo();

 

              this.subject = emailForm.getSubject();

 

              this.content = emailForm.getContent();

             

              String temp = this.from.substring(this.from.indexOf("@")+1, this.from.lastIndexOf(".com"));

 

              this.smtpServer = "smtp." + temp + ".com";

 

              this.smtpAuth = "true";

 

              this.smtpUsername = this.from.substring(0, this.from.indexOf("@"));

 

              this.smtpPassword = emailForm.getSmtpPassword();

       }

 

       public boolean sendEmail() {

 

              try {

                     Properties properties = new Properties();

                     properties.put("mail.smtp.host", smtpServer);

                     properties.put("mail.smtp.auth", smtpAuth);

 

                     Session session;

 

                     if ("true".equals(smtpAuth)) {

                            //smtp服务器需要验证,用YusonAuthertiactor来创建mail session

                            YusonAuthenticator yusonAuthenticator = new YusonAuthenticator(

                                          smtpUsername, smtpPassword);

                            session = Session.getInstance(properties, yusonAuthenticator);

                     } else {

                            session = Session.getInstance(properties);

                     }

                     //Debug

                     session.setDebug(true);

                     Message message = new MimeMessage(session);

 

                     InternetAddress fromAddress = new InternetAddress(this.from);

                     message.setFrom(fromAddress);

 

                     InternetAddress toAddress = new InternetAddress(this.to);

                     message.setRecipient(Message.RecipientType.TO, toAddress);

 

                     message.setSubject(this.subject);

                     message.setText(this.content);

                     message.setSentDate(new Date());

                     message.saveChanges();

 

                     Transport transport;

                     transport = session.getTransport("smtp");

                     transport.connect(this.smtpServer, this.smtpUsername,

                                   this.smtpPassword);

                     transport.send(message, message.getAllRecipients());

                     transport.close();

 

              } catch (Exception mailEx) {

                     System.err.println("Send Mail Error : " + mailEx.getMessage());

                     return false;

              }

              return true;

 

       }

 

       @Override

       protected Object clone() throws CloneNotSupportedException {

              // TODO Auto-generated method stub

              return super.clone();

       }

 

       @Override

       public boolean equals(Object obj) {

              // TODO Auto-generated method stub

              return super.equals(obj);

       }

 

       @Override

       protected void finalize() throws Throwable {

              // TODO Auto-generated method stub

              super.finalize();

       }

 

       @Override

       public int hashCode() {

              // TODO Auto-generated method stub

              return super.hashCode();

       }

 

       @Override

       public String toString() {

              // TODO Auto-generated method stub

              return super.toString();

       }

 

}

 

 

 

 

package com.yuson.j2ee.javamail.core;

 

import javax.mail.Authenticator;

import javax.mail.PasswordAuthentication;

 

public class YusonAuthenticator extends Authenticator {

 

       private String username;

 

       private String password;

 

       public YusonAuthenticator(String username, String password) {

              this.username = username;

              this.password = password;

       }

 

       protected PasswordAuthentication getPasswordAuthentication() {

              return new PasswordAuthentication(username, password);

       }

 

}

#4


Thanks so much for thc1987, xyz88 and yuson_yan.
especially for yuson, I have made a test according to your code with some modification as following
and there is a exception:


package com.yuson.j2ee.javamail.core;

import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

//import com.yuson.j2ee.javamail.struts.form.EmailForm;
public class YusonJavaMail
{
private String from;
private String to;
private String subject;
private String content;
private String smtpServer;
private String smtpAuth;
private String smtpUsername;
private String smtpPassword;

public static void main(String[] args)
{
new YusonJavaMail().sendEmail();
}

public YusonJavaMail()
{
this.from = "JonsenElizee@163.com";
this.to = "JonsenElizee@163.com";
this.subject = "subject mail test";
this.content = "content mail test";

String temp = this.from.substring(this.from.indexOf("@") + 1, this.from.lastIndexOf(".com"));
this.smtpServer = "smtp." + temp + ".com";
this.smtpAuth = "true";
this.smtpUsername = this.from.substring(0, this.from.indexOf("@"));
/* Ofcourse, I execute the code with my email password, not "*" */
this.smtpPassword = "*";
}

@SuppressWarnings("static-access")
public boolean sendEmail()
{
try
{
Properties properties = new Properties();
properties.put("mail.smtp.host", smtpServer);
properties.put("mail.smtp.auth", smtpAuth);
Session session;
if ("true".equals(smtpAuth))
{
// smtp服务器需要验证,用YusonAuthertiactor来创建mail session
YusonAuthenticator yusonAuthenticator 
= new YusonAuthenticator(smtpUsername, smtpPassword);
session = Session.getInstance(properties, yusonAuthenticator);
} else
{
session = Session.getInstance(properties);
}
// Debug
session.setDebug(true);
Message message = new MimeMessage(session);
InternetAddress fromAddress = new InternetAddress(this.from);
message.setFrom(fromAddress);
InternetAddress toAddress = new InternetAddress(this.to);
message.setRecipient(Message.RecipientType.TO, toAddress);
message.setSubject(this.subject);
message.setText(this.content);
message.setSentDate(new Date());
message.saveChanges();
Transport transport;
transport = session.getTransport("smtp");
transport.connect(this.smtpServer, this.smtpUsername, this.smtpPassword);
transport.send(message, message.getAllRecipients());
transport.close();
} catch (Exception ex)
{
ex.printStackTrace();
return false;
}
return true;
}

@Override
protected Object clone() throws CloneNotSupportedException
{
return super.clone();
}

@Override
public boolean equals(Object obj)
{
return super.equals(obj);
}

@Override
protected void finalize() throws Throwable
{
super.finalize();
}

@Override
public int hashCode()
{
return super.hashCode();
}

@Override
public String toString()
{
return super.toString();
}
}



class YusonAuthenticator extends Authenticator
{
private String username;
private String password;

public YusonAuthenticator(String username, String password)
{
this.username = username;
this.password = password;
}

protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(username, password);
}
}

here is the exception msg:
DEBUG: setDebug: JavaMail version 1.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true

DEBUG: SMTPTransport trying to connect to host "smtp.163.com", port 25

DEBUG SMTP RCVD: 220 163.com Anti-spam GT for Coremail System (163com[20081010])

DEBUG: SMTPTransport connected to host "smtp.163.com", port: 25

DEBUG SMTP SENT: EHLO localhost.localdomain
DEBUG SMTP RCVD: 250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME

DEBUG SMTP Found extension "PIPELINING", arg ""
DEBUG SMTP Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP SENT: AUTH LOGIN
DEBUG SMTP RCVD: 334 dXNlcm5hbWU6

DEBUG SMTP SENT: Sm9uc2VuRWxpemVl
DEBUG SMTP RCVD: 334 UGFzc3dvcmQ6

DEBUG SMTP SENT: Kg==
DEBUG SMTP RCVD: 550 Óû§±»Ëø¶¨

DEBUG SMTP: useEhlo true, useAuth true

DEBUG: SMTPTransport trying to connect to host "smtp.163.com", port 25

DEBUG SMTP RCVD: 220 163.com Anti-spam GT for Coremail System (163com[20081010])

DEBUG: SMTPTransport connected to host "smtp.163.com", port: 25

DEBUG SMTP SENT: EHLO localhost.localdomain
DEBUG SMTP RCVD: 250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME

DEBUG SMTP Found extension "PIPELINING", arg ""
DEBUG SMTP Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP SENT: AUTH LOGIN
DEBUG SMTP RCVD: 334 dXNlcm5hbWU6

DEBUG SMTP SENT: Sm9uc2VuRWxpemVl
DEBUG SMTP RCVD: 334 UGFzc3dvcmQ6

DEBUG SMTP SENT: Kg==
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:264)
at javax.mail.Service.connect(Service.java:134)
at com.yuson.j2ee.javamail.core.YusonJavaMail.sendEmail(YusonJavaMail.java:74)
at com.yuson.j2ee.javamail.core.YusonJavaMail.main(YusonJavaMail.java:27)
DEBUG SMTP RCVD: 550 Óû§±»Ëø¶¨




----------------------------------------------------------------------------------------
My system is linux el5 with jdk 1.5
waiting for your reply, thank you again.
----------------------------------------------------------------------------------------

#5


163我是真的不知道应该是不支持
我的sina绝对可以


import java.util.Date; 
import java.util.Properties; 
import javax.servlet.*; //此句报错误的话请注释 
import javax.mail.Session; 
import javax.mail.Authenticator; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Message; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.InternetAddress; 
import javax.mail.Transport; 
public class javaMail { 
      private Properties properties; 
      private Session mailSession; 
      private MimeMessage mailMessage; 
      private Transport trans; 
      public javaMail() { 
      } 
      public void sendMail() { 
          try { 
              properties = new Properties(); 
              //设置邮件服务器 
              properties.put("mail.smtp.host", "smtp.sina.com"); 
              //验证 
              properties.put("mail.smtp.auth", "true"); 
              //根据属性新建一个邮件会话 
              mailSession = Session.getInstance(properties, 
                                                new Authenticator() { 
                  public PasswordAuthentication getPasswordAuthentication() { 
                      return new PasswordAuthentication("xnjnm@sina.com", 
                          "*******"); 
                  } 
              }); 
              mailSession.setDebug(true); 
              //建立消息对象 
              mailMessage = new MimeMessage(mailSession); 
              //发件人 
              mailMessage.setFrom(new InternetAddress("xnjnm@sina.com")); 
              //收件人 
              mailMessage.setRecipient(MimeMessage.RecipientType.TO, 
                                  new InternetAddress("xnjnm@163.com")); 
              //主题 
              mailMessage.setSubject("测试"); 
              //内容 
              mailMessage.setText("test"); 
              //发信时间 
              mailMessage.setSentDate(new Date()); 
              //存储信息 
              mailMessage.saveChanges(); 
              // 
              trans = mailSession.getTransport("smtp"); 
              //发送 
              trans.send(mailMessage); 
          } catch (Exception e) { 
              e.printStackTrace(); 
          } finally { 
          } 
      } 
/** 
  * @param args 
  */ 
public static void main(String[] args) { 
  // TODO Auto-generated method stub 
  javaMail javaMail=new javaMail(); 
  javaMail.sendMail(); 

}

#6


Thank you, xnjnmn!

there is my execution log:
DEBUG: setDebug: JavaMail version 1.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true

DEBUG: SMTPTransport trying to connect to host "smtp.sina.com", port 25

DEBUG SMTP RCVD: 220 irxd5-202.sinamail.sina.com.cn ESMTP

DEBUG: SMTPTransport connected to host "smtp.sina.com", port: 25

DEBUG SMTP SENT: EHLO localhost.localdomain
DEBUG SMTP RCVD: 250-irxd5-202.sinamail.sina.com.cn
250-8BITMIME
250-SIZE 31457280
250-AUTH PLAIN LOGIN
250 AUTH=PLAIN LOGIN

DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP Found extension "SIZE", arg "31457280"
DEBUG SMTP Found extension "AUTH", arg "PLAIN LOGIN"
DEBUG SMTP Found extension "AUTH=PLAIN", arg "LOGIN"
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP SENT: AUTH LOGIN
DEBUG SMTP RCVD: 334 VXNlcm5hbWU6

DEBUG SMTP SENT: amF2YW1haWx0ZXN0Ym94QHNpbmEuY29t
DEBUG SMTP RCVD: 334 UGFzc3dvcmQ6

DEBUG SMTP SENT: amF2YW1haWx0ZXN0Ym94eA==
DEBUG SMTP RCVD: 535 #5.7.0 Authentication failed

javax.mail.SendFailedException: Sending failed;
  nested exception is:
class javax.mail.AuthenticationFailedException
OK
at javax.mail.Transport.send0(Transport.java:218)
at javax.mail.Transport.send(Transport.java:80)
at org.jonsenelizee.javamail.demo.SinaMailDemo.sendMail(SinaMailDemo.java:60)
at org.jonsenelizee.javamail.demo.SinaMailDemo.main(SinaMailDemo.java:76)

###########################################################################################
# here is java code, javamailtestbox@sina.com is my mailbox. password is javamailtestboxx
###########################################################################################

package org.jonsenelizee.javamail.demo;

import java.util.Date;
import java.util.Properties;
import javax.servlet.*; //此句报错误的话请注释 
import javax.mail.Session;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Message;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import javax.mail.Transport;

public class SinaMailDemo
{
private Properties properties;
private Session mailSession;
private MimeMessage mailMessage;
private Transport trans;

public SinaMailDemo()
{
}

public void sendMail()
{
try
{
properties = new Properties();
// 设置邮件服务器
properties.put("mail.smtp.host", "smtp.sina.com");
// 验证
properties.put("mail.smtp.auth", "true");
// 根据属性新建一个邮件会话
mailSession = Session.getInstance(properties, new Authenticator()
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication
("javamailtestbox@sina.com", "javamailtestboxx");
}
});
mailSession.setDebug(true);
// 建立消息对象
mailMessage = new MimeMessage(mailSession);
// 发件人
mailMessage.setFrom(new InternetAddress("javamailtestbox@sina.com"));
// 收件人
mailMessage.setRecipient(MimeMessage.RecipientType.TO, 
new InternetAddress("javamailtestbox@163.com"));
// 主题
mailMessage.setSubject("测试");
// 内容
mailMessage.setText("test");
// 发信时间
mailMessage.setSentDate(new Date());
// 存储信息
mailMessage.saveChanges();
// 
trans = mailSession.getTransport("smtp");
// 发送
trans.send(mailMessage);
} catch (Exception e)
{
e.printStackTrace();
} finally
{
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
// TODO Auto-generated method stub
SinaMailDemo javaMail = new SinaMailDemo();
javaMail.sendMail();
System.out.println("OK");
}
}

#7


I believe codes from xnjnmn and yuson work well on their systems, 
but why does exception always occur on my system?

for the environment ?
for the api I used ?

I put jars needed in these programs under JAVA_HOME/jre/lib/ext folder as following:

/opt/ins/jdk/jdk1.5.0_17/jre/lib/ext
total 3.1M
-rw-r--r-- 1 root root  45K May  6 17:14  activation.jar
-rw-r--r-- 1 root root 8.1K May  5 02:11 dnsns.jar
-rw-r--r-- 1 root root 488K May  5 02:11 jxl.jar
-rw-r--r-- 1 root root 792K May  5 02:11 localedata.jar
-rw-r--r-- 1 root root 299K May  6 17:14  mail.jar
-rw-r--r-- 1 root root 694K May  5 02:11 mysql-connector-java-5.1.7-bin.jar
-rw-r--r-- 1 root root 400K May  5 02:11 sqljdbc.jar
-r--r--r-- 1 root root 155K May  5 02:11 sunjce_provider.jar
-r--r--r-- 1 root root 172K May  5 02:11 sunpkcs11.jar
[root@localhost ext]#

#8


Jar包正常,你试试用126发送一下? 

#9


awesome problem!
this is log for 126

javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:264)
at javax.mail.Service.connect(Service.java:134)
at com.yuson.j2ee.javamail.core.YusonJavaMail.sendEmail(YusonJavaMail.java:74)
at com.yuson.j2ee.javamail.core.YusonJavaMail.main(YusonJavaMail.java:27)

#10


哎,达人,在哪里???
我又找了个demo,run了一下,还是认证错误,126, 163都test了。
望大家多多指点:
代码:

import java.io.FileOutputStream;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;

/**
 * 邮件接受测试
 * 
 */
public class POP3MailReceiverTest
{
public POP3MailReceiverTest()
{
try
{
// 1. 设置连接信息, 生成一个 Session
Properties props = new Properties();
props.put("mail.transport.protocol", "pop3");// POP3 收信协议
//props.put("mail.pop.port", "110");
props.put("mail.debug", "true");// 调试
Session session = Session.getInstance(props, new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("JonsenElizee", "xxx");
}
});
// 2. 获取 Store 并连接到服务器
Store store = session.getStore("pop3");
store.connect("pop3.126.com", "JonsenElizee", "xxx");
// 3. 通过 Store 打开默认目录 Folder
Folder folder = store.getDefaultFolder();// 默认父目录
if (folder == null)
{
System.out.println("服务器不可用");
return;
}
System.out.println("默认信箱名:" + folder.getName());
Folder[] folders = folder.list();// 默认目录列表
System.out.println("默认目录下的子目录数: " + folders.length);
Folder popFolder = folder.getFolder("INBOX");// 获取收件箱
popFolder.open(Folder.READ_WRITE);// 可读邮件,可以删邮件的模式打开目录
// 4. 列出来收件箱 下所有邮件
Message[] messages = popFolder.getMessages();
// 取出来邮件数
int msgCount = popFolder.getMessageCount();
System.out.println("共有邮件: " + msgCount + "封");
// FetchProfile fProfile = new FetchProfile();// 选择邮件的下载模式,
// 根据网速选择不同的模式
// fProfile.add(FetchProfile.Item.ENVELOPE);
// folder.fetch(messages, fProfile);// 选择性的下载邮件
// 5. 循环处理每个邮件并实现邮件转为新闻的功能
for (int i = 0; i < msgCount; i++)
{
Message msg = messages[i];// 单个邮件
// 发件人信息
Address[] froms = msg.getFrom();
if (froms != null)
{
System.out.println("发件人信息:" + froms[0]);
InternetAddress addr = (InternetAddress) froms[0];
System.out.println("发件人地址:" + addr.getAddress());
System.out.println("发件人显示名:" + addr.getPersonal());
}
News news = new News();// 生成新闻对象
System.out.println("邮件主题:" + msg.getSubject());
news.setTitle(msg.getSubject());
// getContent() 是获取包裹内容, Part 相当于外包装
Multipart multipart = (Multipart) msg.getContent();// 获取邮件的内容, 就一个大包裹,
// MultiPart
// 包含所有邮件内容(正文+附件)
System.out.println("邮件共有" + multipart.getCount() + "部分组成");
// 依次处理各个部分
for (int j = 0, n = multipart.getCount(); j < n; j++)
{
System.out.println("处理第" + j + "部分");
Part part = multipart.getBodyPart(j);
// 解包, 取出 MultiPart的各个部分, 每部分可能是邮件内容,
// 也可能是另一个小包裹(MultipPart)
// 判断此包裹内容是不是一个小包裹, 
//一般这一部分是 正文 Content-Type: multipart/alternative
if (part.getContent() instanceof Multipart)
{
Multipart p = (Multipart) part.getContent();// 转成小包裹
System.out.println("小包裹中有" + p.getCount() + "部分");
// 列出小包裹中所有内容
for (int k = 0; k < p.getCount(); k++)
{
System.out.println("小包裹内容:" 
+ p.getBodyPart(k).getContent());
System.out.println("内容类型:" 
+ p.getBodyPart(k).getContentType());
if (p.getBodyPart(k).getContentType()
.startsWith("text/plain"))
{
// 处理文本正文
news.setBody(p.getBodyPart(k).getContent() + "");
} else
{
// 处理 HTML 正文
news.setBody(p.getBodyPart(k).getContent() + "");
}
}
}
// Content-Disposition: attachment; filename="String2Java.jpg"
String disposition = part.getDisposition();// 处理是否为附件信息
if (disposition != null)
{
System.out.println("发现附件: " + part.getFileName());
System.out.println("内容类型: " + part.getContentType());
System.out.println("附件内容:" + part.getContent());
java.io.InputStream in = part.getInputStream();// 打开附件的输入流
// 读取附件字节并存储到文件中
java.io.FileOutputStream out 
= new FileOutputStream(part.getFileName());
int data;
while ((data = in.read()) != -1)
{
out.write(data);
}
in.close();
out.close();
}
}
// }
// TODO newsDAO.save(news); // 将邮件所携带的信息作为新闻存储起来
// 6. 删除单个邮件, 标记一下邮件需要删除, 不会真正执行删除操作
// msg.setFlag(Flags.Flag.DELETED, true);
}
// 7. 关闭 Folder 会真正删除邮件, false 不删除
popFolder.close(true);
// 8. 关闭 store, 断开网络连接
store.close();
} catch (NoSuchProviderException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
new POP3MailReceiverTest();
}

class News
{
String title;

public String getTitle()
{
return title;
}

public void setTitle(String title)
{
this.title = title;
}

public String getBody()
{
return body;
}

public void setBody(String body)
{
this.body = body;
}

String body;
}
}


错误信息:

DEBUG: JavaMail version 1.3
DEBUG: java.io.FileNotFoundException: /opt/ins/jdk/jdk1.5.0_17/jre/lib/javamail.providers (No such file or directory)
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.providers
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.address.map
DEBUG: java.io.FileNotFoundException: /opt/ins/jdk/jdk1.5.0_17/jre/lib/javamail.address.map (No such file or directory)
DEBUG: getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]
POP3: connecting to host "pop3.126.com", port 110
S: +OK Welcome to coremail Mail Pop3 Server (126coms[fb7e5983973ab26e5b3b1cb58ca7034as])
C: USER JonsenElizee
S: +OK core mail
C: PASS xxx
S: -ERR ÄúûÓÐȨÏÞʹÓÃpop3¹¦ÄÜ
C: QUIT
S: +OK core mail
POP3: connecting to host "pop3.126.com", port 110
S: +OK Welcome to coremail Mail Pop3 Server (126coms[fb7e5983973ab26e5b3b1cb58ca7034as])
C: USER JonsenElizee
S: +OK core mail
C: PASS xxx
S: -ERR ÄúûÓÐȨÏÞʹÓÃpop3¹¦ÄÜ
C: QUIT
S: +OK core mail
javax.mail.AuthenticationFailedException: ÄúûÓÐȨÏÞʹÓÃpop3¹¦ÄÜ
at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:104)
at javax.mail.Service.connect(Service.java:255)
at javax.mail.Service.connect(Service.java:134)
at org.jonsenelizee.javamail.demo.POP3MailReceiverTest.<init>(POP3MailReceiverTest.java:41)
at org.jonsenelizee.javamail.demo.POP3MailReceiverTest.main(POP3MailReceiverTest.java:155)




#11


Java 深度探索者 
SSH、Ant、IBatis、jsf、seam、portal、设计模式、 
ZK、DWR、ajax、CSS 、oracle 
群号:65670864 欢迎加入

#12


if you want to make a connection to gmail and send a mail to gmail, you need to use ssh.

so, make sure you have the latest mail.jar from sun.com

#13


yes, 163 is not easy to connect for not supported default
if you have enough score or had bought some service from 163, you could connect it with pop3 and smtp.

these words are from my super advisor.

#14


可能是缺少activation.jar

#1


好像新注册的163用户不支持smtp服务

#2


从错误信息可以知道验证非通过,连不上邮箱服务器,你的163邮箱可能是最近申请的吧,那是不能使用smtp,pop功能的,据了解06年前的可用,换个邮箱如新浪的试试

#3


需要认证,你要写一个类,继承自Authenticator类。我给个例子你,测试通过的。

package com.yuson.j2ee.javamail.core;

 

import java.util.Date;

import java.util.Properties;

 

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

 

import com.yuson.j2ee.javamail.struts.form.EmailForm;

 

public class YusonJavaMail {

 

       private String from;

 

       private String to;

 

       private String subject;

 

       private String content;

 

       private String smtpServer;

 

       private String smtpAuth;

 

       private String smtpUsername;

 

       private String smtpPassword;

 

       public YusonJavaMail(EmailForm emailForm) {

              this.from = emailForm.getFrom();

 

              this.to = emailForm.getTo();

 

              this.subject = emailForm.getSubject();

 

              this.content = emailForm.getContent();

             

              String temp = this.from.substring(this.from.indexOf("@")+1, this.from.lastIndexOf(".com"));

 

              this.smtpServer = "smtp." + temp + ".com";

 

              this.smtpAuth = "true";

 

              this.smtpUsername = this.from.substring(0, this.from.indexOf("@"));

 

              this.smtpPassword = emailForm.getSmtpPassword();

       }

 

       public boolean sendEmail() {

 

              try {

                     Properties properties = new Properties();

                     properties.put("mail.smtp.host", smtpServer);

                     properties.put("mail.smtp.auth", smtpAuth);

 

                     Session session;

 

                     if ("true".equals(smtpAuth)) {

                            //smtp服务器需要验证,用YusonAuthertiactor来创建mail session

                            YusonAuthenticator yusonAuthenticator = new YusonAuthenticator(

                                          smtpUsername, smtpPassword);

                            session = Session.getInstance(properties, yusonAuthenticator);

                     } else {

                            session = Session.getInstance(properties);

                     }

                     //Debug

                     session.setDebug(true);

                     Message message = new MimeMessage(session);

 

                     InternetAddress fromAddress = new InternetAddress(this.from);

                     message.setFrom(fromAddress);

 

                     InternetAddress toAddress = new InternetAddress(this.to);

                     message.setRecipient(Message.RecipientType.TO, toAddress);

 

                     message.setSubject(this.subject);

                     message.setText(this.content);

                     message.setSentDate(new Date());

                     message.saveChanges();

 

                     Transport transport;

                     transport = session.getTransport("smtp");

                     transport.connect(this.smtpServer, this.smtpUsername,

                                   this.smtpPassword);

                     transport.send(message, message.getAllRecipients());

                     transport.close();

 

              } catch (Exception mailEx) {

                     System.err.println("Send Mail Error : " + mailEx.getMessage());

                     return false;

              }

              return true;

 

       }

 

       @Override

       protected Object clone() throws CloneNotSupportedException {

              // TODO Auto-generated method stub

              return super.clone();

       }

 

       @Override

       public boolean equals(Object obj) {

              // TODO Auto-generated method stub

              return super.equals(obj);

       }

 

       @Override

       protected void finalize() throws Throwable {

              // TODO Auto-generated method stub

              super.finalize();

       }

 

       @Override

       public int hashCode() {

              // TODO Auto-generated method stub

              return super.hashCode();

       }

 

       @Override

       public String toString() {

              // TODO Auto-generated method stub

              return super.toString();

       }

 

}

 

 

 

 

package com.yuson.j2ee.javamail.core;

 

import javax.mail.Authenticator;

import javax.mail.PasswordAuthentication;

 

public class YusonAuthenticator extends Authenticator {

 

       private String username;

 

       private String password;

 

       public YusonAuthenticator(String username, String password) {

              this.username = username;

              this.password = password;

       }

 

       protected PasswordAuthentication getPasswordAuthentication() {

              return new PasswordAuthentication(username, password);

       }

 

}

#4


Thanks so much for thc1987, xyz88 and yuson_yan.
especially for yuson, I have made a test according to your code with some modification as following
and there is a exception:


package com.yuson.j2ee.javamail.core;

import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

//import com.yuson.j2ee.javamail.struts.form.EmailForm;
public class YusonJavaMail
{
private String from;
private String to;
private String subject;
private String content;
private String smtpServer;
private String smtpAuth;
private String smtpUsername;
private String smtpPassword;

public static void main(String[] args)
{
new YusonJavaMail().sendEmail();
}

public YusonJavaMail()
{
this.from = "JonsenElizee@163.com";
this.to = "JonsenElizee@163.com";
this.subject = "subject mail test";
this.content = "content mail test";

String temp = this.from.substring(this.from.indexOf("@") + 1, this.from.lastIndexOf(".com"));
this.smtpServer = "smtp." + temp + ".com";
this.smtpAuth = "true";
this.smtpUsername = this.from.substring(0, this.from.indexOf("@"));
/* Ofcourse, I execute the code with my email password, not "*" */
this.smtpPassword = "*";
}

@SuppressWarnings("static-access")
public boolean sendEmail()
{
try
{
Properties properties = new Properties();
properties.put("mail.smtp.host", smtpServer);
properties.put("mail.smtp.auth", smtpAuth);
Session session;
if ("true".equals(smtpAuth))
{
// smtp服务器需要验证,用YusonAuthertiactor来创建mail session
YusonAuthenticator yusonAuthenticator 
= new YusonAuthenticator(smtpUsername, smtpPassword);
session = Session.getInstance(properties, yusonAuthenticator);
} else
{
session = Session.getInstance(properties);
}
// Debug
session.setDebug(true);
Message message = new MimeMessage(session);
InternetAddress fromAddress = new InternetAddress(this.from);
message.setFrom(fromAddress);
InternetAddress toAddress = new InternetAddress(this.to);
message.setRecipient(Message.RecipientType.TO, toAddress);
message.setSubject(this.subject);
message.setText(this.content);
message.setSentDate(new Date());
message.saveChanges();
Transport transport;
transport = session.getTransport("smtp");
transport.connect(this.smtpServer, this.smtpUsername, this.smtpPassword);
transport.send(message, message.getAllRecipients());
transport.close();
} catch (Exception ex)
{
ex.printStackTrace();
return false;
}
return true;
}

@Override
protected Object clone() throws CloneNotSupportedException
{
return super.clone();
}

@Override
public boolean equals(Object obj)
{
return super.equals(obj);
}

@Override
protected void finalize() throws Throwable
{
super.finalize();
}

@Override
public int hashCode()
{
return super.hashCode();
}

@Override
public String toString()
{
return super.toString();
}
}



class YusonAuthenticator extends Authenticator
{
private String username;
private String password;

public YusonAuthenticator(String username, String password)
{
this.username = username;
this.password = password;
}

protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(username, password);
}
}

here is the exception msg:
DEBUG: setDebug: JavaMail version 1.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true

DEBUG: SMTPTransport trying to connect to host "smtp.163.com", port 25

DEBUG SMTP RCVD: 220 163.com Anti-spam GT for Coremail System (163com[20081010])

DEBUG: SMTPTransport connected to host "smtp.163.com", port: 25

DEBUG SMTP SENT: EHLO localhost.localdomain
DEBUG SMTP RCVD: 250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME

DEBUG SMTP Found extension "PIPELINING", arg ""
DEBUG SMTP Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP SENT: AUTH LOGIN
DEBUG SMTP RCVD: 334 dXNlcm5hbWU6

DEBUG SMTP SENT: Sm9uc2VuRWxpemVl
DEBUG SMTP RCVD: 334 UGFzc3dvcmQ6

DEBUG SMTP SENT: Kg==
DEBUG SMTP RCVD: 550 Óû§±»Ëø¶¨

DEBUG SMTP: useEhlo true, useAuth true

DEBUG: SMTPTransport trying to connect to host "smtp.163.com", port 25

DEBUG SMTP RCVD: 220 163.com Anti-spam GT for Coremail System (163com[20081010])

DEBUG: SMTPTransport connected to host "smtp.163.com", port: 25

DEBUG SMTP SENT: EHLO localhost.localdomain
DEBUG SMTP RCVD: 250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME

DEBUG SMTP Found extension "PIPELINING", arg ""
DEBUG SMTP Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP SENT: AUTH LOGIN
DEBUG SMTP RCVD: 334 dXNlcm5hbWU6

DEBUG SMTP SENT: Sm9uc2VuRWxpemVl
DEBUG SMTP RCVD: 334 UGFzc3dvcmQ6

DEBUG SMTP SENT: Kg==
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:264)
at javax.mail.Service.connect(Service.java:134)
at com.yuson.j2ee.javamail.core.YusonJavaMail.sendEmail(YusonJavaMail.java:74)
at com.yuson.j2ee.javamail.core.YusonJavaMail.main(YusonJavaMail.java:27)
DEBUG SMTP RCVD: 550 Óû§±»Ëø¶¨




----------------------------------------------------------------------------------------
My system is linux el5 with jdk 1.5
waiting for your reply, thank you again.
----------------------------------------------------------------------------------------

#5


163我是真的不知道应该是不支持
我的sina绝对可以


import java.util.Date; 
import java.util.Properties; 
import javax.servlet.*; //此句报错误的话请注释 
import javax.mail.Session; 
import javax.mail.Authenticator; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Message; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.InternetAddress; 
import javax.mail.Transport; 
public class javaMail { 
      private Properties properties; 
      private Session mailSession; 
      private MimeMessage mailMessage; 
      private Transport trans; 
      public javaMail() { 
      } 
      public void sendMail() { 
          try { 
              properties = new Properties(); 
              //设置邮件服务器 
              properties.put("mail.smtp.host", "smtp.sina.com"); 
              //验证 
              properties.put("mail.smtp.auth", "true"); 
              //根据属性新建一个邮件会话 
              mailSession = Session.getInstance(properties, 
                                                new Authenticator() { 
                  public PasswordAuthentication getPasswordAuthentication() { 
                      return new PasswordAuthentication("xnjnm@sina.com", 
                          "*******"); 
                  } 
              }); 
              mailSession.setDebug(true); 
              //建立消息对象 
              mailMessage = new MimeMessage(mailSession); 
              //发件人 
              mailMessage.setFrom(new InternetAddress("xnjnm@sina.com")); 
              //收件人 
              mailMessage.setRecipient(MimeMessage.RecipientType.TO, 
                                  new InternetAddress("xnjnm@163.com")); 
              //主题 
              mailMessage.setSubject("测试"); 
              //内容 
              mailMessage.setText("test"); 
              //发信时间 
              mailMessage.setSentDate(new Date()); 
              //存储信息 
              mailMessage.saveChanges(); 
              // 
              trans = mailSession.getTransport("smtp"); 
              //发送 
              trans.send(mailMessage); 
          } catch (Exception e) { 
              e.printStackTrace(); 
          } finally { 
          } 
      } 
/** 
  * @param args 
  */ 
public static void main(String[] args) { 
  // TODO Auto-generated method stub 
  javaMail javaMail=new javaMail(); 
  javaMail.sendMail(); 

}

#6


Thank you, xnjnmn!

there is my execution log:
DEBUG: setDebug: JavaMail version 1.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true

DEBUG: SMTPTransport trying to connect to host "smtp.sina.com", port 25

DEBUG SMTP RCVD: 220 irxd5-202.sinamail.sina.com.cn ESMTP

DEBUG: SMTPTransport connected to host "smtp.sina.com", port: 25

DEBUG SMTP SENT: EHLO localhost.localdomain
DEBUG SMTP RCVD: 250-irxd5-202.sinamail.sina.com.cn
250-8BITMIME
250-SIZE 31457280
250-AUTH PLAIN LOGIN
250 AUTH=PLAIN LOGIN

DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP Found extension "SIZE", arg "31457280"
DEBUG SMTP Found extension "AUTH", arg "PLAIN LOGIN"
DEBUG SMTP Found extension "AUTH=PLAIN", arg "LOGIN"
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP SENT: AUTH LOGIN
DEBUG SMTP RCVD: 334 VXNlcm5hbWU6

DEBUG SMTP SENT: amF2YW1haWx0ZXN0Ym94QHNpbmEuY29t
DEBUG SMTP RCVD: 334 UGFzc3dvcmQ6

DEBUG SMTP SENT: amF2YW1haWx0ZXN0Ym94eA==
DEBUG SMTP RCVD: 535 #5.7.0 Authentication failed

javax.mail.SendFailedException: Sending failed;
  nested exception is:
class javax.mail.AuthenticationFailedException
OK
at javax.mail.Transport.send0(Transport.java:218)
at javax.mail.Transport.send(Transport.java:80)
at org.jonsenelizee.javamail.demo.SinaMailDemo.sendMail(SinaMailDemo.java:60)
at org.jonsenelizee.javamail.demo.SinaMailDemo.main(SinaMailDemo.java:76)

###########################################################################################
# here is java code, javamailtestbox@sina.com is my mailbox. password is javamailtestboxx
###########################################################################################

package org.jonsenelizee.javamail.demo;

import java.util.Date;
import java.util.Properties;
import javax.servlet.*; //此句报错误的话请注释 
import javax.mail.Session;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Message;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import javax.mail.Transport;

public class SinaMailDemo
{
private Properties properties;
private Session mailSession;
private MimeMessage mailMessage;
private Transport trans;

public SinaMailDemo()
{
}

public void sendMail()
{
try
{
properties = new Properties();
// 设置邮件服务器
properties.put("mail.smtp.host", "smtp.sina.com");
// 验证
properties.put("mail.smtp.auth", "true");
// 根据属性新建一个邮件会话
mailSession = Session.getInstance(properties, new Authenticator()
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication
("javamailtestbox@sina.com", "javamailtestboxx");
}
});
mailSession.setDebug(true);
// 建立消息对象
mailMessage = new MimeMessage(mailSession);
// 发件人
mailMessage.setFrom(new InternetAddress("javamailtestbox@sina.com"));
// 收件人
mailMessage.setRecipient(MimeMessage.RecipientType.TO, 
new InternetAddress("javamailtestbox@163.com"));
// 主题
mailMessage.setSubject("测试");
// 内容
mailMessage.setText("test");
// 发信时间
mailMessage.setSentDate(new Date());
// 存储信息
mailMessage.saveChanges();
// 
trans = mailSession.getTransport("smtp");
// 发送
trans.send(mailMessage);
} catch (Exception e)
{
e.printStackTrace();
} finally
{
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
// TODO Auto-generated method stub
SinaMailDemo javaMail = new SinaMailDemo();
javaMail.sendMail();
System.out.println("OK");
}
}

#7


I believe codes from xnjnmn and yuson work well on their systems, 
but why does exception always occur on my system?

for the environment ?
for the api I used ?

I put jars needed in these programs under JAVA_HOME/jre/lib/ext folder as following:

/opt/ins/jdk/jdk1.5.0_17/jre/lib/ext
total 3.1M
-rw-r--r-- 1 root root  45K May  6 17:14  activation.jar
-rw-r--r-- 1 root root 8.1K May  5 02:11 dnsns.jar
-rw-r--r-- 1 root root 488K May  5 02:11 jxl.jar
-rw-r--r-- 1 root root 792K May  5 02:11 localedata.jar
-rw-r--r-- 1 root root 299K May  6 17:14  mail.jar
-rw-r--r-- 1 root root 694K May  5 02:11 mysql-connector-java-5.1.7-bin.jar
-rw-r--r-- 1 root root 400K May  5 02:11 sqljdbc.jar
-r--r--r-- 1 root root 155K May  5 02:11 sunjce_provider.jar
-r--r--r-- 1 root root 172K May  5 02:11 sunpkcs11.jar
[root@localhost ext]#

#8


Jar包正常,你试试用126发送一下? 

#9


awesome problem!
this is log for 126

javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:264)
at javax.mail.Service.connect(Service.java:134)
at com.yuson.j2ee.javamail.core.YusonJavaMail.sendEmail(YusonJavaMail.java:74)
at com.yuson.j2ee.javamail.core.YusonJavaMail.main(YusonJavaMail.java:27)

#10


哎,达人,在哪里???
我又找了个demo,run了一下,还是认证错误,126, 163都test了。
望大家多多指点:
代码:

import java.io.FileOutputStream;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;

/**
 * 邮件接受测试
 * 
 */
public class POP3MailReceiverTest
{
public POP3MailReceiverTest()
{
try
{
// 1. 设置连接信息, 生成一个 Session
Properties props = new Properties();
props.put("mail.transport.protocol", "pop3");// POP3 收信协议
//props.put("mail.pop.port", "110");
props.put("mail.debug", "true");// 调试
Session session = Session.getInstance(props, new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("JonsenElizee", "xxx");
}
});
// 2. 获取 Store 并连接到服务器
Store store = session.getStore("pop3");
store.connect("pop3.126.com", "JonsenElizee", "xxx");
// 3. 通过 Store 打开默认目录 Folder
Folder folder = store.getDefaultFolder();// 默认父目录
if (folder == null)
{
System.out.println("服务器不可用");
return;
}
System.out.println("默认信箱名:" + folder.getName());
Folder[] folders = folder.list();// 默认目录列表
System.out.println("默认目录下的子目录数: " + folders.length);
Folder popFolder = folder.getFolder("INBOX");// 获取收件箱
popFolder.open(Folder.READ_WRITE);// 可读邮件,可以删邮件的模式打开目录
// 4. 列出来收件箱 下所有邮件
Message[] messages = popFolder.getMessages();
// 取出来邮件数
int msgCount = popFolder.getMessageCount();
System.out.println("共有邮件: " + msgCount + "封");
// FetchProfile fProfile = new FetchProfile();// 选择邮件的下载模式,
// 根据网速选择不同的模式
// fProfile.add(FetchProfile.Item.ENVELOPE);
// folder.fetch(messages, fProfile);// 选择性的下载邮件
// 5. 循环处理每个邮件并实现邮件转为新闻的功能
for (int i = 0; i < msgCount; i++)
{
Message msg = messages[i];// 单个邮件
// 发件人信息
Address[] froms = msg.getFrom();
if (froms != null)
{
System.out.println("发件人信息:" + froms[0]);
InternetAddress addr = (InternetAddress) froms[0];
System.out.println("发件人地址:" + addr.getAddress());
System.out.println("发件人显示名:" + addr.getPersonal());
}
News news = new News();// 生成新闻对象
System.out.println("邮件主题:" + msg.getSubject());
news.setTitle(msg.getSubject());
// getContent() 是获取包裹内容, Part 相当于外包装
Multipart multipart = (Multipart) msg.getContent();// 获取邮件的内容, 就一个大包裹,
// MultiPart
// 包含所有邮件内容(正文+附件)
System.out.println("邮件共有" + multipart.getCount() + "部分组成");
// 依次处理各个部分
for (int j = 0, n = multipart.getCount(); j < n; j++)
{
System.out.println("处理第" + j + "部分");
Part part = multipart.getBodyPart(j);
// 解包, 取出 MultiPart的各个部分, 每部分可能是邮件内容,
// 也可能是另一个小包裹(MultipPart)
// 判断此包裹内容是不是一个小包裹, 
//一般这一部分是 正文 Content-Type: multipart/alternative
if (part.getContent() instanceof Multipart)
{
Multipart p = (Multipart) part.getContent();// 转成小包裹
System.out.println("小包裹中有" + p.getCount() + "部分");
// 列出小包裹中所有内容
for (int k = 0; k < p.getCount(); k++)
{
System.out.println("小包裹内容:" 
+ p.getBodyPart(k).getContent());
System.out.println("内容类型:" 
+ p.getBodyPart(k).getContentType());
if (p.getBodyPart(k).getContentType()
.startsWith("text/plain"))
{
// 处理文本正文
news.setBody(p.getBodyPart(k).getContent() + "");
} else
{
// 处理 HTML 正文
news.setBody(p.getBodyPart(k).getContent() + "");
}
}
}
// Content-Disposition: attachment; filename="String2Java.jpg"
String disposition = part.getDisposition();// 处理是否为附件信息
if (disposition != null)
{
System.out.println("发现附件: " + part.getFileName());
System.out.println("内容类型: " + part.getContentType());
System.out.println("附件内容:" + part.getContent());
java.io.InputStream in = part.getInputStream();// 打开附件的输入流
// 读取附件字节并存储到文件中
java.io.FileOutputStream out 
= new FileOutputStream(part.getFileName());
int data;
while ((data = in.read()) != -1)
{
out.write(data);
}
in.close();
out.close();
}
}
// }
// TODO newsDAO.save(news); // 将邮件所携带的信息作为新闻存储起来
// 6. 删除单个邮件, 标记一下邮件需要删除, 不会真正执行删除操作
// msg.setFlag(Flags.Flag.DELETED, true);
}
// 7. 关闭 Folder 会真正删除邮件, false 不删除
popFolder.close(true);
// 8. 关闭 store, 断开网络连接
store.close();
} catch (NoSuchProviderException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
new POP3MailReceiverTest();
}

class News
{
String title;

public String getTitle()
{
return title;
}

public void setTitle(String title)
{
this.title = title;
}

public String getBody()
{
return body;
}

public void setBody(String body)
{
this.body = body;
}

String body;
}
}


错误信息:

DEBUG: JavaMail version 1.3
DEBUG: java.io.FileNotFoundException: /opt/ins/jdk/jdk1.5.0_17/jre/lib/javamail.providers (No such file or directory)
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.providers
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.address.map
DEBUG: java.io.FileNotFoundException: /opt/ins/jdk/jdk1.5.0_17/jre/lib/javamail.address.map (No such file or directory)
DEBUG: getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]
POP3: connecting to host "pop3.126.com", port 110
S: +OK Welcome to coremail Mail Pop3 Server (126coms[fb7e5983973ab26e5b3b1cb58ca7034as])
C: USER JonsenElizee
S: +OK core mail
C: PASS xxx
S: -ERR ÄúûÓÐȨÏÞʹÓÃpop3¹¦ÄÜ
C: QUIT
S: +OK core mail
POP3: connecting to host "pop3.126.com", port 110
S: +OK Welcome to coremail Mail Pop3 Server (126coms[fb7e5983973ab26e5b3b1cb58ca7034as])
C: USER JonsenElizee
S: +OK core mail
C: PASS xxx
S: -ERR ÄúûÓÐȨÏÞʹÓÃpop3¹¦ÄÜ
C: QUIT
S: +OK core mail
javax.mail.AuthenticationFailedException: ÄúûÓÐȨÏÞʹÓÃpop3¹¦ÄÜ
at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:104)
at javax.mail.Service.connect(Service.java:255)
at javax.mail.Service.connect(Service.java:134)
at org.jonsenelizee.javamail.demo.POP3MailReceiverTest.<init>(POP3MailReceiverTest.java:41)
at org.jonsenelizee.javamail.demo.POP3MailReceiverTest.main(POP3MailReceiverTest.java:155)




#11


Java 深度探索者 
SSH、Ant、IBatis、jsf、seam、portal、设计模式、 
ZK、DWR、ajax、CSS 、oracle 
群号:65670864 欢迎加入

#12


if you want to make a connection to gmail and send a mail to gmail, you need to use ssh.

so, make sure you have the latest mail.jar from sun.com

#13


yes, 163 is not easy to connect for not supported default
if you have enough score or had bought some service from 163, you could connect it with pop3 and smtp.

these words are from my super advisor.

#14


可能是缺少activation.jar