总结下几年前写过的,操作邮件Exchange、POP3协议的demo
Exchange:
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.BodyType;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.enumeration.search.LogicalOperator;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.core.service.folder.Folder;
import microsoft.exchange.webservices.data.property.complex.Attachment;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.search.ItemView;
import microsoft.exchange.webservices.data.search.filter.SearchFilter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sunjun on 2016/9/21.
*/
public class ExchangeMailTest {
// private static String username = "[email protected]";
private static String username = "scf_dc@*.local";
private static String password = "*@2016.07";
private static String demand = "mail.*.com";// 邮件服务器
// private static String demand = "mail.*.com";// 邮件服务器
private static ExchangeService service;
/**
* 初始化连接
* */
private static void init(){
service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
ExchangeCredentials credentials = new WebCredentials(username,password);
service.setCredentials(credentials);
try {
service.setUrl(new URI("https://" + "mail.jd.com" + "/EWS/Exchange.asmx"));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 使用Exchange协议发送
* @param subject 邮件主题
* @param to 收件人
* @param cc 抄送
* @param bobytext 正文
* @param realPath 附件
*
* @throws Exception
*/
public static void doSend(String subject, List to, List cc,
String bodyText, String realPath) throws Exception {
EmailMessage msg = new EmailMessage(service);
msg.setSubject(subject);
MessageBody body = MessageBody.getMessageBodyFromText(bodyText);
body.setBodyType(BodyType.Text);
msg.setBody(body);
for (String s : to) {
msg.getToRecipients().add(s);
}
// for (String s : cc) {
// msg.getCcRecipients().add(s);
// }
if (realPath != null && !"".equals(realPath)) {
msg.getAttachments().addFileAttachment(realPath);
}
msg.send();
}
public static void send(String subject, List to, List cc,
String bodyText) throws Exception {
doSend(subject, to, cc, bodyText, null);
}
/**
* 使用Exchange协议接收邮件
*
* @throws Exception
*/
public static void GetUnreadEmails() throws Exception {
ItemView view = new ItemView(Integer.MAX_VALUE);
List list = new ArrayList();
FindItemsResults- unRead = Folder.bind(service, WellKnownFolderName.Inbox).findItems(SetFilter(), view);
System.out.println("unRead:" + unRead.getItems().size());
for (Item item : unRead.getItems()) {
if (item.getSubject() != null) {
list.add(item.getSubject().toString());
} else {
list.add("无标题");
}
// list.Add(item.DateTimeSent.ToString());
}
// int unRead1=Folder.bind(service, WellKnownFolderName.Inbox).getUnreadCount(); //未读邮件数量
System.out.println("未读邮件数量"+Folder.bind(service, WellKnownFolderName.Inbox).getUnreadCount());
}
/**
* 设置获取什么类型的邮件
*
* @throws Exception
*/
private static SearchFilter SetFilter() {
List
searchFilterCollection = new ArrayList();
searchFilterCollection.add(new SearchFilter.IsEqualTo(
EmailMessageSchema.IsRead, false));
SearchFilter s = new SearchFilter.SearchFilterCollection(
LogicalOperator.And,searchFilterCollection);
// 如果要获取所有邮件的话代码改成这样:
// searchFilterCollection.add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
// searchFilterCollection.add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, true));
// SearchFilter s = new SearchFilter.SearchFilterCollection(LogicalOperator.Or,searchFilterCollection);
return s;
}
public static void main(String[] args) throws Exception {
init();
List to = new ArrayList();
to.add("*@jd.com");
to.add("*@163.com");
send("test",to,null,"hello");
GetUnreadEmails();
receive("", 5200);
}
/**
*
* ______________________________________________
*/
/**
serverName 接收邮件地址
user 用户信息
pwd 密码
path 邮件临时储存路径
max 每次接收邮件的最大数量
**/
public static void receive(String path, int max) throws Exception {
//绑定邮箱
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
//获取邮箱文件数量
int count = inbox.getTotalCount();
if(max > 0) count = count > max ? max : count;
//循环获取邮箱邮件
ItemView view = new ItemView(count);
FindItemsResults- findResults = service.findItems(inbox.getId(), view);
for (Item item : findResults.getItems()) {
EmailMessage message = EmailMessage.bind(service, item.getId());
List
attachs = message.getAttachments().getItems();//
System.out.println("id-->" + message.getId());
System.out.println("sender-->" + message.getSender());
System.out.println("sub-->" + item.getSubject());
// System.out.println("body-->" + message.getBody());
System.out.println("===========End=============" );
//处理附件
// try{
// if(message.getHasAttachments()){
// for(Attachment f : attachs){
// if(f instanceof FileAttachment){
// //接收邮件到临时目录
// File tempZip = new File(path,f.getName());
// ((FileAttachment)f).load(tempZip.getPath());
// }
// }
// //删除邮件
//// message.delete(DeleteMode.HardDelete);
// }
// }catch(Exception err){
// }
}
}
public static void receive(){
try {
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
ExchangeCredentials credentials = new WebCredentials("*@*.local", "*@*.07");
service.setCredentials(credentials);
service.setUrl(new URI("https://" + "mail.*.com" + "/EWS/Exchange.asmx"));
// Bind to the Inbox.
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);//获取邮箱文件数量
int count = inbox.getTotalCount();
System.out.println(count);
System.out.println(inbox.getDisplayName());
ItemView view = new ItemView(10);
FindItemsResults- findResults = service.findItems(inbox.getId(), view);
for (Item item : findResults.getItems()) {
EmailMessage message = EmailMessage.bind(service, item.getId());
System.out.println("id-->" + message.getId());
System.out.println("sender-->" + message.getSender());
System.out.println("sub-->" + item.getSubject());
// System.out.println("body-->" + message.getBody());
System.out.println("===========End=============" );
}
} catch (Exception e) {
System.out.println("===========" + e.getMessage());
}
}
}
POP3:
import com.jr.gyl.pledge.base.common.mail.MailAuthenticator;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
/**
* @author yh
*
*/
public class ShowMail {
private MimeMessage mimeMessage = null;
private String saveAttachPath = ""; // 附件下载后的存放目录
private StringBuffer bodyText = new StringBuffer(); // 存放邮件内容的StringBuffer对象
private String dateFormat = "yy-MM-dd HH:mm"; // 默认的日前显示格式
/**
* 构造函数,初始化一个MimeMessage对象
*/
public ShowMail() {
}
public ShowMail(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
System.out.println("创建一个ReceiveEmail对象....");
}
public void setMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
System.out.println("设置一个MimeMessage对象...");
}
/**
* *获得发件人的地址和姓名
*/
public String getFrom() throws Exception {
InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
String from = address[0].getAddress();
if (from == null) {
from = "";
System.out.println("无法知道发送者.");
}
String personal = address[0].getPersonal();
if (personal == null) {
personal = "";
System.out.println("无法知道发送者的姓名.");
}
String fromAddr = null;
if (personal != null || from != null) {
fromAddr = personal + "<" + from + ">";
System.out.println("发送者是:" + fromAddr);
} else {
System.out.println("无法获得发送者信息.");
}
return fromAddr;
}
/**
* *获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同
* *"to"----收件人"cc"---抄送人地址"bcc"---密送人地址
*/
public String getMailAddress(String type) throws Exception {
String mailAddr = "";
String addType = type.toUpperCase();
InternetAddress[] address = null;
if (addType.equals("TO") || addType.equals("CC")
|| addType.equals("BCC")) {
if (addType.equals("TO")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.TO);
} else if (addType.equals("CC")) {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.CC);
} else {
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.BCC);
}
if (address != null) {
for (int i = 0; i < address.length; i++) {
String emailAddr = address[i].getAddress();
if (emailAddr == null) {
emailAddr = "";
} else {
System.out.println("转换之前的emailAddr: " + emailAddr);
emailAddr = MimeUtility.decodeText(emailAddr);
System.out.println("转换之后的emailAddr: " + emailAddr);
}
String personal = address[i].getPersonal();
if (personal == null) {
personal = "";
} else {
System.out.println("转换之前的personal: " + personal);
personal = MimeUtility.decodeText(personal);
System.out.println("转换之后的personal: " + personal);
}
String compositeto = personal + "<" + emailAddr + ">";
System.out.println("完整的邮件地址:" + compositeto);
mailAddr += "," + compositeto;
}
mailAddr = mailAddr.substring(1);
}
} else {
throw new Exception("错误的电子邮件类型!");
}
return mailAddr;
}
/**
* *获得邮件主题
*/
public String getSubject() throws MessagingException {
String subject = "";
try {
System.out.println("转换前的subject:" + mimeMessage.getSubject());
subject = MimeUtility.decodeText(mimeMessage.getSubject());
System.out.println("转换后的subject: " + mimeMessage.getSubject());
if (subject == null) {
subject = "";
}
} catch (Exception exce) {
exce.printStackTrace();
}
return subject;
}
/**
* *获得邮件发送日期
*/
public String getSentDate() throws Exception {
Date sentDate = mimeMessage.getSentDate();
System.out.println("发送日期 原始类型: " + dateFormat);
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
String strSentDate = format.format(sentDate);
System.out.println("发送日期 可读类型: " + strSentDate);
return strSentDate;
}
/**
* *获得邮件正文内容
*/
public String getBodyText() {
return bodyText.toString();
}
/**
* *解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件
* *主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
*/
public void getMailContent(Part part) throws Exception {
String contentType = part.getContentType();
// 获得邮件的MimeType类型
System.out.println("邮件的MimeType类型: " + contentType);
int nameIndex = contentType.indexOf("name");
boolean conName = false;
if (nameIndex != -1) {
conName = true;
}
System.out.println("邮件内容的类型:" + contentType);
if (part.isMimeType("text/plain") && conName == false) {
// text/plain 类型
bodyText.append((String) part.getContent());
} else if (part.isMimeType("text/html") && conName == false) {
// text/html 类型
bodyText.append((String) part.getContent());
} else if (part.isMimeType("multipart/*")) {
// multipart/*
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
getMailContent(multipart.getBodyPart(i));
}
} else if (part.isMimeType("message/rfc822")) {
// message/rfc822
getMailContent((Part) part.getContent());
} else {
}
}
/**
* *判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
*/
public boolean getReplySign() throws MessagingException {
boolean replySign = false;
String needReply[] = mimeMessage
.getHeader("Disposition-Notification-To");
if (needReply != null) {
replySign = true;
}
if (replySign) {
System.out.println("该邮件需要回复");
} else {
System.out.println("该邮件不需要回复");
}
return replySign;
}
/**
*获得此邮件的Message-ID
*/
public String getMessageId() throws MessagingException {
String messageID = mimeMessage.getMessageID();
System.out.println("邮件ID: " + messageID);
return messageID;
}
/**
* 判断此邮件是否已读,如果未读返回false,反之返回true
*/
public boolean isNew() throws MessagingException {
boolean isNew = false;
Flags flags = ((Message) mimeMessage).getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
System.out.println("flags的长度:" + flag.length);
for (int i = 0; i < flag.length; i++) {
if (flag[i] == Flags.Flag.SEEN) {
isNew = true;
System.out.println("seen email...");
// break;
}
}
return isNew;
}
/**
* 判断此邮件是否包含附件
*/
public boolean isContainAttach(Part part) throws Exception {
boolean attachFlag = false;
// String contentType = part.getContentType();
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mPart = mp.getBodyPart(i);
String disposition = mPart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE))))
attachFlag = true;
else if (mPart.isMimeType("multipart/*")) {
attachFlag = isContainAttach((Part) mPart);
} else {
String conType = mPart.getContentType();
if (conType.toLowerCase().indexOf("application") != -1)
attachFlag = true;
if (conType.toLowerCase().indexOf("name") != -1)
attachFlag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachFlag = isContainAttach((Part) part.getContent());
}
return attachFlag;
}
/**
* *保存附件
*/
public void saveAttachMent(Part part) throws Exception {
String fileName = "";
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mPart = mp.getBodyPart(i);
String disposition = mPart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))) {
fileName = mPart.getFileName();
if (fileName.toLowerCase().indexOf("gb2312") != -1) {
fileName = MimeUtility.decodeText(fileName);
}
saveFile(fileName, mPart.getInputStream());
} else if (mPart.isMimeType("multipart/*")) {
saveAttachMent(mPart);
} else {
fileName = mPart.getFileName();
if ((fileName != null)
&& (fileName.toLowerCase().indexOf("GB2312") != -1)) {
fileName = MimeUtility.decodeText(fileName);
saveFile(fileName, mPart.getInputStream());
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent());
}
}
/**
*设置附件存放路径
*/
public void setAttachPath(String attachPath) {
this.saveAttachPath = attachPath;
}
/**
* *设置日期显示格式
*/
public void setDateFormat(String format) throws Exception {
this.dateFormat = format;
}
/**
* *获得附件存放路径
*/
public String getAttachPath() {
return saveAttachPath;
}
/**
* *真正的保存附件到指定目录里
*/
private void saveFile(String fileName, InputStream in) throws Exception {
String osName = System.getProperty("os.name");
String storeDir = getAttachPath();
String separator = "";
if (osName == null) {
osName = "";
}
if (osName.toLowerCase().indexOf("win") != -1) {
separator = "\\";
if (storeDir == null || storeDir.equals(""))
storeDir = "c:\\tmp";
} else {
separator = "/";
storeDir = "/tmp";
}
File storeFile = new File(storeDir + separator + fileName);
System.out.println("附件的保存地址:" + storeFile.toString());
// for(inti=0;storefile.exists();i++){
// storefile=newFile(storedir+separator+fileName+i);
// }
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(storeFile));
bis = new BufferedInputStream(in);
int c;
while ((c = bis.read()) != -1) {
bos.write(c);
bos.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
throw new Exception("文件保存失败!");
} finally {
bos.close();
bis.close();
}
}
/**
*ReceiveEmail类测试
*/
public static void main(String args[]) throws Exception {
// String host = "smtp.jd.com";
String host = "pop3.jd.com";
String username = "[email protected]";
String password = "[email protected]";
Properties props = new Properties();
// Session session = Session.getDefaultInstance(props, null);
// 初始化props
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
// 验证
MailAuthenticator authenticator = new MailAuthenticator(username, password);
// 创建session
Session session = Session.getInstance(props, authenticator);
Store store = session.getStore("pop3");
store.connect(host, username, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();
System.out.println("邮件数量:" + message.length);
ShowMail re = null;
for (int i = 0; i < message.length; i++) {
re = new ShowMail((MimeMessage) message[i]);
System.out.println("邮件" + i + "主题:" + re.getSubject());
System.out.println("邮件" + i + "发送时间:" + re.getSentDate());
System.out.println("邮件" + i + "是否需要回复:" + re.getReplySign());
System.out.println("邮件" + i + "是否已读:" + re.isNew());
System.out.println("邮件" + i + "是否包含附件:" + re.isContainAttach((Part) message[i]));
System.out.println("邮件" + i + "发送人地址:" + re.getFrom());
System.out.println("邮件" + i + "收信人地址:" + re.getMailAddress("to"));
System.out.println("邮件" + i + "抄送:" + re.getMailAddress("cc"));
System.out.println("邮件" + i + "暗抄:" + re.getMailAddress("bcc"));
re.setDateFormat("yy年MM月dd日HH:mm");
System.out.println("邮件" + i + "发送时间:" + re.getSentDate());
System.out.println("邮件" + i + "邮件ID:" + re.getMessageId());
re.getMailContent((Part) message[i]);
System.out.println("邮件" + i + "正文内容:\r\n" + re.getBodyText());
re.setAttachPath("e:\\");
re.saveAttachMent((Part) message[i]);
}
}
}