- > GetEventList(string userEmail, DateTime startDate, DateTime endDate, string timeZone, HttpRequestMessage request, string bodyData)
{
GetAccessToken(userEmail);
MdResultT1
- originalItems = tmpEws.FindItems(WellKnownFolderName.Calendar, filter, view);
if (originalItems.TotalCount > 0)
{
PropertySet propSet = new PropertySet(BasePropertySet.FirstClassProperties);
propSet.Add(resourceNameProp);
Appointment originalAppt = Appointment.Bind(tmpEws, originalItems.Items[0].Id, propSet);
resourceName = GetResourceNmFromSentItems(tmpEws, originalAppt, resourceNameProp);
}
}
}
catch (Exception)
{
}
}
}
catch (Exception ex)
{
ComHelper.WriteErrorLog(ex, $"writetUserEmail={wEmail}, askUserEmail={uEmail}", "GetResourceName");
}
return resourceName ?? string.Empty;
}
private string GetResourceNmFromSentItems(ExchangeService _service, Appointment appt, ExtendedPropertyDefinition resourceNameProp)
{
string resourceName = string.Empty;
try
{
if (string.IsNullOrEmpty(appt.Organizer?.Address))
return resourceName;
SearchFilter filter = new SearchFilter.IsEqualTo(EmailMessageSchema.Subject, appt.Subject);
ItemView view = new ItemView(10); // 최대 10개 조회
view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
view.PropertySet.Add(resourceNameProp);
FindItemsResults
- results = _service.FindItems(WellKnownFolderName.SentItems, filter, view); foreach (EmailMessage msg in results.OfType
()) { if (msg.Sender?.Address?.Equals(appt.Organizer.Address, StringComparison.OrdinalIgnoreCase) == true) { if (msg.TryGetProperty(resourceNameProp, out resourceName)) { break; } } } } catch (Exception ex) { // 로그 남기기 ComHelper.WriteErrorLog(ex, "", "GetResourceNameFromSentItems"); } return resourceName; } #endregion #region 메일 발송 public MdResultBase SendMail(string userEmail, string senderEmail, List<(string Name, string Email)> toRct, List<(string Name, string Email)> ccRct, string subject, string body, string bodyType) { GetAccessToken(userEmail); MdResultBase rBase = new MdResultBase(false, "", ""); List rstList = new List (); if (mEws == null) { ComHelper.WriteErrorLog(new Exception(), senderEmail, "E_R033"); return rBase.SetRst(false, "Ews 권한획득에 실패하였습니다.", ""); } try { EmailMessage email = new EmailMessage(mEws); email.Subject = subject; email.Body = new MessageBody(BodyType.HTML, body); // To 수신자 추가 (이름 + 이메일) foreach (var recipient in toRct) { email.ToRecipients.Add(new EmailAddress(recipient.Name, recipient.Email)); } foreach (var recipient in ccRct) { email.CcRecipients.Add(new EmailAddress(recipient.Name, recipient.Email)); } email.Send(); // 메일발송 (보낸편지함에 저장 안함) //email.SendAndSaveCopy(); //메일발송 후 보낸편지함에 저장 rBase.SetRst(true, "메일발송을 완료하였습니다."); } catch (Exception ex) { ComHelper.WriteErrorLog(ex, senderEmail, "E_R034"); rBase.SetRst(false, "메일발송에 실패하였습니다.", "", ex.Message); } return rBase; } public MdResultBase SendMail(string userEmail, string senderEmail, List toRct, List ccRct, string subject, string body, string bodyType) { GetAccessToken(userEmail); MdResultBase rBase = new MdResultBase(false, "", ""); if (mEws == null) { ComHelper.WriteErrorLog(new Exception(), senderEmail, "E_R035"); return rBase.SetRst(false, "Ews 권한획득에 실패하였습니다.", ""); } try { EmailMessage email = new EmailMessage(mEws); email.Subject = subject; email.Body = new MessageBody(BodyType.HTML, body); // To 수신자 추가 (이름 + 이메일) foreach (MdRscAttendee recipient in toRct) { email.ToRecipients.Add(new EmailAddress(recipient.userNm, recipient.mail)); } foreach (MdRscAttendee recipient in ccRct) { email.CcRecipients.Add(new EmailAddress(recipient.userNm, recipient.mail)); } email.Send(); // 메일발송 (보낸편지함에 저장 안함) //email.SendAndSaveCopy(); //메일발송 후 보낸편지함에 저장 rBase.SetRst(true, "메일발송을 완료하였습니다."); } catch (Exception ex) { ComHelper.WriteErrorLog(ex, senderEmail, "E_R036"); rBase.SetRst(false, "메일발송에 실패하였습니다.", "", ex.Message); } return rBase; } #endregion } } ------------------------------------------------------------------------------------------------ using Microsoft.Exchange.WebServices.Data; using Microsoft.Identity.Client; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RestApi.Models; using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using System.Web.Http.Results; namespace RestApi.Services { public class GraphHelper { private string _GraphTenantID; private string _GraphClientID; private string _GraphClientSecret; private string _GraphAuthority; private string[] _GraphScope; private string _Endpoint; private string _AccessToken; #region 생성자 기초데이터터 획득 public GraphHelper() { _GraphTenantID = ConfigurationManager.AppSettings["GraphTenantID"]; _GraphClientID = ConfigurationManager.AppSettings["GraphClientID"]; _GraphClientSecret = ConfigurationManager.AppSettings["GraphClientSecret"]; _GraphAuthority = $"https://login.microsoftonline.com/{_GraphTenantID}"; _GraphScope = new[] { ConfigurationManager.AppSettings["GraphScope"] }; //_GraphGrantType = ConfigurationManager.AppSettings["GraphGrantType"]; } #endregion #region Graph 권한 획득 public async Task GetAccessTokenAsync(string userEmail) { if (string.IsNullOrWhiteSpace(_AccessToken)) { try { _Endpoint = $"https://graph.microsoft.com/v1.0/users/{userEmail}/events"; var app = ConfidentialClientApplicationBuilder.Create(_GraphClientID).WithClientSecret(_GraphClientSecret).WithAuthority(new Uri(_GraphAuthority)).Build(); var result = await app.AcquireTokenForClient(_GraphScope).ExecuteAsync(); _AccessToken = result.AccessToken; } catch (Exception ex) { ComHelper.WriteErrorLog(ex, userEmail, "E_R041"); } } return _AccessToken; } #endregion #region 일정 등록 public async Task > CreateEventAsync(string userEmail, string subject, string cttsType, string ctts, DateTime startDate, DateTime endDate, string timeZone , string location, string recName, int reminderMinutes, string sensitivity, string importance, JArray attendees, bool isDetail, HttpRequestMessage request, string bodyData, string tmpLog) { await GetAccessTokenAsync(userEmail); MdResultT1 rstAt = new MdResultT1 (false, ""); string scheduleID = ""; if (string.IsNullOrWhiteSpace(_AccessToken)) { rstAt.message = "M365 권한획득에 실패하였습니다."; ComHelper.WriteErrorLog(rstAt.message, request, bodyData, "E_R042"); return rstAt; } string tmpPoint = _Endpoint; try { JObject newEvent = new JObject(); newEvent["subject"] = subject; newEvent["body"] = new JObject { ["contentType"] = cttsType, ["content"] = ctts }; newEvent["start"] = new JObject { ["dateTime"] = startDate.ToString("yyyy-MM-ddTHH:mm:ss"), ["timeZone"] = timeZone }; newEvent["end"] = new JObject { ["dateTime"] = endDate.ToString("yyyy-MM-ddTHH:mm:ss"), ["timeZone"] = timeZone }; newEvent["importance"] = importance; // 중요도 설정 newEvent["sensitivity"] = sensitivity; // 민감도 설정 newEvent["reminderMinutesBeforeStart"] = reminderMinutes; // 몇분전 전에 알림 newEvent["isAllDay"] = false; // 하루 종일 일정이 아님 //newEvent["categories"] = new JArray { "Red category" }; // Outlook에서 설정한 카테고리 이름 //newEvent["showAs"] = "busy"; // 바쁨 상태로 표시 newEvent["location"] = new JObject { ["displayName"] = location }; /* 속성 저장 newEvent["singleValueExtendedProperties"] = new JArray { new JObject { ["id"] = "String {00020329-0000-0000-C000-000000000046} Name ResourceName", ["value"] = recName } }; */ if (attendees != null && attendees.Count > 0) { try { JArray formattedAttendees = new JArray(); foreach (JObject itm in attendees) { string name = itm["attedName"].ToString(); string email = itm["attedEmail"].ToString(); string type = itm["attedType"].ToString(); JObject formattedAttendee = new JObject { ["emailAddress"] = new JObject { ["address"] = email, ["name"] = name }, ["type"] = type.ToLower() }; formattedAttendees.Add(formattedAttendee); } newEvent["attendees"] = formattedAttendees; } catch (Exception ex1) { ComHelper.WriteErrorLog(ex1, request, bodyData, "E_R043"); rstAt.message = "참석자 정보 필수값이 없습니다. 확인하여 주세요.[M365]"; return rstAt; } } using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); var sendJson = JsonConvert.SerializeObject(newEvent, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); var content = new StringContent(newEvent.ToString(), Encoding.UTF8, "application/json"); var response = await client.PostAsync(tmpPoint, content); string result = await response.Content.ReadAsStringAsync(); rstAt.success = response.IsSuccessStatusCode; if (response.IsSuccessStatusCode) { // JSON 파싱 var jsonResult = JObject.Parse(result); if (string.IsNullOrWhiteSpace(jsonResult["id"].ToString()) == false) { scheduleID = jsonResult["id"].ToString();// 이벤트 ID 가져오기 rstAt.key = scheduleID; if (isDetail) { MdResultT1 tmpAt = await GetEventDetailAsync(userEmail, rstAt.key, timeZone, request, bodyData); rstAt.data = tmpAt.data; } } } else { rstAt.message = "M365 일정등록에 실패하였습니다."; rstAt.exmsg = result; ComHelper.WriteErrorLog(result, request, bodyData, "E_R044"); } } } catch (Exception ex2) { rstAt.message = "M365 일정등록에 실패하였습니다."; rstAt.exmsg = ex2.Message; ComHelper.WriteErrorLog(ex2, request, bodyData, "E_R045"); } finally { string strLog = $"userEmail:{userEmail}{Environment.NewLine}subject:{subject}{Environment.NewLine}cttsType:{cttsType}{Environment.NewLine}location:{location}{Environment.NewLine}{tmpLog}{Environment.NewLine}scheduleID : {scheduleID}"; ComHelper.WriteTextLog(request, bodyData, strLog, ""); } return rstAt; } #endregion #region 일정 수정 public async Task > UpdateEventAsync(string userEmail, string evtID, string subject, string cttsType, string ctts, DateTime startDate, DateTime endDate, string timeZone , string location, string recName, int reminderMinutes, string sensitivity, string importance, JArray attendees, bool isDetail, HttpRequestMessage request, string bodyData, string tmpLog) { string strLog = $"evtID:{evtID}{Environment.NewLine}userEmail:{userEmail}{Environment.NewLine}subject:{subject}{Environment.NewLine}cttsType:{cttsType}{Environment.NewLine}location:{location}{Environment.NewLine}" + tmpLog; ComHelper.WriteTextLog(request, bodyData, strLog, ""); await GetAccessTokenAsync(userEmail); string tmpPoint = $"{_Endpoint}/{evtID}"; MdResultT1 rstAt = new MdResultT1 (false, ""); if (string.IsNullOrWhiteSpace(_AccessToken)) { rstAt.message = "M365 권한획득에 실패하였습니다."; ComHelper.WriteErrorLog(rstAt.message, request, bodyData, "E_R046"); return rstAt; } try { JObject newEvent = new JObject(); newEvent["subject"] = subject; newEvent["body"] = new JObject { ["contentType"] = cttsType, ["content"] = ctts }; newEvent["start"] = new JObject { ["dateTime"] = startDate.ToString("yyyy-MM-ddTHH:mm:ss"), ["timeZone"] = timeZone }; newEvent["end"] = new JObject { ["dateTime"] = endDate.ToString("yyyy-MM-ddTHH:mm:ss"), ["timeZone"] = timeZone }; newEvent["importance"] = importance; // 중요도 설정 newEvent["sensitivity"] = sensitivity; // 민감도 설정 newEvent["reminderMinutesBeforeStart"] = reminderMinutes; // 몇분전 전에 알림 newEvent["isAllDay"] = false; // 하루 종일 일정이 아님 //newEvent["categories"] = new JArray { "Red category" }; // Outlook에서 설정한 카테고리 이름 //newEvent["showAs"] = "busy"; // 바쁨 상태로 표시 newEvent["location"] = new JObject { ["displayName"] = location }; /* 속성 저장 newEvent["singleValueExtendedProperties"] = new JArray { new JObject { ["id"] = "String {00020329-0000-0000-C000-000000000046} Name ResourceName", ["value"] = recName } }; */ if (attendees != null && attendees.Count == 0) { newEvent["attendees"] = new JArray(); } else { try { JArray formattedAttendees = new JArray(); foreach (JObject itm in attendees) { string name = itm["attedName"].ToString(); string email = itm["attedEmail"].ToString(); string type = itm["attedType"].ToString(); JObject formattedAttendee = new JObject { ["emailAddress"] = new JObject { ["address"] = email, ["name"] = name }, ["type"] = type.ToLower() }; formattedAttendees.Add(formattedAttendee); } newEvent["attendees"] = formattedAttendees; } catch (Exception ex1) { ComHelper.WriteErrorLog(ex1, request, bodyData, "E_R047"); rstAt.message = "참석자 정보 필수값이 없습니다. 확인하여 주세요.[M365]"; return rstAt; } } using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); var sendJson = JsonConvert.SerializeObject(newEvent, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); var content = new StringContent(sendJson, Encoding.UTF8, "application/json"); var rquest = new HttpRequestMessage(new HttpMethod("PATCH"), tmpPoint) { Content = content }; var response = await client.SendAsync(rquest); string result = await response.Content.ReadAsStringAsync(); rstAt.success = response.IsSuccessStatusCode; if (response.IsSuccessStatusCode) { // JSON 파싱 var jsonResult = JObject.Parse(result); rstAt.key = jsonResult["id"].ToString();// 이벤트 ID 가져오기 if (isDetail) { MdResultT1 tmpAt = await GetEventDetailAsync(userEmail, rstAt.key, timeZone, request, bodyData); rstAt.data = tmpAt.data; } } else { rstAt.message = "M365 일정수정에 실패하였습니다."; rstAt.exmsg = result; ComHelper.WriteErrorLog(result, request, bodyData, "E_R048"); } } } catch (Exception ex2) { rstAt.message = "M365 일정수정에 실패하였습니다."; rstAt.exmsg = ex2.Message; ComHelper.WriteErrorLog(ex2, request, bodyData, "E_R049"); } return rstAt; } #endregion #region 일정 삭제 public async Task DeleteEventAsync(string userEmail, string evtID, HttpRequestMessage request, string bodyData, string tmpLog) { ComHelper.WriteTextLog(request, bodyData, $"userEmail:{userEmail}, {tmpLog}", evtID); MdResultBase rBase = new MdResultBase(false, ""); await GetAccessTokenAsync(userEmail); if (string.IsNullOrWhiteSpace(_AccessToken)) { rBase.SetRst(false, "M365 권한획득에 실패하였습니다.", "G02"); ComHelper.WriteErrorLog("M365 권한획득에 실패하였습니다", request, bodyData, "E_R050"); return rBase; } string tmpPoint = $"{_Endpoint}/{Uri.EscapeDataString(evtID)}"; try { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); var response = await client.DeleteAsync(tmpPoint); if (response.IsSuccessStatusCode) { rBase.SetRst(true, "일정 삭제가 완료 되었습니다.", "SSS"); } else { string result = await response.Content.ReadAsStringAsync(); rBase.SetRst(false, "M365 일정삭제에 실패하였습니다.", "G03", result); ComHelper.WriteErrorLog(result, request, bodyData, "E_R051"); } } } catch (Exception ex) { rBase.SetRst(false, "M365 일정삭제에 실패하였습니다.", "G00", ex.Message); ComHelper.WriteErrorLog(ex, request, bodyData, "E_R052"); } return rBase; } #endregion #region 일정 리스트 public async Task >> GetEventListAsync(string userEmail, DateTime startDate, DateTime endDate, string timeZone, HttpRequestMessage request, string bodyData) { await GetAccessTokenAsync(userEmail); TimeZoneInfo kst = TimeZoneInfo.FindSystemTimeZoneById("Korea Standard Time"); DateTime utcSTime = TimeZoneInfo.ConvertTimeToUtc(startDate, kst); DateTime utcETime = TimeZoneInfo.ConvertTimeToUtc(endDate, kst); MdResultT1 - > rstAt = new MdResultT1
- >(false, "", "", "", new List
()); if (string.IsNullOrWhiteSpace(_AccessToken)) { rstAt.message = "M365 권한획득에 실패하였습니다."; ComHelper.WriteErrorLog(rstAt.message, request, bodyData, "E_R053"); return rstAt; } // calendarView 사용: 기간 지정 string tmpPoint = $"https://graph.microsoft.com/v1.0/users/{userEmail}/calendarView?startDateTime={utcSTime.ToString("o")}&endDateTime={utcETime.ToString("o")}&$top=1000"; try { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); client.DefaultRequestHeaders.Add("Prefer", $"outlook.timezone=\"{timeZone}\""); var response = await client.GetAsync(tmpPoint); string result = await response.Content.ReadAsStringAsync(); rstAt.success = response.IsSuccessStatusCode; if (response.IsSuccessStatusCode) { JObject json = JObject.Parse(result); JArray events = (JArray)json["value"]; foreach (var item in events) { //취소된 일정인 경우 생략 if (bool.Parse(item["isCancelled"].ToString()) == false) { string appName = ComHelper.NullToEmpty(item["organizer"]?["emailAddress"]?["name"]); string appEmail = ComHelper.NullToEmpty(item["organizer"]?["emailAddress"]?["address"]); MdCldData tmpList = new MdCldData(); tmpList.schKey = ComHelper.NullToEmpty(item["id"]); tmpList.userName = appName; tmpList.writeName = appName; tmpList.userEmail = appEmail; tmpList.writeEmail = appEmail; tmpList.subject = ComHelper.NullToEmpty(item["subject"]); tmpList.startDate = DateTime.Parse(item["start"]?["dateTime"]?.ToString()); tmpList.startZone = ComHelper.NullToEmpty(item["start"]?["timeZone"]?.ToString()); tmpList.endDate = DateTime.Parse(item["end"]?["dateTime"]?.ToString()); tmpList.endZone = ComHelper.NullToEmpty(item["end"]?["timeZone"]?.ToString()); tmpList.location = ComHelper.NullToEmpty(item["location"]?["displayName"]?.ToString()); // 장소 tmpList.Importance = ComHelper.NullToEmpty(item["importance"]); tmpList.contentType = ComHelper.NullToEmpty(item["body"]?["contentType"]?.ToString()); tmpList.content = ComHelper.NullToEmpty(item["body"]?["content"]?.ToString()); tmpList.sensitivity = ComHelper.NullToEmpty(item["sensitivity"]?.ToString()); tmpList.repeatedYn = "N"; string resourceName = string.Empty; /* 속성 불러오기 var extProps = item["singleValueExtendedProperties"] as JArray; if (extProps != null && extProps.Count > 0) { resourceName = ComHelper.NullToEmpty(extProps[0]?["value"]?.ToString()); } */ tmpList.recName = resourceName; var attendeesArray = item["attendees"] as JArray; if (attendeesArray != null) { foreach (var attendee in attendeesArray) { string tmpEmail = ComHelper.NullToEmpty(attendee["emailAddress"]?["address"]?.ToString()); string tmpName = ComHelper.NullToEmpty(attendee["emailAddress"]?["name"]?.ToString()); MdCldAttendee mdAttendees = new MdCldAttendee { attedEmail = tmpEmail, attedName = tmpName, attedType = ComHelper.NullToEmpty(attendee["type"]) }; tmpList.attendees.Add(mdAttendees); if (userEmail == tmpEmail) { // 일정 불러온사람 기준이면(참석자가 불러온경우 일정호출자 기준이면 tmpList.userEmail = tmpEmail; tmpList.userName = tmpName; } } } rstAt.data.Add(tmpList); } } } else { rstAt.message = "M365 데이터를 가져오는데 실패하였습니다."; ComHelper.WriteErrorLog(rstAt.message, request, bodyData, "E_R054"); } } } catch (Exception ex) { rstAt.message = "M365 일정조회에 실패하였습니다."; rstAt.exmsg = ex.Message; ComHelper.WriteErrorLog(ex, request, bodyData, "E_R055"); } return rstAt; } #endregion #region 일정 상세정보 public async Task > GetEventDetailAsync(string userEmail, string evtID, string timeZone, HttpRequestMessage request, string bodyData) { await GetAccessTokenAsync(userEmail); MdResultT1 rstAt = new MdResultT1 (false, ""); if (string.IsNullOrWhiteSpace(_AccessToken)) { rstAt.message = "M365 권한획득에 실패하였습니다."; ComHelper.WriteErrorLog(rstAt.message, request, bodyData, "E_R056"); return rstAt; } string tmpPoint = $"https://graph.microsoft.com/v1.0/users/{userEmail}/events/{Uri.EscapeDataString(evtID)}" + " ?$select=id,subject,body,attendees,organizer,start,end,location,importance,sensitivity"; try { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); client.DefaultRequestHeaders.Add("Prefer", $"outlook.timezone=\"{timeZone}\""); var response = await client.GetAsync(tmpPoint); string result = await response.Content.ReadAsStringAsync(); MdCldData rstData = new MdCldData(); if (response.IsSuccessStatusCode) { JObject item = JObject.Parse(result); string appName = ComHelper.NullToEmpty(item["organizer"]?["emailAddress"]?["name"]); string appEmail = ComHelper.NullToEmpty(item["organizer"]?["emailAddress"]?["address"]); rstData.schKey = ComHelper.NullToEmpty(item["id"]); rstData.userName = appName; rstData.writeName = appName; rstData.userEmail = appEmail; rstData.writeEmail = appEmail; rstData.subject = ComHelper.NullToEmpty(item["subject"]); rstData.startDate = DateTime.Parse(item["start"]?["dateTime"]?.ToString()); rstData.startZone = ComHelper.NullToEmpty(item["start"]?["timeZone"]?.ToString()); rstData.endDate = DateTime.Parse(item["end"]?["dateTime"]?.ToString()); rstData.endZone = ComHelper.NullToEmpty(item["end"]?["timeZone"]?.ToString()); rstData.location = ComHelper.NullToEmpty(item["location"]?["displayName"]?.ToString()); // 장소 rstData.Importance = ComHelper.NullToEmpty(item["importance"]); rstData.contentType = ComHelper.NullToEmpty(item["body"]?["contentType"]?.ToString()); rstData.content = ComHelper.NullToEmpty(item["body"]?["content"]?.ToString()); rstData.sensitivity = ComHelper.NullToEmpty(item["sensitivity"]?.ToString()); rstData.repeatedYn = "N"; string resourceName = string.Empty; /* 속성 불러오기 var extProps = item["singleValueExtendedProperties"] as JArray; if (extProps != null && extProps.Count > 0) { resourceName = ComHelper.NullToEmpty(extProps[0]?["value"]?.ToString()); } */ rstData.recName = resourceName; var attendeesArray = item["attendees"] as JArray; if (attendeesArray != null) { foreach (var attendee in attendeesArray) { string tmpEmail = ComHelper.NullToEmpty(attendee["emailAddress"]?["address"]?.ToString()); string tmpName = ComHelper.NullToEmpty(attendee["emailAddress"]?["name"]?.ToString()); MdCldAttendee mdAttendees = new MdCldAttendee { attedEmail = tmpEmail, attedName = tmpName, attedType = ComHelper.NullToEmpty(attendee["type"]) }; rstData.attendees.Add(mdAttendees); if (userEmail == tmpEmail) { rstData.userName = tmpName; rstData.userEmail = tmpEmail; } } } } rstAt.success = response.IsSuccessStatusCode; rstAt.data = rstData; } } catch (Exception ex) { rstAt.message = "M365 일정조회에 실패하였습니다.";; rstAt.exmsg = ex.Message; ComHelper.WriteErrorLog(ex, request, bodyData, "E_R057"); } return rstAt; } #endregion #region 메일 발송 public async Task SendMailAsync(string userEmail, string senderEmail, List<(string Name, string Email)> toRct, List<(string Name, string Email)> ccRct, string subject, string body, string bodyType) { MdResultBase rBase = new MdResultBase(false, ""); await GetAccessTokenAsync(userEmail); if (string.IsNullOrWhiteSpace(_AccessToken)) { rBase.SetRst(false, "M365 권한획득에 실패하였습니다."); ComHelper.WriteErrorLog(new Exception(), senderEmail, "E_R058"); return rBase; } string sUrl = $"https://graph.microsoft.com/v1.0/users/{userEmail}/sendMail"; try { using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //List<(string address, string name)> toList = new List<(string address, string name)>(); var message = new { message = new { subject = subject, body = new { contentType = bodyType, content = body }, toRecipients = toRct, ccRecipients = ccRct }, saveToSentItems = false }; var json = JsonConvert.SerializeObject(message); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PostAsync(sUrl, content); if (response.IsSuccessStatusCode) { rBase.SetRst(true, "M365 메일발송완료."); } else { var error = await response.Content.ReadAsStringAsync(); ComHelper.WriteErrorLog(new Exception(), senderEmail, "E_R059"); } } } catch (Exception ex) { rBase.SetRst(false, "M365 메일발송에 실패하였습니다.", "", ex.Message); ComHelper.WriteErrorLog(ex, senderEmail, "E_R060"); } return rBase; } public async Task SendMailAsync(string userEmail, string senderEmail, List toRct, List ccRct, string subject, string body, string bodyType) { MdResultBase rBase = new MdResultBase(false, ""); await GetAccessTokenAsync(userEmail); if (string.IsNullOrWhiteSpace(_AccessToken)) { rBase.SetRst(false, "M365 권한획득에 실패하였습니다."); ComHelper.WriteErrorLog(new Exception(), senderEmail, "E_R061"); return rBase; } string sUrl = $"https://graph.microsoft.com/v1.0/users/{userEmail}/sendMail"; try { using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _AccessToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //List<(string address, string name)> toList = new List<(string address, string name)>(); // 받는 사람(To) var toList = toRct.Select(r => new { emailAddress = new{ address = r.mail, name = r.userNm} }).ToList(); var ccList = ccRct.Select(r => new { emailAddress = new { address = r.mail, name = r.userNm } }).ToList(); var message = new { message = new { subject = subject, body = new { contentType = bodyType, content = body }, toRecipients = toList, ccRecipients = ccList }, saveToSentItems = false }; var json = JsonConvert.SerializeObject(message); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PostAsync(sUrl, content); if (response.IsSuccessStatusCode) { rBase.SetRst(true, "M365 메일발송완료."); } else { var error = await response.Content.ReadAsStringAsync(); ComHelper.WriteErrorLog(new Exception(error), senderEmail, "E_R062"); rBase.SetRst(false, "M365 메일발송에 실패하였습니다.", "", error); } } } catch (Exception ex) { rBase.SetRst(false, "M365 메일발송에 실패하였습니다.", "", ex.Message); ComHelper.WriteErrorLog(ex, senderEmail, "E_R063"); } return rBase; } #endregion } } - results = _service.FindItems(WellKnownFolderName.SentItems, filter, view); foreach (EmailMessage msg in results.OfType
- > rstAt = new MdResultT1
- >(false, "");
List