import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class JavaEmail {
public static void main(String[] args) throws AddressException, MessagingException {
Properties properties = new Properties();
properties.setProperty("mail.transport.protocol", "smtp");//发送邮件协议
properties.setProperty("mail.smtp.auth", "true");//需要验证
//下面3行代码是qq邮箱专用的
properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.setProperty("mail.smtp.port", "465");
properties.setProperty("mail.smtp.socketFactory.port", "465");
Session session = Session.getInstance(properties);
//邮件信息
Message messgae = new MimeMessage(session);
messgae.setFrom(new InternetAddress("774695423@qq.com"));//设置发送人
messgae.setText("what's up man");//设置邮件内容
messgae.setSubject("哥们该吃饭了");//设置邮件主题
//发送邮件
Transport tran = session.getTransport();
//tran.connect("smtp.sina.com", 25, "xxxx@sina.cn", "xxxxxxx");//连接到新浪邮箱服务器
tran.connect("smtp.qq.com", 25, "774695423@qq.com", "wuhuarong92926%");//连接到QQ邮箱服务器
tran.sendMessage(messgae, new Address[]{ new InternetAddress("349342993@qq.com")});//设置邮件接收人
tran.close();
}
}
import java.util.Properties;
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 Mail {
private MimeMessage mimeMsg; //MIME邮件对象
private Session session; //邮件会话对象
private Properties props; //系统属性
private boolean needAuth = false; //smtp是否需要认证
//smtp认证用户名和密码
private String username;
private String password;
private Multipart mp; //Multipart对象,邮件内容,标题(不是主题),附件等内容均添加到其中后再生成MimeMessage对象
/**
* (1)设置邮件发送服务器
* @param hostName String
*/
public void setSmtpHost(String hostName) {
System.out.println("设置系统属性:mail.smtp.host = "+hostName);
if(props == null)
props = System.getProperties(); //获得系统属性对象
props.put("mail.smtp.host",hostName); //设置SMTP主机
//qq邮箱还要设置以下属性
if("smtp.qq.com".equals(hostName)){
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
}
}
/**
* (2)创建MIME邮件对象
* @return
*/
public boolean createMimeMessage()
{
try {
System.out.println("准备获取邮件会话对象!");
session = Session.getDefaultInstance(props,null); //获得邮件会话对象
}
catch(Exception e){
System.err.println("获取邮件会话对象时发生错误!"+e);
return false;
}
System.out.println("准备创建MIME邮件对象!");
try {
mimeMsg = new MimeMessage(session); //创建MIME邮件对象
mp = new MimeMultipart();
return true;
} catch(Exception e){
System.err.println("创建MIME邮件对象失败!"+e);
return false;
}
}
/**
* (3)设置SMTP是否需要验证
* @param need
*/
public void setNeedAuth(boolean need) {
System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);
if(props == null) props = System.getProperties();
if(need){
props.put("mail.smtp.auth","true");
}else{
props.put("mail.smtp.auth","false");
}
}
/**
* (4)设置用户名和密码
* @param name
* @param pass
*/
public void setNamePass(String name,String pass) {
username = name;
password = pass;
}
/**
* (5)设置邮件主题
* @param mailSubject
* @return
*/
public boolean setSubject(String mailSubject) {
System.out.println("设置邮件主题!");
try{
mimeMsg.setSubject(mailSubject);
return true;
}
catch(Exception e) {
System.err.println("设置邮件主题发生错误!");
return false;
}
}
/**
* (6)设置邮件正文
* @param mailBody String
*/
public boolean setBody(String mailBody) {
try{
BodyPart bp = new MimeBodyPart();
bp.setContent(""+mailBody,"text/html;charset=GBK");
mp.addBodyPart(bp);
return true;
} catch(Exception e){
System.err.println("设置邮件正文时发生错误!"+e);
return false;
}
}
/**
* (7)添加附件
* @param filename String
*/
public boolean addFileAffix(String filename) {
System.out.println("增加邮件附件:"+filename);
try{
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(filename);
DataHandler dh = new DataHandler(fileds);
bp.setDataHandler(dh);
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
return true;
} catch(Exception e){
System.err.println("增加邮件附件:"+filename+"发生错误!"+e);
return false;
}
}
/**
* (8)设置发信人
* @param from String
*/
public boolean setFrom(String from) {
System.out.println("设置发信人!");
try{
mimeMsg.setFrom(new InternetAddress(from)); //设置发信人
return true;
} catch(Exception e) {
return false;
}
}
/**
* (9)设置收信人
* @param to String
*/
public boolean setTo(String to){
if(to == null)return false;
try{
mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
return true;
} catch(Exception e) {
return false;
}
}
/**
* (10)设置抄送人
* @param copyto String
*/
public boolean setCopyTo(String copyto)
{
if(copyto == null)return false;
try{
mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));
return true;
}
catch(Exception e)
{ return false; }
}
/**
* (11)发送邮件
*/
public boolean sendOut()
{
try{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在发送邮件....");
Session mailSession = Session.getInstance(props,null);
Transport transport = mailSession.getTransport("smtp");
transport.connect((String)props.get("mail.smtp.host"),username,password);
if(mimeMsg.getRecipients(Message.RecipientType.CC)!=null)
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));
if(mimeMsg.getRecipients(Message.RecipientType.TO)!=null)
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
System.out.println("发送邮件成功!");
transport.close();
return true;
} catch(Exception e) {
System.err.println("邮件发送失败!"+e);
return false;
}
}
/**
* 调用sendOut方法完成邮件发送
* @param smtp
* @param from
* @param to
* @param subject
* @param content
* @param username
* @param password
* @return boolean
*/
public boolean send(String smtp,String from,String to,String subject,String content,String username,String password) {
setSmtpHost(smtp);
if(!createMimeMessage()) return false;
setNeedAuth(true); //需要验证
if(!setSubject(subject)) return false;
if(!setBody(content)) return false;
if(!setTo(to)) return false;
if(!setFrom(from)) return false;
setNamePass(username,password);
if(!sendOut()) return false;
return true;
}
/**
* 调用sendOut方法完成邮件发送,带抄送
* @param smtp
* @param from
* @param to
* @param copyto
* @param subject
* @param content
* @param username
* @param password
* @return boolean
*/
public boolean sendAndCc(String smtp,String from,String to,String copyto,String subject,String content,String username,String password) {
setSmtpHost(smtp);
if(!createMimeMessage()) return false;
setNeedAuth(true); //需要验证
if(!setSubject(subject)) return false;
if(!setBody(content)) return false;
if(!setTo(to)) return false;
if(!setCopyTo(copyto)) return false;
if(!setFrom(from)) return false;
setNamePass(username,password);
if(!sendOut()) return false;
return true;
}
/**
* 调用sendOut方法完成邮件发送,带附件
* @param smtp
* @param from
* @param to
* @param subject
* @param content
* @param username
* @param password
* @param filename 附件路径
* @return
*/
public boolean send(String smtp,String from,String to,String subject,String content,String username,String password,String filename) {
setSmtpHost(smtp);
if(!createMimeMessage()) return false;
setNeedAuth(true); //需要验证
if(!setSubject(subject)) return false;
if(!setBody(content)) return false;
if(!addFileAffix(filename)) return false;
if(!setTo(to)) return false;
if(!setFrom(from)) return false;
setNamePass(username,password);
if(!sendOut()) return false;
return true;
}
/**
* 调用sendOut方法完成邮件发送,带附件和抄送
* @param smtp
* @param from
* @param to
* @param copyto
* @param subject
* @param content
* @param username
* @param password
* @param filename
* @return
*/
public boolean sendAndCc(String smtp,String from,String to,String copyto,String subject,String content,String username,String password,String filename) {
setSmtpHost(smtp);
if(!createMimeMessage()) return false;
setNeedAuth(true); //需要验证
if(!setSubject(subject)) return false;
if(!setBody(content)) return false;
if(!addFileAffix(filename)) return false;
if(!setTo(to)) return false;
if(!setCopyTo(copyto)) return false;
if(!setFrom(from)) return false;
setNamePass(username,password);
if(!sendOut()) return false;
return true;
}
public static void main(String[] args){
String smtp = "smtp.qq.com";
String from = "349342993@qq.com";
String to = "774695423@qq.com";
String copyto = "349342993@qq.com";
String subject = "邮件主题";
//邮件内容是纯文本
String content = "邮件内容";
String username="349342993@qq.com";
String password="wuhuarong92926%";
String filename = "C:\\Users\\Administrator\\Desktop\\a.txt";
Mail mail = new Mail();
mail.send(smtp, from, to, subject, content, username, password);
mail.send(smtp, from, to, subject, content, username, password, filename);
mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password);
mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password, filename);
//邮件内容是html
String content = "<font style='BACKGROUND-COLOR: #666699' color='#ff0000' size='5'>测试格式化内容测试<a href='http://www.baidu.com'>格式化内容</a>测试格<em>式化</em>内容</font><img src='http://a.hiphotos.baidu.com/image/pic/item/96dda144ad345982d2e4dc9a0ef431adcbef844f.jpg'></img>";
mail.send(smtp, from, to, subject, content, username, password);
mail.send(smtp, from, to, subject, content, username, password, filename);
mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password);
mail.sendAndCc(smtp, from, to, copyto, subject, content, username, password, filename);
}
}
我们可以在邮件编辑窗口增加一些插件,如制作表格、设置背景、设置字体、插入图片等等,操作这些插件会使编辑框的内容自动生成一些html代码,我们把表单传给后台时,后台读取到的内容除了纯文本外还有一些html代码,如果包含图片,在提交表单时,除了向后台发送表单数据,还要把图片上传到服务器,这时后台读取表单数据(包含图片的url(服务器上的图片地址)),然后把表单数据作为邮件内容发送出去(当然包括图片的url)。
收邮件
接收邮件可以应用协议POP3或IMAP,后者功能更强
接收邮件过程
参考下面例子中showMessages()
1、Store(Javax.mail.Store)
接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。 Store store = session.getStore("imap"); Store store = session.getStore("pop3"); store.connect(host, username, password);
2、Folder(Javax.mail.Folder)
在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息: Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY);
首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读(Folder.READ_ONLY)的方式打开Folder,
注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder。
3、Message (Javax.mail.Message)
最后调用Folder的getMessages()方法得到目录中所有Message的数组。 Message message[] = folder.getMessages();
Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件服务器读取邮件内容。在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。 ((MimeMessage)message).getContent();
4、关闭连接
在读取邮件内容后,别忘记了关闭Folder和Store。 folder.close(Boolean); store.close();
传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。 A.2、查看邮件数、新邮件和未读邮件 参考下面例子中showFolderInfo()
想知道邮箱中共有多少邮件、有多少邮件读过和有多少邮件没有读过。
Folder对象提供了三个方法。GetMessageCount方法显示邮箱中总共有多少封信,getNewMessageCount显示邮箱中新邮件的封数,getUnreadMessageCount显示邮箱中未读邮件的封数。
注意:对于POP3协议,只支持GetMessageCount查询邮件总数。不支持判断邮件的未读和新邮件标记,只有自己进行判断操作了。 A.3、消息标识(删除邮件)
消息的删除涉及使用与消息相关的 Flags(标志)。不同 flag 对应不同的状态,有些由系统定义而有些则由用户定义。下面列出在内部类 Flags.Flag 中预定义的标志:
* Flags.Flag.ANSWERED
* Flags.Flag.DELETED
* Flags.Flag.DRAFT
* Flags.Flag.FLAGGED
* Flags.Flag.RECENT
* Flags.Flag.SEEN
* Flags.Flag.USER
仅仅因为存在一个标志,并不意味着所有邮件服务器或供应商都支持这个标志。例如,除了删除消息标志外,POP 协议不再支持其它任何标志。检查是否存在新邮件,这也不是个POP任务,而是内建于邮件客户机的任务。为找出哪些标志能被支持,可以用 getPermanentFlags() 向 folder 提出要求。 消息标识的应用删除邮件参考下面例子中deleteMessage() 。
要删除消息,您可以设置消息的DELETED flag:message.setFlag(Flags.Flag.DELETED, true);
首先,请以 READ_WRITE 模式打开 folder: folder.open(Folder.READ_WRITE);
然后,当所有消息的处理完成后,关闭 folder,并传递一个 true 值,从而擦除有 delete 标志的消息:folder.close(true);
一个 Folder 的 expunge() 方法可以用来删除消息。但Sun的POP3供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP供应商极有可能实现此功能。因为 POP只支持单个对邮箱的访问,对Sun的供应商来说,您必需关闭folder以删除消息。 要取消标志,只要传递false给setFlag()方法就行了。想知道是否设置过标志,可以用 isSet() 检查。
5、复制或移动邮件
参考下面例子中moveMessage()
Folder类的copyMessages(Message[] msgs, Folder otherFolder);方法可实现复制邮件的功能。参数msgs是你要复制的邮件数组。参数otherFolder为你要复制的目的邮件箱,该操作是复制邮件,然后把原邮件删除,则实现移动邮件。
6、获得、下载附件
见方法:getAttachment()
注意,如果附件是文本文件,如txt文件,该方法会把附件当做String类型处理,如何处理,有待解决
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
public class TreatMessages{
private String pop3Server = "pop.163.com";
private String imapServer = "imap.163.com";
private String user = "18820702269@163.com";
private String password = "wuhuarong92926%";
// Pop3方式
private Session getSessionForPop3(){
Session session = null;
try{
Properties props = new Properties();
props.setProperty("mail.store.protocol", "pop3");
props.setProperty("mail.transport.protocol", "pop3");
// props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.pop3.host",pop3Server);
session = Session.getInstance(props);
}catch (Exception ex){
System.out.println(ex.toString());
}
return session;
}
//Imap方式
private Session getSessionForImap(){
Session session = null;
try{
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.host", imapServer);
session = Session.getInstance(props);
}catch (Exception ex){
System.out.println(ex.toString());
}
return session;
}
//(1) 利用pop3显示所有邮件
public void showMessagesByPop3() {
try{
Session session = getSessionForPop3();
Store store = session.getStore("pop3");
store.connect(pop3Server,user,password);
// 以pop3协议连接到Store。port:25
Folder folder = null;
folder = store.getDefaultFolder();
if(folder == null)
throw new Exception("No default folder");
// 获取默认文件夹
folder = folder.getFolder("INBOX");
if (folder == null)
throw new Exception("No POP3 INBOX");
// 如果是收件箱
folder.open(Folder.READ_WRITE);
// 使用读写方式打开收件箱
Message[] msgs = folder.getMessages();
// 得到文件夹信息,获取邮件列表
for (int msgNum = 0; msgNum < msgs.length; msgNum++){
printMessage(msgs[msgNum]);
}
// 显示所有邮件信息。
folder.close(true);
// 参数表示是否在删除操作邮件后更新Folder
store.close();
// 关闭store。
} catch (Exception ex){
System.out.println(ex.toString());
}
}
//(1)利用Imap显示所有邮件
public void showMessagesByImap() {
try{
Session session = getSessionForImap();
IMAPStore store = (IMAPStore)session.getStore("imap");
store.connect(imapServer,user,password);
Folder folder = null;
folder = store.getDefaultFolder();
if(folder == null)
throw new Exception("No default folder");
// 获取默认文件夹
folder = folder.getFolder("INBOX");
if (folder == null)
throw new Exception("No IMAP INBOX");
// 如果是收件箱
folder.open(Folder.READ_WRITE);
// 使用读写方式打开收件箱
Message[] msgs = folder.getMessages();
// 得到文件夹信息,获取邮件列表
for (int msgNum = 0; msgNum < msgs.length; msgNum++){
printMessage(msgs[msgNum]);
}
// 显示所有邮件信息。
folder.close(true);
// 参数表示是否在删除操作邮件后更新Folder
store.close();
// 关闭store。
} catch (Exception ex){
System.out.println(ex.toString());
}
}
// 打印邮件信息
public static void printMessage(Message message){
try{
String from = ((InternetAddress) message.getFrom()[0]).getPersonal();
if (from == null)
from = ((InternetAddress)message.getFrom()[0]).getAddress();
System.out.println("FROM: " + from);
// 获得发送邮件地址
Date date = message.getSentDate();
System.out.println(date);
//获取发送时间
String subject = message.getSubject();
System.out.println("SUBJECT: " + subject);
// 获取主题
Part messagePart = message;
Object content = messagePart.getContent();
// 获取信息对象
if (content instanceof Multipart){
messagePart = ((Multipart) content).getBodyPart(0);
System.out.println("[ Multipart Message ]");
}
// 附件
String contentType = messagePart.getContentType();
System.out.println("CONTENT:" + contentType);
// 获取content类型
if(contentType.startsWith("text/plain")||contentType.startsWith("text/html")){
InputStream is = messagePart.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String thisLine = reader.readLine();
while (thisLine != null){
System.out.println(thisLine);
thisLine = reader.readLine();
}
}
// 如果邮件内容是纯文本或者是HTML,那么打印出信息
System.out.println("-----------------------------");
}catch (Exception ex){
ex.printStackTrace();
}
}
// (2)利用pop3删除收件箱的第一封邮件,当然也可以用Imap
public void deleteMessage(){
try{
Session session = getSessionForPop3();
Store store = session.getStore("pop3");
store.connect(pop3Server,user,password);
Folder folder = null;
folder = store.getDefaultFolder();
if (folder == null)
throw new Exception("No default folder");
folder = folder.getFolder("INBOX");
if (folder == null)
throw new Exception("No POP3 INBOX");
folder.open(Folder.READ_WRITE);
Message[] msgs = folder.getMessages();
Message message = msgs[0];
// 获取第一封邮件
message.setFlag(Flags.Flag.DELETED,true);
if(message.isSet(Flags.Flag.DELETED))
System.out.println("这封信已被删除,请返回!");
// 删除这一封邮件
folder.close(true);
// 参数表示是否在删除操作邮件后更新Folder
store.close();
}catch(Exception ex){
System.out.println(ex.toString());
}
}
// (3)以imap协议连接,显示邮箱状况
public void showFolderInfo(){
try {
Session session = getSessionForImap();
IMAPStore store = (IMAPStore)session.getStore("imap");
// 以imap协议连接到Store,port:143。
// pop3不支持判断邮件的已读、未读和新邮件标记,只有自己进行判断操作。
store.connect(imapServer,user,password);
Folder folder = null;
folder = store.getDefaultFolder();
if (folder==null)
throw new Exception("No default folder");
folder = folder.getFolder("INBOX");
if (folder == null)
throw new Exception("No IMAP INBOX");
folder.open(Folder.READ_ONLY);
// 以只读方式打开邮件夹
int numberOfTotal = folder.getMessageCount();
// 取得邮箱中总共有多少封信
int numberOfUnread = folder.getUnreadMessageCount();
// 取得邮箱中未读邮件
int numberOfNew = folder.getNewMessageCount();
// 取得邮箱中新邮件
System.out.println("您的邮箱中共有" + numberOfTotal+"封邮件,其中有"+numberOfUnread+"封未读邮件"
+",有"+numberOfNew+"封新邮件");
Message[] messages = folder.getMessages();
int messageNumber = 0;
for(Message message:messages){
System.out.println("发送时间:" + message.getSentDate());
System.out.println("主题:" + message.getSubject());
// System.out.println("内容:" + message.getContent());
Flags flags = message.getFlags();
if (flags.contains(Flags.Flag.SEEN))
System.out.println("这是一封已读邮件");
else {
System.out.println("未读邮件");
}
System.out
.println("========================================================");
//每封邮件都有一个MessageNumber,可以通过邮件的MessageNumber在收件箱里面取得该邮件
messageNumber = message.getMessageNumber();
message = folder.getMessage(messageNumber);
printMessage(message);
}
folder.close(true);
store.close();
}catch(Exception ex){
System.out.println(ex.toString());
}
}
// (4)移动邮件
public void moveMessage(){
try{
Session session = getSessionForImap();
IMAPFolder folder = null;
Folder to_folder = null;
// 获取存储
IMAPStore store = (IMAPStore)session.getStore("imap");
// 连接邮箱服务器
store.connect(imapServer ,user,password);
// 获取收件箱文件夹
folder = (IMAPFolder) store.getFolder("INBOX");
// 以可读可写方式打开邮箱文件夹
folder.open(Folder.READ_WRITE);
to_folder = store.getFolder("newFolder");
// 为了简单起见,移动第1封邮件
Message[] messages = folder.getMessages();
Message[] needCopyMsgs = new Message[1];
needCopyMsgs[0] = messages[0];
// 将获取的邮件对象复制到其他文件夹中
folder.copyMessages(needCopyMsgs, to_folder);
// 移动意味着要把收件箱中原有的邮件删除
messages[0].setFlag(Flags.Flag.DELETED, true);
// 如果文件夹不为空且已经打开就将其关闭
if(folder != null && folder.isOpen()) {
folder.close(true);
}
// 如果其他文件夹不为空着将其关闭
if (to_folder != null && to_folder.isOpen()) {
to_folder.close(true);
}
// 如果存储为空且已经打开就将其关闭
if (store != null && store.isConnected()) {
store.close();
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
//获得附件
public void getAttachment(){
try{
Session session = getSessionForImap();
IMAPStore store = (IMAPStore)session.getStore("imap");
store.connect(imapServer ,user,password);
// 获取收件箱文件夹
IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
//为了简单起见,我默认第1封信为有附件的邮件
Message message = messages[10];
Multipart mp = (Multipart)message.getContent();
//获得BodyPart的数量
int partCount = mp.getCount();
for(int i = 0;i<partCount;i++){
Part part = mp.getBodyPart(i);
storeFile(part);
}
folder.close(true);
store.close();
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
//保存附件
public void storeFile(Part part) throws Exception{
if(part.isMimeType("text/plain")){
System.out.println("This is plain text");
}else if(part.isMimeType("multipart/*")){
System.out.println("This is multipart");
Multipart mm = (Multipart)part.getContent();
for(int i=0;i<mm.getCount();i++){
storeFile(mm.getBodyPart(i));
}
}else if(part.isMimeType("message/rfc822")){
System.out.println("This is message");
storeFile((Part)part.getContent());
}else{
Object object = part.getContent();
String attachmentFileName = "no_name";
if((part.getFileName()!=null)&&!part.getFileName().equals("")){
attachmentFileName = part.getFileName();
}
if(object instanceof String){
System.out.println("This is a string");
}else if(object instanceof InputStream){
System.out.println("This is InputStream:");
InputStream inputStream = (InputStream)object;
FileOutputStream fos = new FileOutputStream("C:\\"+attachmentFileName);
int c;
int count = 0;
while((c = inputStream.read())!=-1){
fos.write(c);
count++;
}
System.out.println("had save C:\\"+attachmentFileName);
}else{
System.out.println("This is an unkown type");
}
}
}
public static void main(String[] args) throws Exception {
TreatMessages treat = new TreatMessages();
treat.getAttachment();
}
}