`
A19850925
  • 浏览: 1537 次
  • 性别: Icon_minigender_2
  • 来自: 济南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

http://jhobby.javaeye.com/blog/226419

阅读更多
(1) Mail.java 文件。
Java代码 复制代码

   1. import java.util.ArrayList; 
   2. import java.util.Date; 
   3. import java.util.List; 
   4.  
   5. /**
   6.  * Mail 类表示要发送的一封邮件。
   7.  * @author dingli
   8.  */ 
   9. public class Mail 
  10. { 
  11.     private String subject = null; 
  12.     private String from = null; 
  13.     private List sendTo = null; 
  14.     private List carbonCopy = null; 
  15.     private List blindCarbonCopy = null; 
  16.     private List attachment = null; 
  17.     private String content = null; 
  18.     private Date sendDate = null; 
  19.  
  20.     /**
  21.      * Mail 的默认构造方法。
  22.      */ 
  23.     public Mail() 
  24.     { 
  25.         this.sendTo = new ArrayList(); 
  26.         this.carbonCopy = new ArrayList(); 
  27.         this.blindCarbonCopy = new ArrayList(); 
  28.         this.attachment = new ArrayList(); 
  29.         this.sendDate = new Date(System.currentTimeMillis()); 
  30.     } 
  31.  
  32.     /**
  33.      * 获取邮件附件所在本地路径列表。
  34.      * @return 邮件附件所在本地路径列表。
  35.      */ 
  36.     public List getAttachment() 
  37.     { 
  38.         return attachment; 
  39.     } 
  40.  
  41.     /**
  42.      * 设置邮件附件所在本地路径。
  43.      * @param path 邮件附件所在本地路径。
  44.      */ 
  45.     public void setAttachment(String path) 
  46.     { 
  47.         this.attachment.add(path); 
  48.     } 
  49.  
  50.     /**
  51.      * 获取邮件暗送人列表。
  52.      * @return 邮件暗送人列表。
  53.      */ 
  54.     public List getBlindCarbonCopy() 
  55.     { 
  56.         return blindCarbonCopy; 
  57.     } 
  58.  
  59.     /**
  60.      * 设置邮件暗送人列表。
  61.      * @param blindCarbonCopy 邮件暗送人列表。
  62.      */ 
  63.     public void setBlindCarbonCopy(List blindCarbonCopy) 
  64.     { 
  65.         this.blindCarbonCopy = blindCarbonCopy; 
  66.     } 
  67.  
  68.     /**
  69.      * 获取邮件抄送人列表。
  70.      * @return 邮件抄送人列表。
  71.      */ 
  72.     public List getCarbonCopy() 
  73.     { 
  74.         return carbonCopy; 
  75.     } 
  76.  
  77.     /**
  78.      * 设置邮件抄送人列表。
  79.      * @param carbonCopy 邮件抄送人列表。
  80.      */ 
  81.     public void setCarbonCopy(List carbonCopy) 
  82.     { 
  83.         this.carbonCopy = carbonCopy; 
  84.     } 
  85.  
  86.     /**
  87.      * 获取邮件收件人列表。
  88.      * @return 邮件收件人列表。
  89.      */ 
  90.     public List getSendTo() 
  91.     { 
  92.         return sendTo; 
  93.     } 
  94.  
  95.     /**
  96.      * 设置邮件收件人列表。
  97.      * @param sendTo 邮件收件人列表。
  98.      */ 
  99.     public void setSendTo(List sendTo) 
100.     { 
101.         this.sendTo = sendTo; 
102.     } 
103.  
104.     /**
105.      * 获取邮件内容。
106.      * @return 邮件内容。
107.      */ 
108.     public String getContent() 
109.     { 
110.         return content; 
111.     } 
112.  
113.     /**
114.      * 设置邮件内容。
115.      * @param content 邮件内容。
116.      */ 
117.     public void setContent(String content) 
118.     { 
119.         this.content = content; 
120.     } 
121.  
122.     /**
123.      * 获取邮件发件人。
124.      * @return 邮件发件人。
125.      */ 
126.     public String getFrom() 
127.     { 
128.         return from; 
129.     } 
130.  
131.     /**
132.      * 设置邮件发件人。
133.      * @param from 邮件发件人。
134.      */ 
135.     public void setFrom(String from) 
136.     { 
137.         this.from = from; 
138.     } 
139.  
140.     /**
141.      * 获取邮件发送日期。
142.      * @return 邮件发送日期。
143.      */ 
144.     public Date getSendDate() 
145.     { 
146.         return sendDate; 
147.     } 
148.  
149.     /**
150.      * 设置邮件发送日期。
151.      * @param sendDate 邮件发送日期。
152.      */ 
153.     public void setSendDate(Date sendDate) 
154.     { 
155.         this.sendDate = sendDate; 
156.     } 
157.  
158.     /**
159.      * 获取邮件主题。
160.      * @return 邮件主题。
161.      */ 
162.     public String getSubject() 
163.     { 
164.         return subject; 
165.     } 
166.  
167.     /**
168.      * 设置邮件主题。
169.      * @param subject 邮件主题。
170.      */ 
171.     public void setSubject(String subject) 
172.     { 
173.         this.subject = subject; 
174.     } 
175. } 

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
* Mail 类表示要发送的一封邮件。
* @author dingli
*/
public class Mail
{
private String subject = null;
private String from = null;
private List sendTo = null;
private List carbonCopy = null;
private List blindCarbonCopy = null;
private List attachment = null;
private String content = null;
private Date sendDate = null;

/**
* Mail 的默认构造方法。
*/
public Mail()
{
this.sendTo = new ArrayList();
this.carbonCopy = new ArrayList();
this.blindCarbonCopy = new ArrayList();
this.attachment = new ArrayList();
this.sendDate = new Date(System.currentTimeMillis());
}

/**
* 获取邮件附件所在本地路径列表。
* @return 邮件附件所在本地路径列表。
*/
public List getAttachment()
{
return attachment;
}

/**
* 设置邮件附件所在本地路径。
* @param path 邮件附件所在本地路径。
*/
public void setAttachment(String path)
{
this.attachment.add(path);
}

/**
* 获取邮件暗送人列表。
* @return 邮件暗送人列表。
*/
public List getBlindCarbonCopy()
{
return blindCarbonCopy;
}

/**
* 设置邮件暗送人列表。
* @param blindCarbonCopy 邮件暗送人列表。
*/
public void setBlindCarbonCopy(List blindCarbonCopy)
{
this.blindCarbonCopy = blindCarbonCopy;
}

/**
* 获取邮件抄送人列表。
* @return 邮件抄送人列表。
*/
public List getCarbonCopy()
{
return carbonCopy;
}

/**
* 设置邮件抄送人列表。
* @param carbonCopy 邮件抄送人列表。
*/
public void setCarbonCopy(List carbonCopy)
{
this.carbonCopy = carbonCopy;
}

/**
* 获取邮件收件人列表。
* @return 邮件收件人列表。
*/
public List getSendTo()
{
return sendTo;
}

/**
* 设置邮件收件人列表。
* @param sendTo 邮件收件人列表。
*/
public void setSendTo(List sendTo)
{
this.sendTo = sendTo;
}

/**
* 获取邮件内容。
* @return 邮件内容。
*/
public String getContent()
{
return content;
}

/**
* 设置邮件内容。
* @param content 邮件内容。
*/
public void setContent(String content)
{
this.content = content;
}

/**
* 获取邮件发件人。
* @return 邮件发件人。
*/
public String getFrom()
{
return from;
}

/**
* 设置邮件发件人。
* @param from 邮件发件人。
*/
public void setFrom(String from)
{
this.from = from;
}

/**
* 获取邮件发送日期。
* @return 邮件发送日期。
*/
public Date getSendDate()
{
return sendDate;
}

/**
* 设置邮件发送日期。
* @param sendDate 邮件发送日期。
*/
public void setSendDate(Date sendDate)
{
this.sendDate = sendDate;
}

/**
* 获取邮件主题。
* @return 邮件主题。
*/
public String getSubject()
{
return subject;
}

/**
* 设置邮件主题。
* @param subject 邮件主题。
*/
public void setSubject(String subject)
{
this.subject = subject;
}
}


(2) MailConfig.java 文件。
Java代码 复制代码

   1. /**
   2.  * MailConfig 表示发送或接收邮件的配置信息。
   3.  * @author Dingli.
   4.  */ 
   5. public class MailConfig 
   6. { 
   7.     private String protocol = null; 
   8.     private String server = null; 
   9.     private String user = null; 
  10.     private String password = null; 
  11.     private int port = 0; 
  12.     private boolean debug; 
  13.  
  14.     /**
  15.      * MailConfig 的默认构造方法。
  16.      */ 
  17.     public MailConfig() 
  18.     { 
  19.         this.protocol = "smtp"; 
  20.         this.port = 25; 
  21.         this.debug = false; 
  22.     } 
  23.  
  24.     /**
  25.      * 获取是否显示邮件操作的调试信息。
  26.      * @return 是否显示邮件操作的调试信息。
  27.      */ 
  28.     public boolean isDebug() 
  29.     { 
  30.         return debug; 
  31.     } 
  32.  
  33.     /**
  34.      * 设置是否显示邮件操作的调试信息。
  35.      * @param debug 是否显示邮件操作的调试信息。
  36.      */ 
  37.     public void setDebug(boolean debug) 
  38.     { 
  39.         this.debug = debug; 
  40.     } 
  41.  
  42.     /**
  43.      * 获取登录密码。
  44.      * @return 登录密码。
  45.      */ 
  46.     public String getPassword() 
  47.     { 
  48.         return password; 
  49.     } 
  50.  
  51.     /**
  52.      * 设置登录密码。
  53.      * @param password 登录密码。
  54.      */ 
  55.     public void setPassword(String password) 
  56.     { 
  57.         this.password = password; 
  58.     } 
  59.  
  60.     /**
  61.      * 获取登录用户名。
  62.      * @return 登录用户名。
  63.      */ 
  64.     public String getUser() 
  65.     { 
  66.         return user; 
  67.     } 
  68.  
  69.     /**
  70.      * 设置登录用户名。
  71.      * @param user 登录用户名。
  72.      */ 
  73.     public void setUser(String user) 
  74.     { 
  75.         this.user = user; 
  76.     } 
  77.  
  78.     /**
  79.      * 获取邮件服务器端口。
  80.      * @return 邮件服务器端口。
  81.      */ 
  82.     public int getPort() 
  83.     { 
  84.         return port; 
  85.     } 
  86.  
  87.     /**
  88.      * 设置邮件服务器端口。
  89.      * @param port 邮件服务器端口。
  90.      */ 
  91.     public void setPort(int port) 
  92.     { 
  93.         this.port = port; 
  94.     } 
  95.  
  96.     /**
  97.      * 获取发送或接收邮件的协议。
  98.      * @return 发送或接收邮件的协议。
  99.      */ 
100.     public String getProtocol() 
101.     { 
102.         return protocol; 
103.     } 
104.  
105.     /**
106.      * 设置发送或接收邮件的协议。
107.      * @param protocol 发送或接收邮件的协议。
108.      */ 
109.     public void setProtocol(String protocol) 
110.     { 
111.         this.protocol = protocol; 
112.     } 
113.  
114.     /**
115.      * 获取邮件服务器。
116.      * @return 邮件服务器。
117.      */ 
118.     public String getServer() 
119.     { 
120.         return server; 
121.     } 
122.  
123.     /**
124.      * 设置邮件服务器。
125.      * @param server 邮件服务器。
126.      */ 
127.     public void setServer(String server) 
128.     { 
129.         this.server = server; 
130.     } 
131. } 

/**
* MailConfig 表示发送或接收邮件的配置信息。
* @author Dingli.
*/
public class MailConfig
{
private String protocol = null;
private String server = null;
private String user = null;
private String password = null;
private int port = 0;
private boolean debug;

/**
* MailConfig 的默认构造方法。
*/
public MailConfig()
{
this.protocol = "smtp";
this.port = 25;
this.debug = false;
}

/**
* 获取是否显示邮件操作的调试信息。
* @return 是否显示邮件操作的调试信息。
*/
public boolean isDebug()
{
return debug;
}

/**
* 设置是否显示邮件操作的调试信息。
* @param debug 是否显示邮件操作的调试信息。
*/
public void setDebug(boolean debug)
{
this.debug = debug;
}

/**
* 获取登录密码。
* @return 登录密码。
*/
public String getPassword()
{
return password;
}

/**
* 设置登录密码。
* @param password 登录密码。
*/
public void setPassword(String password)
{
this.password = password;
}

/**
* 获取登录用户名。
* @return 登录用户名。
*/
public String getUser()
{
return user;
}

/**
* 设置登录用户名。
* @param user 登录用户名。
*/
public void setUser(String user)
{
this.user = user;
}

/**
* 获取邮件服务器端口。
* @return 邮件服务器端口。
*/
public int getPort()
{
return port;
}

/**
* 设置邮件服务器端口。
* @param port 邮件服务器端口。
*/
public void setPort(int port)
{
this.port = port;
}

/**
* 获取发送或接收邮件的协议。
* @return 发送或接收邮件的协议。
*/
public String getProtocol()
{
return protocol;
}

/**
* 设置发送或接收邮件的协议。
* @param protocol 发送或接收邮件的协议。
*/
public void setProtocol(String protocol)
{
this.protocol = protocol;
}

/**
* 获取邮件服务器。
* @return 邮件服务器。
*/
public String getServer()
{
return server;
}

/**
* 设置邮件服务器。
* @param server 邮件服务器。
*/
public void setServer(String server)
{
this.server = server;
}
}


(3) MailSender.java 文件。
Java代码 复制代码

   1. import java.util.List; 
   2. import java.util.Properties; 
   3. import javax.activation.DataHandler; 
   4. import javax.activation.FileDataSource; 
   5. import javax.mail.Message; 
   6. import javax.mail.Session; 
   7. import javax.mail.Transport; 
   8. import javax.mail.Message.RecipientType; 
   9. import javax.mail.internet.InternetAddress; 
  10. import javax.mail.internet.MimeBodyPart; 
  11. import javax.mail.internet.MimeMessage; 
  12. import javax.mail.internet.MimeMultipart; 
  13. import sun.misc.BASE64Encoder; 
  14.  
  15. /**
  16.  * 使用 MailSender 来发送邮件。
  17.  * @author Dingli.
  18.  */ 
  19. public class MailSender 
  20. { 
  21.     //发送或接收邮件的配置信息。 
  22.     private MailConfig mailConfig = null; 
  23.     //待发送的邮件对象。 
  24.     private Mail mail = null; 
  25.     //邮件会话对象。 
  26.     private Session session = null; 
  27.     //邮件发送者对象。 
  28.     private Transport transport = null; 
  29.     //MIME 消息对象。 
  30.     private MimeMessage mimeMessage = null; 
  31.     //MimeMultipart 对象。 
  32.     private MimeMultipart mimeMultipart = null; 
  33.  
  34.     /**
  35.      * MailSender 类的默认构造方法。
  36.      */ 
  37.     public MailSender() 
  38.     { 
  39.         this.mimeMultipart = new MimeMultipart(); 
  40.     } 
  41.  
  42.     /**
  43.      * MailSender 类的构造方法。
  44.      * @param mailConfig MailConfig 对象。
  45.      */ 
  46.     public MailSender(MailConfig mailConfig) 
  47.     { 
  48.         this(); 
  49.         this.setMailConfig(mailConfig); 
  50.     } 
  51.  
  52.     /**
  53.      * 设置发送或接收邮件的配置信息。
  54.      * @param mailConfig 发送或接收邮件的配置信息。
  55.      */ 
  56.     public void setMailConfig(MailConfig mailConfig) 
  57.     { 
  58.         //设置邮件发送配置对象。 
  59.         this.mailConfig = mailConfig; 
  60.         //构建属性对象。 
  61.         Properties properties = new Properties(); 
  62.         //设置发送邮件的协议。 
  63.         properties.put("mail.transport.protocol", this.getMailConfig().getProtocol()); 
  64.         //设置是否需要身份验证。 
  65.         properties.put("mail." + this.getMailConfig().getProtocol() + ".auth", "true"); 
  66.         //是否显示调试信息。 
  67.         properties.put("mail.debug", String.valueOf(this.getMailConfig().isDebug())); 
  68.         //启动一个邮件会话。 
  69.         this.session = Session.getInstance(properties); 
  70.     } 
  71.  
  72.     /**
  73.      * 获取发送或接收邮件的配置信息。
  74.      * @return 发送或接收邮件的配置信息。
  75.      */ 
  76.     public MailConfig getMailConfig() 
  77.     { 
  78.         return mailConfig; 
  79.     } 
  80.  
  81.     /**
  82.      * 设置邮件对象。
  83.      * @param mail 邮件对象。
  84.      * @throws Exception Exception 异常。
  85.      */ 
  86.     public void setMail(Mail mail) throws Exception 
  87.     { 
  88.         if(this.mailConfig != null) 
  89.         { 
  90.             //保存邮件对象。 
  91.             this.mail = mail; 
  92.             //构建 MIME 消息对象。 
  93.             this.mimeMessage = new MimeMessage(this.session); 
  94.             //设置发件人。 
  95.             this.mimeMessage.setFrom(new InternetAddress(this.getMail().getFrom())); 
  96.             //设置邮件主题。 
  97.             this.mimeMessage.setSubject(this.getMail().getSubject()); 
  98.             //设置邮件发送时间。 
  99.             this.mimeMessage.setSentDate(this.getMail().getSendDate()); 
100.             //设置收件人。 
101.             this.setMailRecipients(this.mimeMessage, Message.RecipientType.TO, this.getMail().getSendTo()); 
102.             //设置抄送人。 
103.             this.setMailRecipients(this.mimeMessage, Message.RecipientType.CC, this.getMail().getCarbonCopy()); 
104.             //设置暗送人。 
105.             this.setMailRecipients(this.mimeMessage, Message.RecipientType.BCC, this.getMail().getBlindCarbonCopy()); 
106.             //判断邮件是否有附件。 
107.             if(this.getMail().getAttachment().isEmpty()) 
108.             { 
109.                 //设置邮件文本内容。 
110.                 this.mimeMessage.setText(this.getMail().getContent()); 
111.             } 
112.             else 
113.             { 
114.                 //设置邮件内容。 
115.                 this.setMailBody(this.getMail()); 
116.                 //设置Multipart对象。 
117.                 this.mimeMessage.setContent(this.mimeMultipart); 
118.             } 
119.         } 
120.         else 
121.         { 
122.             throw new Exception("You must set mail config first"); 
123.         } 
124.     } 
125.  
126.     /**
127.      * 获取邮件对象。
128.      * @return 邮件对象。
129.      */ 
130.     public Mail getMail() 
131.     { 
132.         return mail; 
133.     } 
134.  
135.     /**
136.      * 发送邮件。
137.      * @param mail 邮件对象。
138.      * @throws Exception Exception 异常。
139.      */ 
140.     public void send(Mail mail) throws Exception 
141.     { 
142.         this.setMail(mail); 
143.         this.connect(); 
144.         this.send(); 
145.     } 
146.  
147.     /**
148.      * 连接到配置信息设置的邮件服务器。
149.      * @throws Exception Exception 异常。
150.      */ 
151.     public void connect() throws Exception 
152.     { 
153.         if(this.getMail() != null) 
154.         { 
155.             //构建发送者。 
156.             this.transport = this.session.getTransport(); 
157.             //连接到邮件服务器。 
158.             this.transport.connect(this.getMailConfig().getServer(), this.getMailConfig().getPort(), this.getMailConfig().getUser(), this.getMailConfig().getPassword()); 
159.         } 
160.         else 
161.         { 
162.             throw new Exception("No such mail to set"); 
163.         } 
164.     } 
165.  
166.     /**
167.      * 关闭与邮件服务器的连接。
168.      * @throws Exception Exception 异常。
169.      */ 
170.     public void close() throws Exception 
171.     { 
172.         //关闭邮件发送者对象。 
173.         if(this.transport != null && this.transport.isConnected()) 
174.         { 
175.             this.transport.close(); 
176.         } 
177.         //置空对象。 
178.         this.mailConfig = null; 
179.         this.mail = null; 
180.         this.session = null; 
181.         this.transport = null; 
182.         this.mimeMultipart = null; 
183.         this.mimeMessage = null; 
184.     } 
185.  
186.     /**
187.      * 发送邮件。
188.      * @throws Exception Exception 异常。
189.      */ 
190.     public void send() throws Exception 
191.     { 
192.         if(this.transport != null && this.transport.isConnected()) 
193.         { 
194.             //发送邮件给收件人。 
195.             if(this.mimeMessage.getRecipients(Message.RecipientType.TO) != null) 
196.             { 
197.                 this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.TO)); 
198.             } 
199.             //发送邮件给抄送人。 
200.             if(this.mimeMessage.getRecipients(Message.RecipientType.CC) != null) 
201.             { 
202.                 this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.CC)); 
203.             } 
204.             //发送邮件给暗送人。 
205.             if(this.mimeMessage.getRecipients(Message.RecipientType.BCC) != null) 
206.             { 
207.                 this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.BCC)); 
208.             } 
209.         } 
210.         else 
211.         { 
212.             throw new Exception("No such connection"); 
213.         } 
214.     } 
215.  
216.     /**
217.      * 设置收信人。
218.      * @param mimeMessage MIME 消息类型。
219.      * @param recipientType 收信人类型。
220.      * @param recipients 收信人列表。
221.      * @throws Exception Exception 异常。
222.      */ 
223.     private void setMailRecipients(MimeMessage mimeMessage, RecipientType recipientType, List recipients) throws Exception 
224.     { 
225.         //构建收信人地址数组。 
226.         InternetAddress[] internetAddresses = new InternetAddress[recipients.size()]; 
227.         //遍历所有收信人。 
228.         for(int i = 0; i < recipients.size(); i++) 
229.         { 
230.             //构建收信人地址对象。 
231.             internetAddresses[i] = new InternetAddress(recipients.get(i).toString()); 
232.         } 
233.         //设置收信人。 
234.         mimeMessage.setRecipients(recipientType, internetAddresses); 
235.     } 
236.  
237.     /**
238.      * 设置邮件体。包括邮件内容与附件。
239.      * @param mail Mail 对象。
240.      * @throws Exception Exception 异常。
241.      */ 
242.     private void setMailBody(Mail mail) throws Exception 
243.     { 
244.         //移除 MimeMultipart 对象中的 MimeBodyPart 对象。 
245.         if(this.mimeMultipart != null) 
246.         { 
247.             //清空 MimeMultipart 对象。 
248.             for(int i = 0; i < this.mimeMultipart.getCount(); i++) 
249.             { 
250.                 this.mimeMultipart.removeBodyPart(i); 
251.             } 
252.         } 
253.         //base64编码器。 
254.         BASE64Encoder base64Encoder = new BASE64Encoder(); 
255.         //构建邮件文本内容对象。 
256.         MimeBodyPart textBodyPart = new MimeBodyPart(); 
257.         //设置邮件文本内容。 
258.         textBodyPart.setText(mail.getContent()); 
259.         //添加邮件文本内容。 
260.         this.mimeMultipart.addBodyPart(textBodyPart); 
261.         //遍历所有附件本地路径。 
262.         for(int i = 0; i < mail.getAttachment().size(); i++) 
263.         { 
264.             //邮件附件本地路径。 
265.             String attachmentPath = mail.getAttachment().get(i).toString(); 
266.             //构建邮件附件对象。 
267.             MimeBodyPart attachmentBodyPart = new MimeBodyPart(); 
268.             //用文件数据源对象构建一个数据句柄对象并设置到邮件附件对象。 
269.             attachmentBodyPart.setDataHandler(new DataHandler(new FileDataSource(attachmentPath))); 
270.             //设置邮件附件对象的名字。 
271.             attachmentBodyPart.setFileName("=?GBK?B?" + base64Encoder.encode(attachmentPath.substring(attachmentPath.replace('\\', '/').lastIndexOf('/') + 1).getBytes()) + "?="); 
272.             //添加邮件附件。 
273.             this.mimeMultipart.addBodyPart(attachmentBodyPart); 
274.         } 
275.     } 
276. } 

import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import sun.misc.BASE64Encoder;

/**
* 使用 MailSender 来发送邮件。
* @author Dingli.
*/
public class MailSender
{
//发送或接收邮件的配置信息。
private MailConfig mailConfig = null;
//待发送的邮件对象。
private Mail mail = null;
//邮件会话对象。
private Session session = null;
//邮件发送者对象。
private Transport transport = null;
//MIME 消息对象。
private MimeMessage mimeMessage = null;
//MimeMultipart 对象。
private MimeMultipart mimeMultipart = null;

    /**
     * MailSender 类的默认构造方法。
     */
    public MailSender()
    {
    this.mimeMultipart = new MimeMultipart();
    }

    /**
     * MailSender 类的构造方法。
     * @param mailConfig MailConfig 对象。
     */
public MailSender(MailConfig mailConfig)
{
this();
this.setMailConfig(mailConfig);
}

/**
* 设置发送或接收邮件的配置信息。
* @param mailConfig 发送或接收邮件的配置信息。
*/
public void setMailConfig(MailConfig mailConfig)
{
//设置邮件发送配置对象。
this.mailConfig = mailConfig;
//构建属性对象。
Properties properties = new Properties();
//设置发送邮件的协议。
properties.put("mail.transport.protocol", this.getMailConfig().getProtocol());
//设置是否需要身份验证。
properties.put("mail." + this.getMailConfig().getProtocol() + ".auth", "true");
//是否显示调试信息。
properties.put("mail.debug", String.valueOf(this.getMailConfig().isDebug()));
//启动一个邮件会话。
this.session = Session.getInstance(properties);
}

/**
* 获取发送或接收邮件的配置信息。
* @return 发送或接收邮件的配置信息。
*/
public MailConfig getMailConfig()
{
return mailConfig;
}

/**
* 设置邮件对象。
* @param mail 邮件对象。
* @throws Exception Exception 异常。
*/
public void setMail(Mail mail) throws Exception
{
if(this.mailConfig != null)
{
//保存邮件对象。
this.mail = mail;
//构建 MIME 消息对象。
this.mimeMessage = new MimeMessage(this.session);
//设置发件人。
this.mimeMessage.setFrom(new InternetAddress(this.getMail().getFrom()));
//设置邮件主题。
this.mimeMessage.setSubject(this.getMail().getSubject());
//设置邮件发送时间。
this.mimeMessage.setSentDate(this.getMail().getSendDate());
//设置收件人。
this.setMailRecipients(this.mimeMessage, Message.RecipientType.TO, this.getMail().getSendTo());
//设置抄送人。
this.setMailRecipients(this.mimeMessage, Message.RecipientType.CC, this.getMail().getCarbonCopy());
//设置暗送人。
this.setMailRecipients(this.mimeMessage, Message.RecipientType.BCC, this.getMail().getBlindCarbonCopy());
//判断邮件是否有附件。
if(this.getMail().getAttachment().isEmpty())
{
//设置邮件文本内容。
this.mimeMessage.setText(this.getMail().getContent());
}
else
{
//设置邮件内容。
this.setMailBody(this.getMail());
//设置Multipart对象。
this.mimeMessage.setContent(this.mimeMultipart);
}
}
else
{
throw new Exception("You must set mail config first");
}
}

/**
* 获取邮件对象。
* @return 邮件对象。
*/
public Mail getMail()
{
return mail;
}

/**
* 发送邮件。
* @param mail 邮件对象。
* @throws Exception Exception 异常。
*/
public void send(Mail mail) throws Exception
{
this.setMail(mail);
this.connect();
this.send();
}

/**
* 连接到配置信息设置的邮件服务器。
* @throws Exception Exception 异常。
*/
public void connect() throws Exception
{
if(this.getMail() != null)
{
//构建发送者。
this.transport = this.session.getTransport();
//连接到邮件服务器。
this.transport.connect(this.getMailConfig().getServer(), this.getMailConfig().getPort(), this.getMailConfig().getUser(), this.getMailConfig().getPassword());
}
else
{
throw new Exception("No such mail to set");
}
}

/**
* 关闭与邮件服务器的连接。
* @throws Exception Exception 异常。
*/
public void close() throws Exception
{
//关闭邮件发送者对象。
if(this.transport != null && this.transport.isConnected())
{
this.transport.close();
}
//置空对象。
this.mailConfig = null;
this.mail = null;
this.session = null;
this.transport = null;
this.mimeMultipart = null;
this.mimeMessage = null;
}

/**
* 发送邮件。
* @throws Exception Exception 异常。
*/
public void send() throws Exception
{
if(this.transport != null && this.transport.isConnected())
{
//发送邮件给收件人。
if(this.mimeMessage.getRecipients(Message.RecipientType.TO) != null)
{
this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.TO));
}
//发送邮件给抄送人。
if(this.mimeMessage.getRecipients(Message.RecipientType.CC) != null)
{
this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.CC));
}
//发送邮件给暗送人。
if(this.mimeMessage.getRecipients(Message.RecipientType.BCC) != null)
{
this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.BCC));
}
}
else
{
throw new Exception("No such connection");
}
}

/**
* 设置收信人。
* @param mimeMessage MIME 消息类型。
* @param recipientType 收信人类型。
* @param recipients 收信人列表。
* @throws Exception Exception 异常。
*/
private void setMailRecipients(MimeMessage mimeMessage, RecipientType recipientType, List recipients) throws Exception
{
//构建收信人地址数组。
InternetAddress[] internetAddresses = new InternetAddress[recipients.size()];
//遍历所有收信人。
for(int i = 0; i < recipients.size(); i++)
{
//构建收信人地址对象。
internetAddresses[i] = new InternetAddress(recipients.get(i).toString());
}
//设置收信人。
mimeMessage.setRecipients(recipientType, internetAddresses);
}

/**
* 设置邮件体。包括邮件内容与附件。
* @param mail Mail 对象。
* @throws Exception Exception 异常。
*/
private void setMailBody(Mail mail) throws Exception
{
//移除 MimeMultipart 对象中的 MimeBodyPart 对象。
if(this.mimeMultipart != null)
{
//清空 MimeMultipart 对象。
for(int i = 0; i < this.mimeMultipart.getCount(); i++)
{
this.mimeMultipart.removeBodyPart(i);
}
}
//base64编码器。
BASE64Encoder base64Encoder = new BASE64Encoder();
//构建邮件文本内容对象。
MimeBodyPart textBodyPart = new MimeBodyPart();
//设置邮件文本内容。
textBodyPart.setText(mail.getContent());
//添加邮件文本内容。
this.mimeMultipart.addBodyPart(textBodyPart);
//遍历所有附件本地路径。
for(int i = 0; i < mail.getAttachment().size(); i++)
{
//邮件附件本地路径。
String attachmentPath = mail.getAttachment().get(i).toString();
//构建邮件附件对象。
MimeBodyPart attachmentBodyPart = new MimeBodyPart();
//用文件数据源对象构建一个数据句柄对象并设置到邮件附件对象。
attachmentBodyPart.setDataHandler(new DataHandler(new FileDataSource(attachmentPath)));
//设置邮件附件对象的名字。
attachmentBodyPart.setFileName("=?GBK?B?" + base64Encoder.encode(attachmentPath.substring(attachmentPath.replace('\\', '/').lastIndexOf('/') + 1).getBytes()) + "?=");
//添加邮件附件。
this.mimeMultipart.addBodyPart(attachmentBodyPart);
}
}
}


用一个 main() 方法来简单表明如何使用。
Java代码 复制代码

   1. public class MainClass 
   2. { 
   3.     public static void main(String[] args) 
   4.     { 
   5.         //邮件发送者。 
   6.         MailSender mailSender = new MailSender(); 
   7.         try 
   8.         { 
   9.             //SMTP 配置。 
  10.             MailConfig mailConfig = new MailConfig(); 
  11.             //设置登录的邮件服务器。 
  12.             mailConfig.setServer("smtp.126.com"); 
  13.             //设置登录用户名。 
  14.             mailConfig.setUser("dingli717"); 
  15.             //设置登录密码。 
  16.             mailConfig.setPassword("******"); 
  17.             //一封电子邮件. 
  18.             Mail mail = new Mail(); 
  19.             //发件人。 
  20.             mail.setFrom("dingli717@126.com"); 
  21.             //收件人,可以添加多个。 
  22.             mail.getSendTo().add("dingli717@126.com"); 
  23.             //邮件主题。 
  24.             mail.setSubject("Java 你好"); 
  25.             //邮件内容。 
  26.             mail.setContent("邮件发送测试"); 
  27.             //本地附件路径,可以添加多个附件。 
  28.             mail.setAttachment("E:/testExcel.xls"); 
  29.             //设置邮件配置。 
  30.             mailSender.setMailConfig(mailConfig); 
  31.             //设置要发送的邮件。 
  32.             mailSender.setMail(mail); 
  33.             //连接邮件服务器。 
  34.             mailSender.connect(); 
  35.             //发送邮件。 
  36.             mailSender.send(); 
  37.             //邮件成功发送。 
  38.             System.out.println("邮件发送成功!"); 
  39.         } 
  40.         catch(Exception ex) 
  41.         { 
  42.             ex.printStackTrace(); 
  43.         } 
  44.         finally 
  45.         { 
  46.             try 
  47.             { 
  48.                 mailSender.close(); 
  49.             } 
  50.             catch(Exception ex) 
  51.             { 
  52.                 ex.printStackTrace(); 
  53.             } 
  54.         } 
  55.     } 
  56. } 

public class MainClass
{
public static void main(String[] args)
{
//邮件发送者。
MailSender mailSender = new MailSender();
try
{
//SMTP 配置。
MailConfig mailConfig = new MailConfig();
//设置登录的邮件服务器。
mailConfig.setServer("smtp.126.com");
//设置登录用户名。
mailConfig.setUser("dingli717");
//设置登录密码。
mailConfig.setPassword("******");
//一封电子邮件.
Mail mail = new Mail();
//发件人。
mail.setFrom("dingli717@126.com");
//收件人,可以添加多个。
mail.getSendTo().add("dingli717@126.com");
//邮件主题。
mail.setSubject("Java 你好");
//邮件内容。
mail.setContent("邮件发送测试");
//本地附件路径,可以添加多个附件。
mail.setAttachment("E:/testExcel.xls");
//设置邮件配置。
mailSender.setMailConfig(mailConfig);
//设置要发送的邮件。
mailSender.setMail(mail);
//连接邮件服务器。
mailSender.connect();
//发送邮件。
mailSender.send();
//邮件成功发送。
System.out.println("邮件发送成功!");
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
mailSender.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}


Mail 类表示一封电子邮件,MailConfig 类表示发送或接收电子邮件的配置信息,而 MailSender 类用来处理邮件的具体发送。
分享到:
评论

相关推荐

    http://yourgame.javaeye.com/blog/252853

    标题 "JavaEye博客文章——深入理解HTTP你的游戏" 这篇博客文章是关于深入理解HTTP协议的,作者通过"你的游戏"这个实例,详细讲解了HTTP在实际应用中的运作机制,特别是对于游戏开发而言的重要知识点。HTTP(超文本...

    JAVA web.xml配置详解

    -- 配置集群的时候,要用到,在这篇文章:“apache+tomcat集群、负载均衡及session复制”里的第三条(http://jiajun.javaeye.com/admin/blogs/278586) --&gt; &lt;distributable/&gt; &lt;!-- context-param 元素用来设定...

    JAva资源网站大全

    网址:http://www.javaeye.com/ JavaEye曾是中国最大的Java技术社区之一,虽然目前可能已不活跃,但其存档的大量技术文章和讨论仍具有很高的参考价值。对于希望了解过去Java技术趋势和发展历史的开发者来说,这是一...

    常用Java Web应用软件 (LNMJ,LAMJ)安装

    http://peterwei.javaeye.com/blog/968815 Ubuntu10下JDK1.6安装 http://peterwei.javaeye.com/blog/968758 Ubuntu10下Tomcat7安装 http://peterwei.javaeye.com/blog/968774 Ubuntu10下Eclipse3.6安装 ...

    hadoop学习资料地址

    3. **Hadoop部署与升级**:`http://www.slideshare.net/steve_l/dynamic-hadoop-clusters`, `http://zkl-1987.javaeye.com/blog/365172`, `http://www.javaeye.com/topic/365172` - 提供了Hadoop集群部署的最佳实践...

    Flex + Hessian 留言本

    Flex + Hessian 学习笔记(一) http://wangcheng.javaeye.com/blog/141382 Flex + Hessian 学习笔记(二) http://wangcheng.javaeye.com/blog/141539 Flex + Hessian 学习笔记(三) ...

    ECSide最新文档

    - 1.1 final 版: [http://fins.javaeye.com/blog/54265](http://fins.javaeye.com/blog/54265) - 1.1 RC1 版: [http://fins.javaeye.com/blog/51068](http://fins.javaeye.com/blog/51068) - 1.0 RC1 版: ...

    手把手教你使用Maven进行Android的从配置到开发与资源管理教程.doc

    - Maven的中文手册可参考[http://www.juvenxu.com/mvn-def-guide/](http://www.juvenxu.com/mvn-def-guide/)和[http://juvenshun.javaeye.com/5](http://juvenshun.javaeye.com/5)。 **5. Maven项目导入Eclipse** ...

    Android 中文API 合集(102 篇)

    无论是个人还是团队,只要翻译了Android官方的相关文档,都可以通过发送邮件的方式(over140@gmail.com)分享进度,以避免重复翻译的工作。同时,翻译组也会定期更新进度列表,方便大家了解整体进展。 #### 五、...

    android学习资料(网站,论坛)

    3. **JavaEye论坛(http://www.javaeye.com/forums/tag/Android)**:虽然JavaEye论坛已经关闭,但其存档的Android相关帖子仍然具有很高的参考价值。 4. **Android123论坛...

    JWFD工作流系统源代码包(ECLIPSE开发版)

    http://comsci.javaeye.com/ JWFD工作流设计器(带引擎算法)的源代码包, 实在不好意思,这个包的资源文件缺失了,导致编译时报错,经过反馈, 修改了这个问题,在资源中新增加下载,本下载停止使用,非常抱歉 请...

    50个论坛地址

    - **JavaEye**(http://www.javaeye.com/): 早期的Java技术社区,虽然现在已不活跃,但曾经是中国最大的Java开发者聚集地之一。 - **ITEER**(http://www.iteer.net/): 覆盖了IT行业的多个方面的综合技术社区。 - ...

    pager-taglib-2.0完整源码和Struts演示示例工程

    在Struts中应用标签的数据库分页示例(dbpage.jsp),打开方法: ...打开方法: http://localhost:8080/pagertaglib/test1.jsp&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;制作示例参考了: ...

    flex从入门到实践

    1. **参考网文**:《Flex基础教程》[http://jackweijie.javaeye.com/blog/191452](http://jackweijie.javaeye.com/blog/191452) - 这篇文章详细介绍了Flex的基础知识,包括安装配置环境、基本概念、语法结构等内容...

Global site tag (gtag.js) - Google Analytics