项目用到Java程序发送Email邮件从网上查了一些资料自己整理一个Demo 供大家参考


此邮件实现功能: 单发、群发邮件,可以带多个附件。欢迎拍砖


1、需要用到的jar包和项目的目录结构




java邮件怎么发送多个附件 java邮件群发_java邮件怎么发送多个附件




需要自己准备以下两个jar,google自己搜地址

activation.jar

mail.jar


Code代码实现

-----------------------------------------------------------发送邮件需要的基本信息-----------------------------------------------------



/**
 * java邮件测试
 * @author Administrator
 *
 */
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Vector;


import javax.mail.internet.MimeUtility;


/**
 * 发送邮件需要的基本信息
 * 
 */
public class MailTest {
 
 private String mailServerHost;      //发送邮件的服务器
 private String mailServerPort="25";    //发送邮件的服务器的端口
 private String fromAddress;            //发送者地址
 private String toAddress;              //接收者地址
 private String username;         //发送者用户名
 private String password;         //发送者密码
 private boolean validate=true;      //是否需要身份验证
 private String subject;           //邮件主题
 private String content;          //邮件内容
 private Map<String, String> mailType;        //邮箱类型
 private String  filename = "";// 附件文件名
 private Vector file = new Vector();// 附件文件集合
 /**
  * 得到邮件会话属性
  *
  */
 public Properties getProperties(){
  Properties p = new Properties();
  p.put("mail.smtp.host", this.mailServerHost);
  p.put("mail.smtp.port", this.mailServerPort);
  p.put("mail.smtp.auth", validate?"true":"false");
  return p;
 }
 
 public String getMailServerHost() {
  return mailServerHost;
 }
 public void setMailServerHost(String mailServerHost) {
  this.mailServerHost = mailServerHost;
 }
 public String getMailServerPort() {
  return mailServerPort;
 }
 public void setMailServerPort(String mailServerPort) {
  this.mailServerPort = mailServerPort;
 }
 public String getFromAddress() {
  return fromAddress;
 }
 public void setFromAddress(String fromAddress) {
  this.fromAddress = fromAddress;
 }
 public String getToAddress() {
  return toAddress;
 }
 public void setToAddress(String toAddress) {
  this.toAddress = toAddress;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
  this.fromAddress=username;
  if(username!=null&&username.length()>0){
   String fromEmailExt=username.substring(username.lastIndexOf("@")+1,username.lastIndexOf("."));
   this.mailServerHost=getMailType().get(fromEmailExt);
  }
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public boolean isValidate() {
  return validate;
 }
 public void setValidate(boolean validate) {
  this.validate = validate;
 }
 
 public String getSubject() {
  return subject;
 }


 public void setSubject(String subject) {
  this.subject = subject;
 }


 public String getContent() {
  return content;
 }
 public void setContent(String content) {
  this.content = content;
 }


 public Map<String, String> getMailType() {
  mailType=new HashMap<String, String>();
  mailType.put("163","smtp.163.com");
  mailType.put("139","smtp.139.com");
  mailType.put("126","smtp.126.com");
mailType.put("sohu", "smtp.sohu.com");
  mailType.put("live","smtp.live.cn");
  mailType.put("msn","smtp.msn.com");
  mailType.put("kum", "mail.kum.net.cn");
  mailType.put("hotmail","smtp.hotmail.cn");
  return mailType;
 }


 public void setMailType(Map<String, String> mailType) {
  this.mailType = mailType;
 }
 
 public void attachfile(String fname) {  
     file.addElement(fname);  
 } 
 
 
 
 public Vector getFile() {
	return file;
}


public void setFile(Vector file) {
	this.file = file;
}


/** 
  * 
  * 方法说明:把主题转换为中文
  * 输入参数:String strText
  * 返回类型: 
  */  
 public String transferChinese(String strText) {  
     try {  
         strText = MimeUtility.encodeText(new String(strText.getBytes(),  
                 "GB2312"), "GB2312", "B");  
     } catch (Exception e) {  
         e.printStackTrace();  
     }  
     return strText;  
 }


public String getFilename() {
	return filename;
}


public void setFilename(String filename) {
	this.filename = filename;
}  


 
 
 
 
}


------------------------------发邮件时的身份验证器-------------------------------


import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;


/**
 * 发邮件时的身份验证器
 */
public class CardId extends Authenticator{
 
 String userName = null;
 String password = null;
 
 public CardId(String userName, String password) {
  this.userName = userName;
  this.password = password;
 }
 @Override
 protected PasswordAuthentication getPasswordAuthentication() {
  return new PasswordAuthentication(userName, password);
 }
 
}



----------------------- 邮件发送器类,也是主体部分

---------------------------


import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;


import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;




/**
 * 邮件发送器
 * 
 */
public class MailContent{
 
 /**
  * 根据邮件会话属性和密码验证器构造一个发送邮件的session    
  * @return
  */
 protected  static Session getSession(MailTest MailTest){
  if(MailTest == null){
   return null;
  }
  CardId authenticator = null;
  Properties pro = MailTest.getProperties();
  if(MailTest.isValidate()){
   authenticator = new CardId(MailTest.getUsername(),MailTest.getPassword());
  }
  return Session.getDefaultInstance(pro, authenticator);
 }
 
 /**
  * 发送文本格式邮件
  * @return
  */
 public static boolean sendTextMail(MailTest MailTest){
  try {
        
         //得到session
         Session mailSession = getSession(MailTest); 


   //根据session创建一个邮件消息
   Message mailMessage=new MimeMessage(mailSession);
   
   //创建邮件发送者的地址
   Address fromAddress=new InternetAddress(MailTest.getFromAddress());
 //设置邮件发送者的地址
   mailMessage.setFrom(fromAddress);
   //1、创建邮件接收者的地址(只能给一个用户发送邮件)
  //  Address toAddress=new InternetAddress(MailTest.getToAddress());
   //设置邮件接收者地址
   //mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
   
   
   //2、创建邮件接收者的地址(可以给多个用户同时发送邮件 不同接受者之间用,隔开)
   mailMessage.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(MailTest.getToAddress())) ;
     
   //设置邮件的主题(转成中文)
   mailMessage.setSubject(MailTest.getSubject());
// mailMessage.setSubject(MailTest.transferChinese(MailTest.getSubject()));
   //设置邮件的发送内容
   mailMessage.setText(MailTest.getContent());
   
   //设置发送邮件的时间
   mailMessage.setSentDate(new Date());
   
   //发送邮件
   Transport.send(mailMessage);
   
   return true;
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 /**
  * 发送html格式邮件
  * @return
  */
 public static boolean sendHtmlMail(MailTest MailTest) {
  try {
   //得到session
   Session mailSession = getSession(MailTest);


   //根据session创建一个邮件消息
   Message mailMessage = new MimeMessage(mailSession);


   //创建邮件发送者的地址
   Address fromAddress=new InternetAddress(MailTest.getFromAddress());
 //设置邮件发送者的地址
   mailMessage.setFrom(fromAddress);
//   //1、创建邮件接收者的地址
//   Address toAddress=new InternetAddress(MailTest.getToAddress());
//   //设置邮件接收者地址(可以给一个用户发送邮件)
//   mailMessage.setRecipient(Message.RecipientType.TO, toAddress);
   
   //2、创建邮件接收者的地址(可以给多个用户同时发送邮件 不同接受者之间用,隔开)
   mailMessage.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(MailTest.getToAddress())) ;
     
   //设置邮件的主题(转成中文)
   mailMessage.setSubject(MailTest.getSubject());
//   mailMessage.setSubject(MailTest.transferChinese(MailTest.getSubject()));
   //设置邮件消息发送的时间
   mailMessage.setSentDate(new Date());


   //MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
   Multipart mainPart = new MimeMultipart();


   //创建一个包含HTML内容的MimeBodyPart
   BodyPart html = new MimeBodyPart();


   //设置HTML内容
   html.setContent(MailTest.getContent(), "text/html; charset=UTF-8");
   
   //将内容添加到容器对象中
   mainPart.addBodyPart(html);
   
   // 向Multipart添加附件  
   Vector file=MailTest.getFile();
   String filename=MailTest.getFilename();
   Enumeration efile = file.elements();  
   while (efile.hasMoreElements()) {  


       MimeBodyPart mbpFile = new MimeBodyPart();  
       filename = efile.nextElement().toString();  
       FileDataSource fds = new FileDataSource(filename);  
       mbpFile.setDataHandler(new DataHandler(fds));  
      //这个方法可以解决附件乱码问题   
       String filename1= new String(fds.getName().getBytes(),"ISO-8859-1");  


        mbpFile.setFileName(filename1);  
       // 向MimeMessage添加(Multipart代表附件)  
       mainPart.addBodyPart(mbpFile);  


   }  
   file.removeAllElements(); 
   
   //将MiniMultipart对象设置为邮件内容
   mailMessage.setContent(mainPart);


   //发送邮件
   Transport.send(mailMessage);
   
   return true;
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
}



--------------------------------------- 测试

-----------------------------------------



/**
 * 测试类
 *
 */
public class SendMessage{
	public  void test() {
		MailTest senderInfo=new MailTest();
		  senderInfo.setSubject("这是群发邮件主题"); //主题
		  senderInfo.setContent("<a href=''>点击此处查看更多内容</a>"); //内容
		  
		  senderInfo.attachfile("d:\\1.txt");
		  senderInfo.attachfile("d:\\index.html");//如果还有附件继续累加即可,格式不限制
	      //发送(HTML格式的)
		  MailContent.sendHtmlMail(senderInfo);
		  //发送纯文本格式
//		  MailContent.sendTextMail(senderInfo);
		  
	}
	
 public static void main(String[] args)  {
 
     new SendMessage().test();
 }
}

以上为具体代码实现。


PS:程序时发现了以下两个些错误,贴出来跟大家分享分享

希望对大家有帮助。 



错误一: 


Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream  

解决方法:到D:\MyEclipse 6.5  


\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806  


\data\libraryset\EE_5目录下找到javaee.jar删除其中到mail文件夹。




错误二: 


Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream

解决方法: 


下载mail.jar和activation.jar文件加入到工程中。 

错误三:

如果出现 以下异常 

javax.mail.AuthenticationFailedException

检查是否邮箱的用户名 、密码错误。



@Override
 protected PasswordAuthentication getPasswordAuthentication() {
  return new PasswordAuthentication(userName, password);
 }

★这个身份验证的是重写的父类的方法,方法名不要自己定义 否则出错