郵件操作總結(Exchange、POP3)
阿新 • • 發佈:2019-01-03
總結下幾年前寫過的,操作郵件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 = "[email protected]*.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<String> to, List<String> 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<String> to, List<String> 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<String> list = new ArrayList<String>(); FindItemsResults<Item> 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<SearchFilter> searchFilterCollection = new ArrayList<SearchFilter>(); 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<String> to = new ArrayList<String>(); 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<Item> findResults = service.findItems(inbox.getId(), view); for (Item item : findResults.getItems()) { EmailMessage message = EmailMessage.bind(service, item.getId()); List<Attachment> 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<Item> 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]);
}
}
}