最近,自己开始学习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 * ******************************************** *========================================================= */
- package chundiwebmail;
- import java.util.Properties;
- import java.util.Date;
- import java.util.ArrayList;
- import javax.mail.*;
- import javax.mail.internet.*;
- import javax.activation.*;
- abstract class SendMail{
-
- protected BodyPart messageBodyPart = null;
- protected Multipart multipart = null;
- protected MimeMessage mailMessage = null;
- protected Session mailSession = null;
- protected Properties mailProperties = System.getProperties();
- protected InternetAddress mailFromAddress = null;
- protected InternetAddress mailToAddress = null;
- protected MailAuthenticator authenticator = null;
- protected String mailSubject ="";
- protected Date mailSendDate = null;
-
- public SendMail(String smtpHost,String username,String password){
- mailProperties.put("mail.smtp.host",smtpHost);
- mailProperties.put("mail.smtp.auth","true"); //设置smtp认证,很关键的一句
- authenticator = new MailAuthenticator(username,password);
- mailSession = Session.getDefaultInstance(mailProperties,authenticator);
- mailMessage = new MimeMessage(mailSession);
- messageBodyPart = new MimeBodyPart();
- }
- //设置邮件主题
- public void setSubject(String mailSubject)throws MessagingException{
- this.mailSubject = mailSubject;
- mailMessage.setSubject(mailSubject);
- }
- //所有子类都需要实现的抽象方法,为了支持不同的邮件类型
- protected abstract void setMailContent(String mailContent)throws MessagingException;
-
- //设置邮件发送日期
- public void setSendDate(Date sendDate)throws MessagingException{
- this.mailSendDate = sendDate;
- mailMessage.setSentDate(sendDate);
- }
- //设置邮件发送附件
- public void setAttachments(String attachmentName)throws MessagingException{
- messageBodyPart = new MimeBodyPart();
- DataSource source = new FileDataSource(attachmentName);
- messageBodyPart.setDataHandler(new DataHandler(source));
- int index = attachmentName.lastIndexOf('');
- String attachmentRealName = attachmentName.substring(index+1);
- messageBodyPart.setFileName(attachmentRealName);
- multipart.addBodyPart(messageBodyPart);
- }
-
- //设置发件人地址
- public void setMailFrom(String mailFrom)throws MessagingException{
- mailFromAddress = new InternetAddress(mailFrom);
- mailMessage.setFrom(mailFromAddress);
- }
-
- //设置收件人地址,收件人类型为to,cc,bcc(大小写不限)
- public void setMailTo(String[] mailTo,String mailType)throws Exception{
- for(int i=0;i<mailTo.length;i++){
- mailToAddress = new InternetAddress(mailTo[i]);
- if(mailType.equalsIgnoreCase("to")){
- mailMessage.addRecipient(Message.RecipientType.TO,mailToAddress);
- }
- else if(mailType.equalsIgnoreCase("cc")){
- mailMessage.addRecipient(Message.RecipientType.CC,mailToAddress);
- }
- else if(mailType.equalsIgnoreCase("bcc")){
- mailMessage.addRecipient(Message.RecipientType.BCC,mailToAddress);
- }
- else{
- throw new Exception("Unknown mailType: "+mailType+"!");
- }
- }
- }
-
- //开始投递邮件
- public void sendMail()throws MessagingException,SendFailedException{
- if(mailToAddress == null){
- System.out.println("请你必须你填写收件人地址!");
- System.exit(1);
- }
- else{
- mailMessage.setContent(multipart);
- System.out.println("正在发送邮件,请稍候.......");
- Transport.send(mailMessage);
- System.out.println("恭喜你,邮件已经成功发送!");
- }
- }
- }
- //现在的大部分的邮件服务器都要求有身份验证,所以需要此类实现验证功能
- class MailAuthenticator extends Authenticator{
- private String username = null;
- private String userpasswd = null;
- public MailAuthenticator(){}
- public MailAuthenticator(String username,String userpasswd){
- this.username = username;
- this.userpasswd = userpasswd;
- }
-
- public void setUserName(String username){
- this.username = username;
- }
- public void setPassword(String password){
- this.userpasswd = password;
- }
- public PasswordAuthentication getPasswordAuthentication(){
- return new PasswordAuthentication(username,userpasswd);
- }
- }
- //为了使此邮件发送程序能够支持可扩展性,把发送邮件的类型放到子类中来,
- //以便支持更多的邮件类型,比如语音邮件,视频邮件等......
- //1.发送纯文本文件的的子类MailSendText.class
- class MailSendText extends SendMail{
- public MailSendText(String smtpHost,String username,String password){
- super(smtpHost,username,password);
- multipart = new MimeMultipart();
- }
- public void setMailContent(String mailContent)throws MessagingException{
- messageBodyPart.setText(mailContent);
- multipart.addBodyPart(messageBodyPart);
- }
- }
- //2.发送html格式的子类MailSendHtml.class
- class MailSendHtml extends SendMail{
- private ArrayList arrayList1 = new ArrayList();
- private ArrayList arrayList2 = new ArrayList();
- public MailSendHtml(String smtpHost,String username,String password){
- super(smtpHost,username,password);
- multipart = new MimeMultipart("related");
- }
- public void setMailContent(String mailContent)throws MessagingException{
- String htmlContent = getContent("<img src=",mailContent);
- System.out.println(htmlContent);//1
- messageBodyPart.setContent(htmlContent,"text/html");
- multipart.addBodyPart(messageBodyPart);
- //调用处理html文件中的图片方法
- processHtmlImage(mailContent);
- }
- //处理html页面上的图片方法如下:
- private void processHtmlImage(String mailContent)throws MessagingException{
- for(int i=0;i<arrayList1.size();i++){
- messageBodyPart = new MimeBodyPart();
- DataSource source = new FileDataSource((String)arrayList1.get(i));
- messageBodyPart.setDataHandler(new DataHandler(source));
- String contentId = "<"+(String)arrayList2.get(i)+">";
- System.out.println(contentId);
- messageBodyPart.setHeader("Content-ID",contentId);
- messageBodyPart.setFileName((String)arrayList1.get(i));
- multipart.addBodyPart(messageBodyPart);
- }
- }
- //处理要发送的html文件,主要是针对html文件中的图片
- private String getContent(String searchString,String mailContent){
- String afterReplaceStr = "";
- for(int i=0;i<mailContent.length();i++){
- for(int j=i+1;j<mailContent.length();j++){
- String searResult = mailContent.substring(i,j);
- if(searResult.equalsIgnoreCase(searchString)){
- String subString = mailContent.substring(j);
- int flagIndex = subString.indexOf('>');
- String replaceStr = subString.substring(1,flagIndex-1);
- if(replaceStr.indexOf("http://") != -1){
- System.out.println(replaceStr);
- System.out.println("不需要处理图片!");
- }
- else{
- arrayList1.add(replaceStr);
- }
- }
- }
- }
- //在html文件中用"cid:"+Content-ID来替换原来的图片链接
- for(int m=0;m<arrayList1.size();m++){
- arrayList2.add(createRandomStr());
- String addString = "cid:"+(String)arrayList2.get(m);
- afterReplaceStr = mailContent.replaceAll((String)arrayList1.get(m),addString);
- }
- return afterReplaceStr;
- }
- //产生一个随机字符串,为了给图片设定Content-ID值
- private String createRandomStr(){
- char []randomChar = new char[8];
- for(int i=0;i<8;i++){
- randomChar[i]=(char)(Math.random()*26+'a');
- }
- String replaceStr = new String(randomChar);
- return replaceStr;
- }
- }
- /*=============================================================================
- 下面是此电子邮件发送程序的简单测试程序:
- */
- package chundiwebmail;
- import java.util.Date;
- public class SendMailTest{
- public static void main(String args[]){
- String []toAddress = {"wwp_1124@yahoo.com.cn"};
- SendMail sendmail = new MailSendHtml("smtp.mail.yahoo.com.cn","wwp_1124","3061643");
- try{
- sendmail.setSubject("HelloWorld");
- sendmail.setSendDate(new Date());
- //String plainText = "Welcome to use this Mail-Send program!";
- String htmlText = "<H1>HelloWorld</H1>" +
- "<img src="image.jpg">"+
- "<img src="http://www.yahoo.com.cn/image1.jpg">";
- //sendmail.setMailContent(plainText);
- sendmail.setMailContent(htmlText);
- //sendmail.setAttachments("D:wwpdevattach.jsp");
- sendmail.setMailFrom("wangwp@mailer.com.cn");
- sendmail.setMailTo(toAddress,"to");
- sendmail.setMailTo(toAddress,"cc");
- sendmail.sendMail();
- }
- catch(Exception ex){ ex.printStackTrace();}
- }
- }
- =============================================================================
- [/pre]
以上就是我在学习JavaMail 时所写的练习程序,我会逐步的完善此程序代码,以便使他成 为一个完整的Java Beans,可以被其它应用程序直接调用来发送邮件。希望文章发表之后大 家能提一些宝贵的意见,以便下一个版本能够更加完善,实用。
|