最近,我開始了一項任務,使用javamail API檢索交換服務器上的電子郵件。但是,有時我無法獲取郵件,因爲Outlook客戶端與郵件服務器同步,因此這些郵件將從服務器中刪除。 有什麼方法可以確保我可以在Outlook同步之前或之後獲取所有新電子郵件。或者我應該嘗試連接到Outlook,如果有,是否有任何可用的免費API?謝謝。如何從outlook中讀取電子郵件
0
A
回答
1
是不是可以將outlook配置爲在服務器上留下消息的副本?我真的不認爲與前景的聯繫是可行的。
0
我有解決方案從Outlook讀取電子郵件。 我們需要提供用戶名,密碼,域名和交換地址:https://webmail.**companynameXYZ**.com/ews/exchange.asmx
。
以下是代碼....我使用這個從某種目的,從未讀郵件下載附件,使其成爲下載後讀取。 注:我們需要的DLL Microsoft.Exchange.WebServices.dll在C#中下載
CODE:
string _username = string.Empty;
string _password = string.Empty;
string _domain = "us";
string _exchange = string.Empty;
_username = ConfigurationSettings.AppSettings["Username"].ToString();
_password = ConfigurationSettings.AppSettings["Pasword"].ToString();
_exchange = ConfigurationSettings.AppSettings["MailServer"].ToString();
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
// service.AutodiscoverUrl("[email protected]");
service.Url = new Uri(_exchange);
service.Credentials = new WebCredentials(_username, _password, _domain);
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(10));
int attachmentCount = 0;
foreach (Item item in findResults.Items)
{
// Bind to an existing message item, requesting its Id property plus its attachments collection.
EmailMessage message = EmailMessage.Bind(service, item.Id);
//read only unread mails and has attachemnts to it.
if ((!message.IsRead) && message.HasAttachments)
{
Console.WriteLine(item.Subject);
#region Iterate through the attachments collection and load each attachment.
foreach (Microsoft.Exchange.WebServices.Data.Attachment attachment in message.Attachments)
{
if (attachment is FileAttachment)
{
FileAttachment fileAttachment = attachment as FileAttachment;
attachmentCount++;
// Load the file attachment into memory and print out its file name.
fileAttachment.Load();
Console.WriteLine("Attachment name: " + fileAttachment.Name);
//create Attachments-folder if not exists.
if (!Directory.Exists(@"C:\Attachments\"))
{
Directory.CreateDirectory(@"C:\Attachments\");
}
// Load attachment contents into a file.
fileAttachment.Load("C:\\attachments\\" + fileAttachment.Name);
}
else // Attachment is an item attachment.
{
// Load attachment into memory and write out the subject.
ItemAttachment itemAttachment = attachment as ItemAttachment;
itemAttachment.Load();
Console.WriteLine("Subject: " + itemAttachment.Item.Subject);
}
}//for inner
#endregion
//mark as READ
message.IsRead = true;
message.Update(ConflictResolutionMode.AlwaysOverwrite);
Console.WriteLine("------------------------");
}//if
}//for outer
0
微軟團隊已經創建EWS-Java的API(Java實現)作爲到替代Microsoft.Exchange.WebServices.dll爲C#實現,而好處是它的開源:
0
Java代碼:
package EWSGetDetailsOffice365;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import microsoft.exchange.webservices.data.Appointment;
import microsoft.exchange.webservices.data.AppointmentSchema;
import microsoft.exchange.webservices.data.CalendarFolder;
import microsoft.exchange.webservices.data.CalendarView;
import microsoft.exchange.webservices.data.EmailMessage;
import microsoft.exchange.webservices.data.ExchangeService;
import microsoft.exchange.webservices.data.ExchangeVersion;
import microsoft.exchange.webservices.data.FindItemsResults;
import microsoft.exchange.webservices.data.Folder;
import microsoft.exchange.webservices.data.IAutodiscoverRedirectionUrl;
import microsoft.exchange.webservices.data.Item;
import microsoft.exchange.webservices.data.ItemId;
import microsoft.exchange.webservices.data.ItemSchema;
import microsoft.exchange.webservices.data.ItemView;
import microsoft.exchange.webservices.data.PropertySet;
import microsoft.exchange.webservices.data.SearchFilter;
import microsoft.exchange.webservices.data.ServiceLocalException;
import microsoft.exchange.webservices.data.WebCredentials;
import microsoft.exchange.webservices.data.WellKnownFolderName;
public class MSExchangeEmailService {
public static class RedirectionUrlCallback implements IAutodiscoverRedirectionUrl {
public boolean autodiscoverRedirectionUrlValidationCallback(String redirectionUrl) {
return redirectionUrl.toLowerCase().startsWith("https://");
}
}
private static ExchangeService service;
private static Integer NUMBER_EMAILS_FETCH =5; // only latest 5 emails/appointments are fetched.
/**
* Firstly check, whether "https://webmail.xxxx.com/ews/Services.wsdl" and "https://webmail.xxxx.com/ews/Exchange.asmx"
* is accessible, if yes that means the Exchange Webservice is enabled on your MS Exchange.
*/
static{
try{
service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
//service.setUrl(new URI("https://webmail.xxxx.com/ews/Exchange.asmx"));
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* Initialize the Exchange Credentials.
* Don't forget to replace the "USRNAME","PWD","DOMAIN_NAME" variables.
*/
public MSExchangeEmailService() {
service.setCredentials(new WebCredentials("[email protected]", "1234"));
try {
service.autodiscoverUrl("[email protected]", new RedirectionUrlCallback());
} catch (Exception ex) {
Logger.getLogger(MSExchangeEmailService.class.getName()).log(Level.SEVERE, null, ex);
}
service.setTraceEnabled(true);
}
/**
* Reading one email at a time. Using Item ID of the email.
* Creating a message data map as a return value.
*/
public Map readEmailItem(ItemId itemId){
Map messageData = new HashMap();
try{
Item itm = Item.bind(service, itemId, PropertySet.FirstClassProperties);
EmailMessage emailMessage = EmailMessage.bind(service, itm.getId());
messageData.put("emailItemId", emailMessage.getId().toString());
messageData.put("subject", emailMessage.getSubject().toString());
messageData.put("fromAddress",emailMessage.getFrom().getAddress().toString());
messageData.put("senderName",emailMessage.getSender().getName().toString());
Date dateTimeCreated = emailMessage.getDateTimeCreated();
messageData.put("SendDate",dateTimeCreated.toString());
Date dateTimeRecieved = emailMessage.getDateTimeReceived();
messageData.put("RecievedDate",dateTimeRecieved.toString());
messageData.put("Size",emailMessage.getSize()+"");
messageData.put("emailBody",emailMessage.getBody().toString());
}catch (Exception e) {
e.printStackTrace();
}
return messageData;
}
/**
* Number of email we want to read is defined as NUMBER_EMAILS_FETCH,
*/
public List readEmails(){
List msgDataList = new ArrayList();
try{
Folder folder = Folder.bind(service, WellKnownFolderName.Inbox);
FindItemsResults<Item> results = service.findItems(folder.getId(), new ItemView(NUMBER_EMAILS_FETCH));
int i =1;
for (Item item : results){
Map messageData = new HashMap();
messageData = readEmailItem(item.getId());
System.out.println("\nEmails #" + (i++) + ":");
System.out.println("subject : " + messageData.get("subject").toString());
System.out.println("Sender : " + messageData.get("senderName").toString());
msgDataList.add(messageData);
}
}catch (Exception e) {
e.printStackTrace();
}
return msgDataList;
}
/**
* Reading one appointment at a time. Using Appointment ID of the email.
* Creating a message data map as a return value.
*/
public Map readAppointment(Appointment appointment){
Map appointmentData = new HashMap();
try {
appointmentData.put("appointmentItemId", appointment.getId().toString());
appointmentData.put("appointmentSubject", appointment.getSubject());
appointmentData.put("appointmentStartTime", appointment.getStart()+"");
appointmentData.put("appointmentEndTime", appointment.getEnd()+"");
//appointmentData.put("appointmentBody", appointment.getBody().toString());
} catch (ServiceLocalException e) {
e.printStackTrace();
}
return appointmentData;
}
/**
*Number of Appointments we want to read is defined as NUMBER_EMAILS_FETCH,
* Here I also considered the start data and end date which is a 30 day span.
* We need to set the CalendarView property depending upon the need of ours.
*/
public List readAppointments(){
List apntmtDataList = new ArrayList();
Calendar now = Calendar.getInstance();
Date startDate = Calendar.getInstance().getTime();
now.add(Calendar.DATE, 30);
Date endDate = now.getTime();
try{
CalendarFolder calendarFolder = CalendarFolder.bind(service, WellKnownFolderName.Calendar, new PropertySet());
CalendarView cView = new CalendarView(startDate, endDate, 5);
cView.setPropertySet(new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End));// we can set other properties as well depending upon our need.
//FindItemsResults appointments = calendarFolder.findAppointments(cView);
FindItemsResults<Appointment> appointments = calendarFolder.findAppointments(cView);
System.out.println("|------------------> Appointment count = " + appointments.getTotalCount());
int i =1;
//List appList = appointments.getItems();
for (Appointment appointment : appointments.getItems()) {
System.out.println("\nAPPOINTMENT #" + (i++) + ":");
Map appointmentData = new HashMap();
appointmentData = readAppointment(appointment);
System.out.println("subject : " + appointmentData.get("appointmentSubject").toString());
System.out.println("On : " + appointmentData.get("appointmentStartTime").toString());
apntmtDataList.add(appointmentData);
}
}catch (Exception e) {
e.printStackTrace();
}
return apntmtDataList;
}
public static void getAllMeetings() throws Exception {
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = formatter.parse("2016-01-01 00:00:00");
SearchFilter filter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.LastModifiedTime,startDate);
FindItemsResults<Item> findResults = service.findItems(WellKnownFolderName.Calendar, filter, new ItemView(1000));
System.out.println("|------------------> meetings count = " + findResults.getTotalCount());
for (Item item : findResults.getItems())
{
Appointment appt = (Appointment)item;
//appt.setStartTimeZone();
System.out.println("TimeZone====="+appt.getTimeZone());
System.out.println("SUBJECT====="+appt.getSubject());
System.out.println("Location========"+appt.getLocation());
System.out.println("Start Time========"+appt.getStart());
System.out.println("End Time========"+appt.getEnd());
System.out.println("Email Address========"+ appt.getOrganizer().getAddress());
System.out.println("Last Modified Time========"+appt.getLastModifiedTime());
System.out.println("Last Modified Time========"+appt.getLastModifiedName());
System.out.println("*************************************************\n");
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
public static void main(String[] args) {
MSExchangeEmailService msees = new MSExchangeEmailService();
//msees.readEmails();
//msees.readAppointments();
try {
msees.getAllMeetings();
} catch (Exception ex) {
Logger.getLogger(MSExchangeEmailService.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
相關問題
- 1. 如何從Clutter outlook文件夾中讀取電子郵件C#
- 2. 從本地電腦的Outlook中讀取電子郵件
- 3. 如何從Outlook電子郵件中提取互聯網電子郵件標題?
- 4. 從Outlook子文件夾讀取電子郵件
- 5. C# - 從Outlook中的非默認帳戶讀取電子郵件
- 6. 從asp.net中的其他服務器讀取Outlook電子郵件
- 7. 從outlook通過powershell讀取MSG文件..如何獲取電子郵件地址?
- 8. 如何讀取從當前的電子郵件的電子郵件簽名在Outlook插件形式的區域?
- 9. 如何從outlook中獲取電子郵件地址?
- 10. 如何從Outlook 2007中獲取發送電子郵件地址
- 11. 如何從Outlook 2007中提取電子郵件的內容?
- 12. 從C#讀取Outlook郵件#
- 13. 如何從Outlook中使用javax.mail pop3獲取未讀電子郵件
- 14. 如何從Outlook獲取發件人的電子郵件地址?
- 15. AccessViolationException讀取Outlook 2007中的電子郵件發件人
- 16. 使用VBA從Outlook電子郵件正文中提取電子郵件地址?
- 17. 如何使用Excel VBA讀取Outlook中的共享電子郵件中的電子郵件
- 18. 如何從回覆中獲取/讀取電子郵件ID
- 19. 如何從MS Outlook 2010獲取電子郵件地址?
- 20. 讀取多個Outlook電子郵件在C#中
- 21. microsoft outlook如何從我屬於的電子郵件組發送電子郵件?
- 22. Excel VBA代碼從底部的收件箱中讀取Outlook電子郵件
- 23. C#:如何查看Outlook電子郵件
- 24. 如何從Outlook中的電子郵件正文提取電話號碼?
- 25. Android,從SDK讀取電子郵件
- 26. 從Outlook電子郵件中提取msg附件
- 27. 獲取outlook電子郵件的屬性
- 28. 從MS Outlook的未讀電子郵件下載附件
- 29. 在Outlook中讀取Outlook郵件
- 30. 如何從Outlook REST API中的特定電子郵件地址獲取電子郵件?
感謝您的回覆,有很多郵件大附件的每一天的到來,我恐怕就會變成一個的chanllenge到服務器。 – user737570 2011-05-04 08:41:21
如何在Outlook中配置郵件規則將郵件移動到其他文件夾(但將其保留在服務器上),您可以處理該文件夾中的所有郵件,並在處理它們後將其從服務器中刪除? – Pleun 2011-05-04 14:23:06
@Pleun,你的意思是Outlook文件夾?如何從Outlook收件箱文件夾讀取? – 2012-01-05 14:52:02