java mail发送邮件群发 带附件的发送(源代码+详细目录结构)java Email 发送实例

来源:互联网 发布:mac excel 行序号 编辑:程序博客网 时间:2024/05/19 18:38

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


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


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



需要自己准备以下两个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("qq", "smtp.qq.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.setUsername("809044093@qq.com"); //用户名  senderInfo.setPassword("809044093");      //密码(这里写你自己邮箱的密码 ^_^)  senderInfo.setToAddress("245173677@qq.com,809044093@qq.com");//接收者(如果是多个邮箱 每个邮箱之间用,分割)  senderInfo.setSubject("这是群发邮件主题"); //主题  senderInfo.setContent("<a href='http://blog.csdn.net/prefectjava'>点击此处查看更多内容</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); }

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



3 0
原创粉丝点击