http://spaces.msn.com/members/tcjava/
 /*
/*
 在java版经常看到有人问如何用javamail发送邮件?如何接收邮件?如何访问多个文件夹等。问题零散,而历史的回复早已经淹没在问题的海洋之中。
在java版经常看到有人问如何用javamail发送邮件?如何接收邮件?如何访问多个文件夹等。问题零散,而历史的回复早已经淹没在问题的海洋之中。

 本人之前所做过一个java项目,其中包含有WebMail功能,当初为用java实现而对javamail摸索了一段时间,总算有点收获。看到论坛中的经常有此方面的问题,因此把我的一些经验帖出来,希望对大家有些帮助。
本人之前所做过一个java项目,其中包含有WebMail功能,当初为用java实现而对javamail摸索了一段时间,总算有点收获。看到论坛中的经常有此方面的问题,因此把我的一些经验帖出来,希望对大家有些帮助。

 此篇仅介绍用javamail实现发送邮件功能,其中涉及smtp认证,邮件附件发送,及HTML内容邮件等。
此篇仅介绍用javamail实现发送邮件功能,其中涉及smtp认证,邮件附件发送,及HTML内容邮件等。
 其它有关多邮箱的实现,接收POP3邮件及IMAP等内容,将在后续文章中介绍。
其它有关多邮箱的实现,接收POP3邮件及IMAP等内容,将在后续文章中介绍。

 如下程序需要:javamail,JAF包,j2ee.jar包含了上述两个包,建议大家安装J2SDKEE或直接拷贝j2ee.jar,将其添加到jbuilder的library中,或系统ClassPath中
如下程序需要:javamail,JAF包,j2ee.jar包含了上述两个包,建议大家安装J2SDKEE或直接拷贝j2ee.jar,将其添加到jbuilder的library中,或系统ClassPath中

 */
*/



 package com.me.util.mail;
package com.me.util.mail;

 /**
/**
 * @author Zhangkun aistill@msn.com
* @author Zhangkun aistill@msn.com
 * @version 1.0
* @version 1.0
 */
*/

 import java.util.*;
import java.util.*;
 import javax.mail.*;
import javax.mail.*;
 import javax.mail.internet.*;
import javax.mail.internet.*;
 import java.util.Date;
import java.util.Date;
 import javax.activation.*;
import javax.activation.*;
 import java.io.*;
import java.io.*;
 import com.me.util.*;
import com.me.util.*;

 public class sendMail {
public class sendMail {

 private MimeMessage mimeMsg; //MIME邮件对象
private MimeMessage mimeMsg; //MIME邮件对象

 private Session session; //邮件会话对象
private Session session; //邮件会话对象
 private Properties props; //系统属性
private Properties props; //系统属性
 private boolean needAuth = false; //smtp是否需要认证
private boolean needAuth = false; //smtp是否需要认证

 private String username = ""; //smtp认证用户名和密码
private String username = ""; //smtp认证用户名和密码
 private String password = "";
private String password = "";

 private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象



 /**
/**
 *
* 
 */
*/
 public sendMail() {
public sendMail() {
 setSmtpHost(getConfig.mailHost);//如果没有指定邮件服务器,就从getConfig类中获取
setSmtpHost(getConfig.mailHost);//如果没有指定邮件服务器,就从getConfig类中获取
 createMimeMessage();
createMimeMessage();
 }
}

 public sendMail(String smtp){
public sendMail(String smtp){
 setSmtpHost(smtp);
setSmtpHost(smtp);
 createMimeMessage();
createMimeMessage();
 }
}



 /**
/**
 * @param hostName String
* @param hostName String
 */
*/
 public void setSmtpHost(String hostName) {
public void setSmtpHost(String hostName) {
 System.out.println("设置系统属性:mail.smtp.host = "+hostName);
System.out.println("设置系统属性:mail.smtp.host = "+hostName);
 if(props == null)props = System.getProperties(); //获得系统属性对象
if(props == null)props = System.getProperties(); //获得系统属性对象

 props.put("mail.smtp.host",hostName); //设置SMTP主机
props.put("mail.smtp.host",hostName); //设置SMTP主机
 }
}


 /**
/**
 * @return boolean
* @return boolean
 */
*/
 public boolean createMimeMessage()
public boolean createMimeMessage()
 {
{
 try{
try{
 System.out.println("准备获取邮件会话对象!");
System.out.println("准备获取邮件会话对象!");
 session = Session.getDefaultInstance(props,null); //获得邮件会话对象
session = Session.getDefaultInstance(props,null); //获得邮件会话对象
 }
}
 catch(Exception e){
catch(Exception e){
 System.err.println("获取邮件会话对象时发生错误!"+e);
System.err.println("获取邮件会话对象时发生错误!"+e);
 return false;
return false;
 }
}

 System.out.println("准备创建MIME邮件对象!");
System.out.println("准备创建MIME邮件对象!");
 try{
try{
 mimeMsg = new MimeMessage(session); //创建MIME邮件对象
mimeMsg = new MimeMessage(session); //创建MIME邮件对象
 mp = new MimeMultipart();
mp = new MimeMultipart();

 return true;
return true;
 }
}
 catch(Exception e){
catch(Exception e){
 System.err.println("创建MIME邮件对象失败!"+e);
System.err.println("创建MIME邮件对象失败!"+e);
 return false;
return false;
 }
}
 }
}



 /**
/**
 * @param need boolean
* @param need boolean
 */
*/
 public void setNeedAuth(boolean need) {
public void setNeedAuth(boolean need) {
 System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);
System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);
 if(props == null)props = System.getProperties();
if(props == null)props = System.getProperties();

 if(need){
if(need){
 props.put("mail.smtp.auth","true");
props.put("mail.smtp.auth","true");
 }else{
}else{
 props.put("mail.smtp.auth","false");
props.put("mail.smtp.auth","false");
 }
}
 }
}



 /**
/**
 * @param name String
* @param name String
 * @param pass String
* @param pass String
 */
*/
 public void setNamePass(String name,String pass) {
public void setNamePass(String name,String pass) {
 username = name;
username = name;
 password = pass;
password = pass;
 }
}


 /**
/**
 * @param mailSubject String
* @param mailSubject String
 * @return boolean
* @return boolean
 */
*/
 public boolean setSubject(String mailSubject) {
public boolean setSubject(String mailSubject) {
 System.out.println("设置邮件主题!");
System.out.println("设置邮件主题!");
 try{
try{
 mimeMsg.setSubject(mailSubject);
mimeMsg.setSubject(mailSubject);
 return true;
return true;
 }
}
 catch(Exception e) {
catch(Exception e) {
 System.err.println("设置邮件主题发生错误!");
System.err.println("设置邮件主题发生错误!");
 return false;
return false;
 }
}
 }
}



 /**
/**
 * @param mailBody String
* @param mailBody String
 */
*/
 public boolean setBody(String mailBody) {
public boolean setBody(String mailBody) {
 try{
try{
 BodyPart bp = new MimeBodyPart();
BodyPart bp = new MimeBodyPart();
 bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+mailBody,"text/html;charset=GB2312");
bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+mailBody,"text/html;charset=GB2312");
 mp.addBodyPart(bp);
mp.addBodyPart(bp);

 return true;
return true;
 }
}
 catch(Exception e){
catch(Exception e){
 System.err.println("设置邮件正文时发生错误!"+e);
System.err.println("设置邮件正文时发生错误!"+e);
 return false;
return false;
 }
}
 }
}


 /**
/**
 * @param name String
* @param name String
 * @param pass String
* @param pass String
 */
*/
 public boolean addFileAffix(String filename) {
public boolean addFileAffix(String filename) {

 System.out.println("增加邮件附件:"+filename);
System.out.println("增加邮件附件:"+filename);

 try{
try{
 BodyPart bp = new MimeBodyPart();
BodyPart bp = new MimeBodyPart();
 FileDataSource fileds = new FileDataSource(filename);
FileDataSource fileds = new FileDataSource(filename);
 bp.setDataHandler(new DataHandler(fileds));
bp.setDataHandler(new DataHandler(fileds));
 bp.setFileName(fileds.getName());
bp.setFileName(fileds.getName());

 mp.addBodyPart(bp);
mp.addBodyPart(bp);

 return true;
return true;
 }
}
 catch(Exception e){
catch(Exception e){
 System.err.println("增加邮件附件:"+filename+"发生错误!"+e);
System.err.println("增加邮件附件:"+filename+"发生错误!"+e);
 return false;
return false;
 }
}
 }
}



 /**
/**
 * @param name String
* @param name String
 * @param pass String
* @param pass String
 */
*/
 public boolean setFrom(String from) {
public boolean setFrom(String from) {
 System.out.println("设置发信人!");
System.out.println("设置发信人!");
 try{
try{
 mimeMsg.setFrom(new InternetAddress(from)); //设置发信人
mimeMsg.setFrom(new InternetAddress(from)); //设置发信人
 return true;
return true;
 }
}
 catch(Exception e)
catch(Exception e)
 { return false; }
{ return false; }
 }
}


 /**
/**
 * @param name String
* @param name String
 * @param pass String
* @param pass String
 */
*/
 public boolean setTo(String to){
public boolean setTo(String to){
 if(to == null)return false;
if(to == null)return false;

 try{
try{
 mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
 return true;
return true;
 }
}
 catch(Exception e)
catch(Exception e)
 { return false; }
{ return false; }

 }
}

 /**
/**
 * @param name String
* @param name String
 * @param pass String
* @param pass String
 */
*/
 public boolean setCopyTo(String copyto)
public boolean setCopyTo(String copyto)
 {
{
 if(copyto == null)return false;
if(copyto == null)return false;
 try{
try{
 mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));
mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));
 return true;
return true;
 }
}
 catch(Exception e)
catch(Exception e)
 { return false; }
{ return false; }
 }
}


 /**
/**
 * @param name String
* @param name String
 * @param pass String
* @param pass String
 */
*/
 public boolean sendout()
public boolean sendout()
 {
{
 try{
try{
 mimeMsg.setContent(mp);
mimeMsg.setContent(mp);
 mimeMsg.saveChanges();
mimeMsg.saveChanges();
 System.out.println("正在发送邮件
System.out.println("正在发送邮件 .");
.");

 Session mailSession = Session.getInstance(props,null);
Session mailSession = Session.getInstance(props,null);
 Transport transport = mailSession.getTransport("smtp");
Transport transport = mailSession.getTransport("smtp");
 transport.connect((String)props.get("mail.smtp.host"),username,password);
transport.connect((String)props.get("mail.smtp.host"),username,password);
 transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
 //transport.send(mimeMsg);
//transport.send(mimeMsg);

 System.out.println("发送邮件成功!");
System.out.println("发送邮件成功!");
 transport.close();
transport.close();

 return true;
return true;
 }
}
 catch(Exception e)
catch(Exception e)
 {
{
 System.err.println("邮件发送失败!"+e);
System.err.println("邮件发送失败!"+e);
 return false;
return false;
 }
}
 }
}


 /**
/**
 * Just do it as this
* Just do it as this
 */
*/
 public static void main(String[] args) {
public static void main(String[] args) {

 String mailbody = "<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+
String mailbody = "<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+
 "<div align=center><a href=http://www.csdn.net> csdn </a></div>";
"<div align=center><a href=http://www.csdn.net> csdn </a></div>";

 sendMail themail = new sendMail("smtp.msn.com");
sendMail themail = new sendMail("smtp.msn.com");
 themail.setNeedAuth(true);
themail.setNeedAuth(true);

 if(themail.setSubject("标题") == false) return;
if(themail.setSubject("标题") == false) return;
 if(themail.setBody(mailbody) == false) return;
if(themail.setBody(mailbody) == false) return;
 if(themail.setTo("gates@msn.com") == false) return;
if(themail.setTo("gates@msn.com") == false) return;
 if(themail.setFrom("bill@msn.com") == false) return;
if(themail.setFrom("bill@msn.com") == false) return;
 if(themail.addFileAffix("c:\\boot.ini") == false) return;
if(themail.addFileAffix("c:\\boot.ini") == false) return;
 themail.setNamePass("user","password");
themail.setNamePass("user","password");

 if(themail.sendout() == false) return;
if(themail.sendout() == false) return; 
 }
}
 }
}

我是按照weblogic公司的帮助文档做的。不知还要配置什么?
1. 通过console方式创建一个MailSession. 
2. 在Configuration栏中输入以下参数: 
Name: MyMailSession 
JNDIName: MyMailSession 
Properties 
mail.smtp.host=winqiu
3. 然后在Targets栏中将mailsession加入你的Target Servers. 
4. 这样你的mailsession就创建成功了. 
5. 在程序中调用的方法如下: 
 import java.util.*;
import java.util.*;
 import javax.activation.*;
import javax.activation.*;
 import javax.mail.Session;
import javax.mail.Session;
 import javax.mail.*;
import javax.mail.*;
 import javax.mail.internet.*;
import javax.mail.internet.*;
 import javax.naming.*;
import javax.naming.*;

 public class SendMail {
public class SendMail {
 Context ic = null;
  Context ic = null;

 public SendMail() {
  public SendMail() {
 }
  }

 public void send() {
  public void send() {
 
    
 //使用JNDI查询Mail Session,
      //使用JNDI查询Mail Session,
 try
      try
 {
      {
 
      
 Hashtable ht = new Hashtable();
        Hashtable ht = new Hashtable();
 ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
         ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
 ht.put(Context.PROVIDER_URL, "t3://winqiu:7001");
         ht.put(Context.PROVIDER_URL, "t3://winqiu:7001");
 ic = new InitialContext(ht);
         ic = new InitialContext(ht);
 Session session = (Session) ic.lookup("myMailSession");
          Session session = (Session) ic.lookup("myMailSession");     

 //设置属性,然后创建Session实例
      //设置属性,然后创建Session实例
 Properties props = new Properties();
      Properties props = new Properties();
 props.put("mail.transport.protocol", "smtp");
      props.put("mail.transport.protocol", "smtp");
 props.put("mail.smtp.host", "winqiu");
      props.put("mail.smtp.host", "winqiu");
 InternetAddress emailAddress = new InternetAddress(
      InternetAddress emailAddress = new InternetAddress(
 "win_qiu@yahoo.com.cn");
          "win_qiu@yahoo.com.cn");
 props.put("mail.from", emailAddress);
      props.put("mail.from", emailAddress);
 Session session2 =session.getInstance(props);
      Session session2 =session.getInstance(props);

 //创建消息
      //创建消息
 Message msg = new MimeMessage(session2);
      Message msg = new MimeMessage(session2);
 msg.setFrom();
      msg.setFrom();
 String to = "win_qiu@hotmail.com.cn";
      String to = "win_qiu@hotmail.com.cn";
 msg.setRecipients(Message.RecipientType.TO,
      msg.setRecipients(Message.RecipientType.TO,
 InternetAddress.parse(to, false));
                        InternetAddress.parse(to, false));
 String subject = "hello";
      String subject = "hello";
 msg.setSubject(subject);
      msg.setSubject(subject);
 msg.setSentDate(new Date());
      msg.setSentDate(new Date());
 // 将消息内容存放到MimeBodyPart对象中,然后把MimeBodyPart对象
    // 将消息内容存放到MimeBodyPart对象中,然后把MimeBodyPart对象
 //存入Multipart对象中,最后,把代表附件的Multipart对象加入待
    //存入Multipart对象中,最后,把代表附件的Multipart对象加入待
 //发送的消息中
    //发送的消息中
 MimeBodyPart mbp = new MimeBodyPart();
      MimeBodyPart mbp = new MimeBodyPart();
 String messageTxt = "first mail ";
      String messageTxt = "first mail ";
 mbp.setText(messageTxt);
      mbp.setText(messageTxt);
 
      
 Multipart mp = new MimeMultipart();
      Multipart mp = new MimeMultipart();
 mp.addBodyPart(mbp);
      mp.addBodyPart(mbp);
 msg.setContent(mp);
      msg.setContent(mp);
 
      
 msg.saveChanges();
      msg.saveChanges();
 //发送消息
      //发送消息
 Transport.send(msg);
      Transport.send(msg);
 }
    }
 catch (NamingException e) {
    catch (NamingException e) {
 e.printStackTrace();
      e.printStackTrace();

 }
    }
 catch (MessagingException e) {
    catch (MessagingException e) {
 e.printStackTrace();
      e.printStackTrace();

 }
    }

 }
  }
 public static void main(String args[])
  public static void main(String args[])
 {
  {
 SendMail sendMail=new SendMail();
    SendMail sendMail=new SendMail();
 sendMail.send();
    sendMail.send();
 System.out.println("send ok");
    System.out.println("send ok");
 }
  }
 }
}


 但是我的发送邮件时候就出现这样的异常:
但是我的发送邮件时候就出现这样的异常:
 javax.naming.ConfigurationException.  Root exception is java.rmi.MarshalException: error marshalling return; nested exception is:
javax.naming.ConfigurationException.  Root exception is java.rmi.MarshalException: error marshalling return; nested exception is: 
 java.io.NotSerializableException: javax.mail.Session
java.io.NotSerializableException: javax.mail.Session

 at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)
at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)

 at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:284)
at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:284)

 at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)
at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)

 at weblogic.jndi.internal.ServerNamingNode_812_WLStub.lookup(Unknown Source)
at weblogic.jndi.internal.ServerNamingNode_812_WLStub.lookup(Unknown Source)

 at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:343)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:343)

 at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:336)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:336)

 at javax.naming.InitialContext.lookup(InitialContext.java:347)
at javax.naming.InitialContext.lookup(InitialContext.java:347)

 at javamail.SendMail.send(SendMail.java:42)
at javamail.SendMail.send(SendMail.java:42)

 at javamail.SendMail.main(SendMail.java:94)
at javamail.SendMail.main(SendMail.java:94)

 Caused by: java.io.NotSerializableException: javax.mail.Session
Caused by: java.io.NotSerializableException: javax.mail.Session

 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)

 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)

 at weblogic.common.internal.ChunkedObjectOutputStream.writeObject(ChunkedObjectOutputStream.java:116)
at weblogic.common.internal.ChunkedObjectOutputStream.writeObject(ChunkedObjectOutputStream.java:116)

 at weblogic.rjvm.MsgAbbrevOutputStream.writeObject(MsgAbbrevOutputStream.java:93)
at weblogic.rjvm.MsgAbbrevOutputStream.writeObject(MsgAbbrevOutputStream.java:93)

 at weblogic.jndi.internal.RootNamingNode_WLSkel.invoke(Unknown Source)
at weblogic.jndi.internal.RootNamingNode_WLSkel.invoke(Unknown Source)

 at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:477)
at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:477)

 at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)
at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)

 at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:420)
at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:420)

 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)

 at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)

 at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:415)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:415)

 at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)
at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)

 at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)

 at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
