private icm.XmlApi.scheduleReportType changeMail(QueuedMessageEventSource source, QueuedMessageEventArgs args, SchedulingInfo schedulingInfo, long now) { icm.XmlApi.scheduleReportType result = null; icm.XmlApi.userType userInfo = null; string dialingInfoStr = null; bool isCreate = isCreateMeetingRequest(schedulingInfo); webServiceData.ExchangeService service = null; try { userInfo = getUserInfo(schedulingInfo.delegatorEmailAddr); if (null == userInfo) throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_USER_NOT_FOUND); else if (!userInfo.Schedulable) throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_HAVE_NO_PERMISSION); else if (isCreate) { service = getWebService(schedulingInfo); if(null == service) throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_INCORRECT_EWS_CONFIGURATION); } } catch (Exception ex) { sendBackAMail(source, schedulingInfo, ex.Message); if (IS_DELETE_ERROR) { if (null == service) service = getWebService(schedulingInfo); if (null == service) return result; result = new icm.XmlApi.scheduleReportType(); result.Success = false; result.Detail = ""; //Do not add a cancel request into the task list, if (schedulingInfo.requestType == RequestType.CreateMeeting) { object[] parameters = new object[5]; parameters[0] = schedulingInfo; parameters[1] = null; parameters[2] = result; parameters[3] = now; parameters[4] = service; lock (ewsTasks) { RvLogger.DebugWrite("add the task in=============" + schedulingInfo.subject); ewsTasks.AddLast(parameters); } } } return result; } bool successfullyRescheduled = false; if (schedulingInfo.requestType == RequestType.CreateMeeting) { try { icm.XmlApi.virtualRoomType[] virtualRooms = this.getVirtualRoom(userInfo); if (null == virtualRooms && isCreate) throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_NO_VIRTUALROOM); if (isCreate) { icm.XmlApi.virtualRoomType defaultVirtualRoom = null; foreach (icm.XmlApi.virtualRoomType virtualRoom in virtualRooms) { if (virtualRoom.Default) { defaultVirtualRoom = virtualRoom; break; } } if (null == defaultVirtualRoom) defaultVirtualRoom = virtualRooms[0]; if (defaultVirtualRoom.OneTimePINRequired) { if (string.IsNullOrEmpty(schedulingInfo.meetingPin)) schedulingInfo.meetingPin = CreateRandomPWD(6); } icm.XmlApi.dialingInfoType dialingInfo = this.getDialingInfo(schedulingInfo, userInfo, defaultVirtualRoom); if (USE_HTML) dialingInfoStr = dialingInfo.DescriptionOfHTML; else dialingInfoStr = dialingInfo.Description; if (!USE_HTML && null != dialingInfoStr) { dialingInfoStr = dialingInfoStr.Replace("\n", "<br>"); dialingInfoStr = dialingInfoStr.Replace("\r", ""); dialingInfoStr = dialingInfoStr.Replace("\t", " "); } schedulingInfo.dialingInfo = dialingInfoStr; } result = this.scheduleMeeting(schedulingInfo, schedulingInfo.subject, false); if (!result.Success && IS_RESCHEDULE && !notResourceProblem(string.IsNullOrEmpty(result.ErrorCode) ? (result.Detail == null ? "" : result.Detail) : result.ErrorCode)) { result = this.scheduleMeeting(schedulingInfo, schedulingInfo.subject, true); if (result.Success) { successfullyRescheduled = true; } } } catch (Exception ex) { result = new icm.XmlApi.scheduleReportType(); result.Success = false; result.ErrorCode = ex.Message; result.Detail = ex.Message; } result.Detail = result.Detail == null ? "" : result.Detail; if ((isCreate && result.Success) || (!result.Success && IS_DELETE_ERROR)) { if (null == service) service = getWebService(schedulingInfo); if (null == service) return result; object[] parameters = new object[5]; parameters[0] = schedulingInfo; parameters[1] = dialingInfoStr; parameters[2] = result; parameters[3] = now; parameters[4] = service; lock (ewsTasks) { RvLogger.DebugWrite("add the task in=============" + schedulingInfo.subject); ewsTasks.AddLast(parameters); } } } else { result = this.deleteMeeting(schedulingInfo, true); result.Detail = result.Detail == null ? "" : result.Detail; } if (false == result.Success && ("CONF_NOT_FOUND".Equals(result.Detail) || "CANCELLED".Equals(result.Detail))) result.Success = true; if (false == result.Success) { sendBackAMail(source, schedulingInfo, string.IsNullOrEmpty(result.ErrorCode) ? result.Detail : result.ErrorCode); } else if (successfullyRescheduled) sendBackAMail(source, schedulingInfo, "RESOURCE_SHORTAGE"); else if (IS_SEND_SUCCESS_MAIL) { sendBackAMail(source, schedulingInfo, "SUCCESS_NOTIFICATION"); } return result; }
private void sendBackAMail(QueuedMessageEventSource source, SchedulingInfo schedulingInfo, string baseFailCode) { try { RvLogger.DebugWrite("Send back a mail to the sender."); RvLogger.DebugWrite("Notification mail code: " + baseFailCode); DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); string PickupPath = directoryInfo.Parent.Parent.FullName + @"\Pickup\"; if (settingsInfo["ExchangeServer.PickupDirectoryPath"] != null) { PickupPath = settingsInfo["ExchangeServer.PickupDirectoryPath"]; if(!PickupPath.EndsWith(@"\")) PickupPath = PickupPath + @"\"; } if (!Directory.Exists(PickupPath)) { Directory.CreateDirectory(PickupPath); } EmailMessage origMsg = this.emailMessage; EmailMessage newMsg = EmailMessage.Create(); //newMsg.MessageId = "11111111112222222222"; string subjectFailCode = getFailCode(schedulingInfo, "subject.fail"); if ("SUCCESS_NOTIFICATION".Equals(baseFailCode)) subjectFailCode = getFailCode(schedulingInfo, "subject.success"); else if ("RESOURCE_SHORTAGE".Equals(baseFailCode)) subjectFailCode = getFailCode(schedulingInfo, "subject.resource.shortage"); else if (!notResourceProblem(baseFailCode)) baseFailCode = "ERROR_RESOURCE_SHORTAGE"; string failCode = getFailCode(schedulingInfo, baseFailCode); newMsg.Subject = messages[subjectFailCode]; newMsg.To.Clear(); newMsg.To.Add(new EmailRecipient( origMsg.Sender.DisplayName, origMsg.Sender.SmtpAddress)); newMsg.From = new EmailRecipient("Service Account", SERVER_ACCOUNT); Stream writer = newMsg.Body.GetContentWriteStream(); StreamWriter sw = new StreamWriter(writer, Encoding.Unicode); if (schedulingInfo != null) { sw.WriteLine("Subject : " + schedulingInfo.subject); sw.WriteLine(); } string message = messages.ContainsKey(failCode) ? messages[failCode] : null; if (string.IsNullOrEmpty(message)) message = messages["common.message"]; RvLogger.DebugWrite("Notification mail message: " + message); sw.WriteLine(message); sw.Close(); writer.Close(); SaveMessage(newMsg, String.Concat(PickupPath, schedulingInfo.delegatorEmailAddr + "-" + DateTime.UtcNow.ToString("yyyy-MM-dd-HH-mm-ss-ms") + ".eml")); RvLogger.DebugWrite("Notification mail is sent."); // Cancel the original message if (!"SUCCESS_NOTIFICATION".Equals(baseFailCode) && !"RESOURCE_SHORTAGE".Equals(baseFailCode)) source.Delete(); } catch (Exception ex) { RvLogger.DebugWrite(ex.StackTrace); RvLogger.DebugWrite(ex.Message); } RvLogger.DebugWrite("Send back a mail to the sender completed."); }