JSP虚拟主机,jsp空间,java空间,java虚拟空间JSP虚拟主机,jsp空间,java空间,java虚拟空间

用JavaMail写的一个电子邮件发送程序



作者:    文章来源:
发布日期:2007年04月18日
    最近,自己开始学习JavaMail API,为了练习,于是写了一个发送邮件的程序,希望各位JAVA爱好者,能提一些宝贵的意见,下面就是我写的示例程序代码:
    
 /**
  *=========================================================
  * @Programing Name: SendMail.java
  * @Author:          Wang weiPing
  * @Program Date:    2004-02-02
  * @E-Mail:          wangwp@mailer.com.cn
  * @MobilePhone:     13810862095
  * @Address:         北京市海淀区知春路23号863软件园903室
  ********************************************
  *include classes: *SendMail.class       * 
  *                 *MailAuthenticator.class *
  *                 *MailSendHtml.class      *
  *                 *MailSendText.class      *
  ********************************************
  *=========================================================
  */

  1. package chundiwebmail;
  2. import java.util.Properties;
  3. import java.util.Date;
  4. import java.util.ArrayList;
  5. import javax.mail.*;
  6. import javax.mail.internet.*;
  7. import javax.activation.*;
  8. abstract class SendMail{
  9.     
  10.     protected BodyPart messageBodyPart = null;
  11.     protected Multipart multipart = null;
  12.     protected MimeMessage mailMessage = null;
  13.     protected Session mailSession = null;
  14.     protected Properties mailProperties = System.getProperties();
  15.     protected InternetAddress mailFromAddress = null;
  16.     protected InternetAddress mailToAddress = null;
  17.     protected MailAuthenticator authenticator = null;
  18.     protected String mailSubject ="";
  19.     protected Date mailSendDate = null;
  20.     
  21.     public SendMail(String smtpHost,String username,String password){
  22.         mailProperties.put("mail.smtp.host",smtpHost);
  23.         mailProperties.put("mail.smtp.auth","true"); //设置smtp认证,很关键的一句
  24.         authenticator = new MailAuthenticator(username,password);
  25.         mailSession = Session.getDefaultInstance(mailProperties,authenticator);
  26.         mailMessage = new MimeMessage(mailSession);
  27.         messageBodyPart = new MimeBodyPart();
  28.     }
  29.     //设置邮件主题
  30.     public void setSubject(String mailSubject)throws MessagingException{
  31.         this.mailSubject = mailSubject;
  32.         mailMessage.setSubject(mailSubject);
  33.     }
  34.     //所有子类都需要实现的抽象方法,为了支持不同的邮件类型
  35.     protected abstract void setMailContent(String mailContent)throws MessagingException;
  36.     
  37.     //设置邮件发送日期
  38.     public void setSendDate(Date sendDate)throws MessagingException{
  39.         this.mailSendDate = sendDate;
  40.         mailMessage.setSentDate(sendDate);
  41.     }
  42.     //设置邮件发送附件
  43.     public void setAttachments(String attachmentName)throws MessagingException{
  44.         messageBodyPart = new MimeBodyPart();
  45.         DataSource source = new FileDataSource(attachmentName);
  46.         messageBodyPart.setDataHandler(new DataHandler(source));
  47.         int index = attachmentName.lastIndexOf('');
  48.         String attachmentRealName = attachmentName.substring(index+1);
  49.         messageBodyPart.setFileName(attachmentRealName);
  50.         multipart.addBodyPart(messageBodyPart);
  51.     }
  52.     
  53.     //设置发件人地址
  54.     public void setMailFrom(String mailFrom)throws MessagingException{
  55.         mailFromAddress = new InternetAddress(mailFrom);
  56.         mailMessage.setFrom(mailFromAddress);
  57.     }
  58.     
  59.     //设置收件人地址,收件人类型为to,cc,bcc(大小写不限)
  60.     public void setMailTo(String[] mailTo,String mailType)throws Exception{
  61.         for(int i=0;i<mailTo.length;i++){
  62.             mailToAddress = new InternetAddress(mailTo[i]);
  63.             if(mailType.equalsIgnoreCase("to")){
  64.                 mailMessage.addRecipient(Message.RecipientType.TO,mailToAddress);
  65.             }
  66.             else if(mailType.equalsIgnoreCase("cc")){
  67.                 mailMessage.addRecipient(Message.RecipientType.CC,mailToAddress);
  68.             }
  69.             else if(mailType.equalsIgnoreCase("bcc")){
  70.                 mailMessage.addRecipient(Message.RecipientType.BCC,mailToAddress);
  71.             }
  72.             else{
  73.                 throw new Exception("Unknown mailType: "+mailType+"!");
  74.             }
  75.         }
  76.     }
  77.     
  78.     //开始投递邮件
  79.     public void sendMail()throws MessagingException,SendFailedException{
  80.         if(mailToAddress == null){
  81.             System.out.println("请你必须你填写收件人地址!");
  82.             System.exit(1);
  83.         }
  84.         else{
  85.             mailMessage.setContent(multipart);
  86.             System.out.println("正在发送邮件,请稍候.......");
  87.             Transport.send(mailMessage);
  88.             System.out.println("恭喜你,邮件已经成功发送!");
  89.         }
  90.     }
  91. }
  92. //现在的大部分的邮件服务器都要求有身份验证,所以需要此类实现验证功能
  93. class MailAuthenticator extends Authenticator{
  94.     private String username = null;
  95.     private String userpasswd = null;
  96.     public MailAuthenticator(){}
  97.     public MailAuthenticator(String username,String userpasswd){
  98.         this.username = username;
  99.         this.userpasswd = userpasswd;
  100.     }
  101.     
  102.     public void setUserName(String username){
  103.         this.username = username;
  104.     }
  105.     public void setPassword(String password){
  106.         this.userpasswd = password;
  107.     }
  108.     public PasswordAuthentication getPasswordAuthentication(){
  109.         return new PasswordAuthentication(username,userpasswd);
  110.     }
  111. }
  112. //为了使此邮件发送程序能够支持可扩展性,把发送邮件的类型放到子类中来,
  113. //以便支持更多的邮件类型,比如语音邮件,视频邮件等......
  114. //1.发送纯文本文件的的子类MailSendText.class
  115. class MailSendText extends SendMail{
  116.     public MailSendText(String smtpHost,String username,String password){
  117.         super(smtpHost,username,password);
  118.         multipart = new MimeMultipart();
  119.     }
  120.     public void setMailContent(String mailContent)throws MessagingException{
  121.         messageBodyPart.setText(mailContent);
  122.         multipart.addBodyPart(messageBodyPart);
  123.     }
  124. }
  125. //2.发送html格式的子类MailSendHtml.class
  126. class MailSendHtml extends SendMail{
  127.     private ArrayList arrayList1 = new ArrayList();
  128.     private ArrayList arrayList2 = new ArrayList();
  129.     public MailSendHtml(String smtpHost,String username,String password){
  130.         super(smtpHost,username,password);
  131.         multipart = new MimeMultipart("related");
  132.     }
  133.     public void setMailContent(String mailContent)throws MessagingException{
  134.         String htmlContent = getContent("<img src=",mailContent);
  135.         System.out.println(htmlContent);//1
  136.         messageBodyPart.setContent(htmlContent,"text/html");
  137.         multipart.addBodyPart(messageBodyPart);
  138.         //调用处理html文件中的图片方法
  139.         processHtmlImage(mailContent);
  140.     }
  141.     //处理html页面上的图片方法如下:
  142.     private void processHtmlImage(String mailContent)throws MessagingException{
  143.          for(int i=0;i<arrayList1.size();i++){
  144.              messageBodyPart = new MimeBodyPart();
  145.              DataSource source = new FileDataSource((String)arrayList1.get(i));
  146.              messageBodyPart.setDataHandler(new DataHandler(source));
  147.              String contentId = "<"+(String)arrayList2.get(i)+">";
  148.              System.out.println(contentId);
  149.              messageBodyPart.setHeader("Content-ID",contentId);
  150.              messageBodyPart.setFileName((String)arrayList1.get(i));
  151.              multipart.addBodyPart(messageBodyPart);
  152.          }
  153.     }
  154.     //处理要发送的html文件,主要是针对html文件中的图片
  155.     private String getContent(String searchString,String mailContent){
  156.         String afterReplaceStr = "";
  157.         for(int i=0;i<mailContent.length();i++){
  158.             for(int j=i+1;j<mailContent.length();j++){
  159.                 String searResult = mailContent.substring(i,j);
  160.                 if(searResult.equalsIgnoreCase(searchString)){
  161.                     String subString = mailContent.substring(j);
  162.                     int flagIndex = subString.indexOf('>');
  163.                     String replaceStr = subString.substring(1,flagIndex-1);
  164.                     if(replaceStr.indexOf("http://") != -1){
  165.                         System.out.println(replaceStr);
  166.                         System.out.println("不需要处理图片!");
  167.                     }
  168.                     else{
  169.                         arrayList1.add(replaceStr);
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.         //在html文件中用"cid:"+Content-ID来替换原来的图片链接
  175.         for(int m=0;m<arrayList1.size();m++){
  176.             arrayList2.add(createRandomStr());
  177.             String addString = "cid:"+(String)arrayList2.get(m);
  178.             afterReplaceStr = mailContent.replaceAll((String)arrayList1.get(m),addString);
  179.         }
  180.         return afterReplaceStr;
  181.     }
  182.     //产生一个随机字符串,为了给图片设定Content-ID值
  183.     private String createRandomStr(){
  184.         char []randomChar = new char[8];
  185.         for(int i=0;i<8;i++){
  186.             randomChar[i]=(char)(Math.random()*26+'a');
  187.         }
  188.         String replaceStr = new String(randomChar);
  189.         return replaceStr;
  190.     }
  191. }
  192. /*=============================================================================
  193. 下面是此电子邮件发送程序的简单测试程序:
  194.  */
  195. package chundiwebmail;
  196. import java.util.Date;
  197. public class SendMailTest{
  198.     public static void main(String args[]){
  199.         String []toAddress = {"wwp_1124@yahoo.com.cn"};
  200.         SendMail sendmail = new MailSendHtml("smtp.mail.yahoo.com.cn","wwp_1124","3061643");
  201.         try{
  202.             sendmail.setSubject("HelloWorld");
  203.             sendmail.setSendDate(new Date());
  204.             //String plainText = "Welcome to use this Mail-Send program!";
  205.             String htmlText = "<H1>HelloWorld</H1>" +
  206.                     "<img src="image.jpg">"+
  207.                     "<img src="http://www.yahoo.com.cn/image1.jpg">";
  208.             //sendmail.setMailContent(plainText);
  209.             sendmail.setMailContent(htmlText);
  210.             //sendmail.setAttachments("D:wwpdevattach.jsp");
  211.             sendmail.setMailFrom("wangwp@mailer.com.cn");
  212.             sendmail.setMailTo(toAddress,"to");
  213.             sendmail.setMailTo(toAddress,"cc");
  214.             sendmail.sendMail();
  215.         }
  216.         catch(Exception ex){ ex.printStackTrace();}
  217.     }
  218. }
  219. =============================================================================
  220.     [/pre]

以上就是我在学习JavaMail 时所写的练习程序,我会逐步的完善此程序代码,以便使他成
为一个完整的Java Beans,可以被其它应用程序直接调用来发送邮件。希望文章发表之后大
家能提一些宝贵的意见,以便下一个版本能够更加完善,实用。
Copyright © 2002-2012 JSPCN.net. All rights reserved.
JSP中文网    备案号:粤ICP备09171188号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号