public static void UpdateAlertInfo(bool EnableAlerts, string FirstName, string LastName, string Email) { int UserId = -1; using (IDataReader reader = DBUser.GetUserInfoByLogin("alert")) { reader.Read(); UserId = (int)reader["UserId"]; } try { using (DbTransaction tran = DbTransaction.Begin()) { DBUser.UpdateUserInfo(UserId, "", FirstName, LastName, Email, "", ""); PortalConfig.EnableAlerts = EnableAlerts; tran.Commit(); } } catch (Exception exception) { if (exception is SqlException) { SqlException sqlException = exception as SqlException; if (sqlException.Number == 2627) { throw new EmailDuplicationException(); } } throw; } Alerts2.Init(); }
private static void DbTransactionCommitted(object sender, DbTransactionEventArgs e) { if (_hasNewEvent) { _hasNewEvent = false; Alerts2.Send(DbContext.Current.TransactionId); } }
/// <summary> /// Gets the outgoing email format body preview. /// </summary> /// <param name="IncidentId">The incident id.</param> /// <returns></returns> public static string GetOutgoingEmailFormatBodyPreview(int issueId) { IncidentBox incidentBox = IncidentBox.Load(Incident.GetIncidentBox(issueId)); string issueTitle = Incident.GetIncidentTitle(issueId); string issueLink = Alerts2.MakeIssueLink(issueId); string issueTicket = TicketUidUtil.Create(incidentBox.IdentifierMask, issueId); StringBuilder sb = new StringBuilder(incidentBox.Document.GeneralBlock.OutgoingEmailFormatBody, 4096); sb.Replace("[=Title=]", issueTitle); sb.Replace("[=Ticket=]", issueTicket); //sb.Replace("[=Text=]", node.Text); string linkStart = string.Format(CultureInfo.InvariantCulture, "<a href=\"{0}\">", HttpUtility.HtmlAttributeEncode(issueLink)); sb.Replace("[=Link=]", linkStart); sb.Replace("[=/Link=]", "</a>"); UserLight currentUser = Security.CurrentUser; if (currentUser != null) { sb.Replace("[=FirstName=]", currentUser.FirstName); sb.Replace("[=LastName=]", currentUser.LastName); sb.Replace("[=Email=]", currentUser.Email); using (IDataReader reader = User.GetUserProfile(currentUser.UserID)) { if (reader.Read()) { sb.Replace("[=Phone=]", reader["Phone"].ToString()); sb.Replace("[=Fax=]", reader["Fax"].ToString()); sb.Replace("[=Mobile=]", reader["Mobile"].ToString()); sb.Replace("[=Position=]", reader["Position"].ToString()); sb.Replace("[=Department=]", reader["Department"].ToString()); sb.Replace("[=Company=]", reader["Company"].ToString()); sb.Replace("[=Location=]", reader["Location"].ToString()); } } } return(sb.ToString()); }
public static string GetAddress(DeliveryType type, int userdId) { using (IDataReader reader = DBUser.GetUserInfo(userdId)) { if (reader.Read()) { switch (type) { case DeliveryType.Email: return(Alerts2.BuldEmailAddress(reader["FirstName"].ToString(), reader["LastName"].ToString(), reader["Email"].ToString())); case DeliveryType.IBN: return(reader["OriginalId"].ToString()); } } } return(null); }
private void Init3() { // OZ Initialize Company Web Site Semaphore CompanyWebSiteSemaphore.Initialize(); DbHelper2.Init2(); ValidateSqlServerVesion(); _sqlServerEdition = (SqlServerEdition)DBCommon.GetSqlServerEdition(); DatabaseState state = (DatabaseState)DBCommon.GetDatabaseState(); if (state != DatabaseState.Ready) { throw new DatabaseStateException(state); } Alerts2.Init(); PortalConfig.Current.Init(); _host = PortalConfig.SystemHost; string scheme = PortalConfig.SystemScheme; string port = PortalConfig.SystemPort; _companyType = PortalConfig.CompanyType; if (PortalConfig.CompanyEndDate.HasValue) { _endDate = PortalConfig.CompanyEndDate.Value; } else { _endDate = DateTime.MaxValue; } _portalLink = string.Format("{0}://{1}{2}", scheme, _host, !string.IsNullOrEmpty(port) ? (":" + port) : ""); _serverLink = _portalLink + "/"; _defaultLocale = DBCommon.GetDefaultLanguageName(); _initialized = true; }
public static Alerts2.Message GetMessage(ReminderTemplate template, int?objectId, Guid?objectUid, ObjectTypes objectType, int userId, VariableInfo[] vars) { StringBuilder sbSubject = new StringBuilder(); StringBuilder sbBody = new StringBuilder(); IFormatProvider prov = new CultureInfo(template.Locale, true); sbSubject.Append(template.Subject); sbBody.Append(template.Body); bool IsExternalUser = User.IsExternal(userId); string gateGuid = ""; if (IsExternalUser && objectId.HasValue) { if (userId > 0) { gateGuid = DBCommon.GetGateGuid((int)objectType, objectId.Value, userId); } // else // gateGuid = DBCommon.GetGateGuid(eInfo.ObjectTypeId, eInfo.ObjectId, User); } // Replace variables with values foreach (VariableInfo var in vars) { string nameBegin = string.Format("[={0}=]", var.name); string nameEnd = string.Format("[=/{0}=]", var.name); string linkStartValue = string.Empty; string linkEndValue = string.Empty; if (var.IsLink) // Modify link { if (IsExternalUser && !var.External) { var.value = string.Empty; } if (var.value.Length == 0) { linkStartValue = linkEndValue = string.Empty; } else { if (IsExternalUser) { if (userId > 0) { var.value = Alerts2.MakeExternalLink(var.value, User.GetUserLogin(userId), gateGuid); } // else // var.value = Alert2.MakeClientLink(var.value, gateGuid); } // Add NoMenu parameter to the end of link if (!var.DisableNoMenu && !User.GetMenuInAlerts(userId) && var.name != "PortalLink" && var.name != "ServerLink") { if (var.value.IndexOf('?') != -1) { var.value += '&'; } else { var.value += '?'; } var.value += "nomenu=1"; } linkStartValue = string.Format("<a href='{0}'>", var.value); linkEndValue = "</a>"; } } if (var.type == VariableType.Date.ToString()) { var.value = Alerts2.DateReformat(var.value, prov); } else if (var.type == VariableType.DateTime.ToString()) { var.value = Alerts2.DateTimeReformat(var.value, prov, User.GetUserTimeZoneId(userId)); } sbSubject.Replace(nameBegin, var.value); if (var.IsLink) { sbBody.Replace(nameBegin, linkStartValue); sbBody.Replace(nameEnd, linkEndValue); } else { var.value = HttpUtility.HtmlEncode(var.value).Replace("\r\n", "<BR>"); sbBody.Replace(nameBegin, var.value); } } return(new Alerts2.Message(sbSubject.ToString(), sbBody.ToString())); }
/// <summary> /// Sends the auto reply. /// </summary> /// <param name="IncidentId">The incident id.</param> /// <param name="From">From.</param> /// <param name="To">To.</param> internal static void SendAutoReply(int IncidentId, string From, string To) { IncidentBox incidentBox = IncidentBox.Load(Incident.GetIncidentBox(IncidentId)); if (!incidentBox.Document.EMailRouterBlock.SendAutoReply) { return; } Alerts2.Message msg = Alerts2.GetMessage(incidentBox.Document.GeneralBlock.AutoReplyEMailSubjectTemplate, incidentBox.Document.GeneralBlock.AutoReplyEMailBodyTemplate, SystemEventTypes.Issue_Created, IncidentId, null, -1, Security.CurrentUser.UserID); string subject = msg.Subject, body = msg.Body; MemoryStream emlMessage = new MemoryStream(); byte[] tmpBuffer = null; #region Fill Pop3 Message Stream // Create Pop3 Message Headers StringBuilder sbHeaders = new StringBuilder(); sbHeaders.AppendFormat("Date: {0}", GetEMailCreationDate()).Append("\r\n"); sbHeaders.Append("From: [email protected]").Append("\r\n"); sbHeaders.Append("To: [email protected]").Append("\r\n"); sbHeaders.AppendFormat("Subject: {0}", Rfc822HeaderCollection.Encode2AsciiString(subject)).Append("\r\n"); sbHeaders.Append("MIME-Version: 1.0").Append("\r\n"); sbHeaders.Append("Content-Type: multipart/mixed; boundary=\"----------7E143249668A83E\"").Append("\r\n"); sbHeaders.Append("\r\n"); tmpBuffer = Encoding.ASCII.GetBytes(sbHeaders.ToString()); emlMessage.Write(tmpBuffer, 0, tmpBuffer.Length); // Create Pop3 Message Entry StringBuilder sbMessage = new StringBuilder(); sbMessage.Append("------------7E143249668A83E").Append("\r\n"); // IF MESSAGE IS PLAIN TEXT //sbMessage.Append("Content-Type: text/plain; charset=utf-8").Append("\r\n"); // IF MESSAGE IS HTML TEXT sbMessage.Append("Content-Type: text/html; charset=utf-8").Append("\r\n"); sbMessage.Append("Content-Transfer-Encoding: base64").Append("\r\n"); sbMessage.Append("\r\n"); // OZ Fixed 500 5.3.3 Line too long (in reply to end of DATA command) sbMessage.Append(Convert.ToBase64String(Encoding.UTF8.GetBytes(body), Base64FormattingOptions.InsertLineBreaks)).Append("\r\n"); tmpBuffer = Encoding.ASCII.GetBytes(sbMessage.ToString()); emlMessage.Write(tmpBuffer, 0, tmpBuffer.Length); // Add Final Line tmpBuffer = Encoding.ASCII.GetBytes("------------7E143249668A83E--\r\n\r\n"); emlMessage.Write(tmpBuffer, 0, tmpBuffer.Length); #endregion Pop3Message InMsg = new Pop3Message(emlMessage); OutputMessageCreator outputAutoReply = new OutputMessageCreator(InMsg, IncidentId, From, From); outputAutoReply.AddRecipient(To); int emailBoxId = EMail.EMailRouterOutputMessage.FindEMailRouterPublicId(IncidentId); foreach (OutputMessage outputMsg in outputAutoReply.Create()) { try { SmtpClientUtility.SendMessage(OutgoingEmailServiceType.HelpDeskEmailBox, emailBoxId, outputMsg.MailFrom, outputMsg.RcptTo, outputMsg.Subject, outputMsg.Data); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex); Log.WriteError(ex.ToString()); } } }
public static void AddSystemEvents(SystemEventTypes eventType, int?objectId, Guid?objectUid, int relObjectId, string emailTo, string emailFrom, ArrayList excludeUsers, Dictionary <string, string> additionalValues) { // User can be unregistered int CurrentUserId = -1; if (Security.CurrentUser != null) { CurrentUserId = Security.CurrentUser.UserID; } ObjectTypes objectType, relObjectType; string ObjectTitle = string.Empty; string RelObjectTitle = string.Empty; string XMLData = Alerts2.GetXmlData(eventType, objectId, objectUid, relObjectId, out objectType, out relObjectType, ref ObjectTitle, ref RelObjectTitle, additionalValues); // Здесь будем хранить обработанных пользователей и пользователей, которых не надо обрабатывать ArrayList processedUsers = new ArrayList(); if (CurrentUserId > 0 && !Alerts2.SendToCurrentUser) { processedUsers.Add(CurrentUserId); } // Получатели info-сообщений ArrayList infoRecipients = new ArrayList(); using (DbTransaction tran = DbTransaction.Begin()) { int eventId = DBSystemEvents.AddSystemEvents((int)eventType, objectId, objectUid, ObjectTitle, relObjectId, RelObjectTitle, CurrentUserId, XMLData, DbContext.Current.TransactionId); #region Персональные сообщения if ( eventType == SystemEventTypes.CalendarEntry_Updated_Manager_ManagerAdded || eventType == SystemEventTypes.CalendarEntry_Updated_Manager_ManagerDeleted || eventType == SystemEventTypes.CalendarEntry_Updated_ResourceList_AssignmentAdded || eventType == SystemEventTypes.CalendarEntry_Updated_ResourceList_AssignmentDeleted || eventType == SystemEventTypes.CalendarEntry_Updated_ResourceList_RequestAdded || eventType == SystemEventTypes.Document_Updated_ResourceList_AssignmentAdded || eventType == SystemEventTypes.Document_Updated_ResourceList_AssignmentDeleted || eventType == SystemEventTypes.Document_Updated_ResourceList_RequestAdded || eventType == SystemEventTypes.Issue_Created || eventType == SystemEventTypes.Issue_Updated_Forum_MessageAdded || eventType == SystemEventTypes.Issue_Updated_Manager_ManagerAdded || eventType == SystemEventTypes.Issue_Updated_Manager_ManagerDeleted || eventType == SystemEventTypes.Issue_Updated_ResourceList_AssignmentAdded || eventType == SystemEventTypes.Issue_Updated_ResourceList_AssignmentDeleted || eventType == SystemEventTypes.Issue_Updated_ResourceList_RequestAdded || eventType == SystemEventTypes.Issue_Updated_Responsible_Requested || eventType == SystemEventTypes.Issue_Updated_Responsible_Assigned || eventType == SystemEventTypes.Issue_Updated_Responsible_Resigned || eventType == SystemEventTypes.Issue_Updated_Controller_Assigned || eventType == SystemEventTypes.Issue_Updated_Controller_Resigned || eventType == SystemEventTypes.Project_Updated_ExecutiveManager_ExecutiveManagerAdded || eventType == SystemEventTypes.Project_Updated_ExecutiveManager_ExecutiveManagerDeleted || eventType == SystemEventTypes.Project_Updated_Manager_ManagerAdded || eventType == SystemEventTypes.Project_Updated_Manager_ManagerDeleted || eventType == SystemEventTypes.Project_Updated_SponsorList_SponsorAdded || eventType == SystemEventTypes.Project_Updated_SponsorList_SponsorDeleted || eventType == SystemEventTypes.Project_Updated_StakeholderList_StakeholderAdded || eventType == SystemEventTypes.Project_Updated_StakeholderList_StakeholderDeleted || eventType == SystemEventTypes.Project_Updated_TeamMemberList_TeamMemberAdded || eventType == SystemEventTypes.Project_Updated_TeamMemberList_TeamMemberDeleted || eventType == SystemEventTypes.Todo_Updated_Manager_ManagerAdded || eventType == SystemEventTypes.Todo_Updated_Manager_ManagerDeleted || eventType == SystemEventTypes.Todo_Updated_ResourceList_AssignmentAdded || eventType == SystemEventTypes.Todo_Updated_ResourceList_AssignmentDeleted || eventType == SystemEventTypes.Todo_Updated_ResourceList_RequestAdded || eventType == SystemEventTypes.Task_Updated_ResourceList_AssignmentAdded || eventType == SystemEventTypes.Task_Updated_ResourceList_AssignmentDeleted || eventType == SystemEventTypes.Task_Updated_ResourceList_RequestAdded || eventType == SystemEventTypes.User_Activated || eventType == SystemEventTypes.User_Created || eventType == SystemEventTypes.User_Created_External || eventType == SystemEventTypes.User_Created_Partner || eventType == SystemEventTypes.User_Deleted || eventType == SystemEventTypes.User_Deactivated || eventType == SystemEventTypes.Assignment_Updated_Participant_Assigned || eventType == SystemEventTypes.Assignment_Updated_Participant_Resigned ) { ArrayList users = new ArrayList(); if (objectType == ObjectTypes.User) { users.Add(objectId); } if (relObjectType == ObjectTypes.User) { if (User.IsGroup(relObjectId)) { // this method doesn't return inactive users using (IDataReader reader = SecureGroup.GetListAllUsersInGroup(relObjectId, false)) { while (reader.Read()) { users.Add((int)reader["UserId"]); } } } else { if (User.GetUserActivity(relObjectId) == User.UserActivity.Active) { users.Add(relObjectId); } } } foreach (int userId in users) { if (!processedUsers.Contains(userId)) { AddSystemEventRecipient(eventId, userId, MessageTypes.Resource); processedUsers.Add(userId); } } if (emailTo != null) { AddSystemEventRecipient(eventId, MessageTypes.Resource, emailTo, emailFrom); } } #endregion CollectAllObjectSubscribers(eventType, objectType, objectId, objectUid, processedUsers, infoRecipients); foreach (int userId in infoRecipients) { if ((excludeUsers == null || !excludeUsers.Contains(userId)) && CheckRights(eventType, objectType, relObjectType, objectId, relObjectId, objectUid, userId)) { AddSystemEventRecipient(eventId, userId, MessageTypes.Info); } } _hasNewEvent = true; tran.Commit(); } }
private static void SendReminder(DateTypes dateType, ObjectTypes objecType, int?objectId, Guid?objectUid, List <int> users) { // TODO: Step 0. Check Security (Not implemented yet) // Step 1. Calculate variables foreach (int userId in users) { int reminderType = 0; using (IDataReader reader = User.GetUserPreferences(userId)) { if (reader.Read()) { reminderType = (int)reader["ReminderType"]; } } if (reminderType != 0) { // Step 2. Get Message Template ReminderTemplate tmpl = Reminder.GetMessageTemplate(dateType, User.GetUserLanguage(userId)); // Step 2.1. Calculate Variables ArrayList vars = new ArrayList(); Alerts2.GetObjectVariables(objecType, objectId, objectUid, false, Reminder.GetVariables(dateType), vars); // Step 3. Replace variables and GetMessage Alerts2.Message msg = Reminder.GetMessage(tmpl, objectId, objectUid, objecType, userId, (VariableInfo[])vars.ToArray(typeof(VariableInfo))); // Step 4. Save to log using (DbTransaction tran = DbTransaction.Begin()) { int logId = DbAlert2.MessageLogAdd(msg.Subject, msg.Body); DBSystemEvents.RecipientUpdateSend(userId, (reminderType & 1) != 0, PortalConfig.UseIM && (reminderType & 2) != 0, logId); // IsNotifiedByEmail, IsNotifiedByIBN tran.Commit(); } #region -- Send via Email -- // Step 5. Send via Email try { if ((reminderType & 1) != 0) //IsNotifiedByEmail { string body = "<html><head><meta http-equiv=Content-Type content=\"text/html; charset=utf-8\" /></head><body>" + msg.Body + "</body></html>"; using (DbTransaction tran = DbTransaction.Begin()) { Alerts2.SendMessage(DeliveryType.Email, Reminder.GetAddress(DeliveryType.Email, userId), body, msg.Subject); DBSystemEvents.RecipientUpdateSent(userId, (int)DeliveryType.Email, true); tran.Commit(); } } } catch (Exception ex) { Log.WriteError(ex.ToString()); } #endregion #region -- Send via IM -- // Step 6. Send via IM try { if ((reminderType & 2) != 0) //uInfo != null && uInfo.IsNotifiedByIBN) { using (DbTransaction tran = DbTransaction.Begin()) { Alerts2.SendMessage(DeliveryType.IBN, Reminder.GetAddress(DeliveryType.IBN, userId), msg.Body, msg.Subject); DBSystemEvents.RecipientUpdateSent(userId, (int)DeliveryType.IBN, true); tran.Commit(); } } } catch (Exception ex) { Log.WriteError(ex.ToString()); } #endregion } } }
public static void ProcessHandler(int handlerId, string argument, int hookId, int?objectId, Guid?objectUid, DateTime dateValue) { ObjectTypes objectType = ObjectTypes.UNDEFINED; DateTypes dateType = DateTypes.Undefined; if (handlerId == (int)DateTypeHandlers.SendReminder) { // Напоминать только о тех датах, которые еще не наступили. if (dateValue >= DateTime.UtcNow) { bool sendReminder = false; int userId = -1; using (IDataReader reader = DbSchedule2.GetReminderSubscriptionByHookId(hookId)) { if (reader.Read()) { sendReminder = true; if (reader["UserId"] != DBNull.Value) { userId = (int)reader["UserId"]; // O.R. [2010-04-01]: Don't process inactive user if (User.GetUserActivity(userId) != User.UserActivity.Active) { sendReminder = false; } } objectType = (ObjectTypes)reader["ObjectTypeId"]; dateType = (DateTypes)reader["DateTypeId"]; } } // Не напоминать о досрочно запущенных или досрочно завершённых объектах [2007-02-16] if (sendReminder) { sendReminder = ConfirmNotification(objectType, dateType, objectId, objectUid); } if (sendReminder) { SubscriptionTypes subscriptionType = (SubscriptionTypes)int.Parse(argument, CultureInfo.InvariantCulture); switch (subscriptionType) { case SubscriptionTypes.Global: ProcessGlobalSubscription(hookId, dateType, objectType, objectId, objectUid); break; case SubscriptionTypes.Personal: ProcessPersonalSubscription(hookId, dateType, userId, objectType, objectId, objectUid); break; case SubscriptionTypes.PersonalForObject: ProcessPersonalSubscriptionForObject(hookId, dateType, userId, objectType, objectId, objectUid); break; } } } } else if (handlerId == (int)DateTypeHandlers.RaiseSystemEvent) { bool raiseEvent = false; using (IDataReader reader = DbSchedule2.GetHook(hookId)) { if (reader.Read()) { raiseEvent = true; objectType = (ObjectTypes)reader["ObjectTypeId"]; dateType = (DateTypes)reader["DateTypeId"]; } } if (raiseEvent) { // Не уведомлять о досрочно запущенных или досрочно завершённых объектах [2008-07-29] raiseEvent = ConfirmNotification(objectType, dateType, objectId, objectUid); if (raiseEvent) { SystemEventTypes EventType = (SystemEventTypes)int.Parse(argument); if (objectId.HasValue) { SystemEvents.AddSystemEvents(EventType, objectId.Value); } else if (objectUid.HasValue) { SystemEvents.AddSystemEvents(EventType, objectUid.Value); } } if (objectType == ObjectTypes.Task) { Task.RecalculateAllStates(Task.GetProject(objectId.Value)); } else if (objectType == ObjectTypes.ToDo) { ToDo.RecalculateState(objectId.Value); } else if (objectType == ObjectTypes.CalendarEntry) { CalendarEntry.RecalculateState(objectId.Value); } } } else if (handlerId == (int)DateTypeHandlers.BatchAlert) { if (objectId.HasValue) { Alerts2.SendBatch(objectId.Value, dateValue); } } else if (handlerId == (int)DateTypeHandlers.LdapSync) { if (objectId.HasValue) { Ldap.Synchronize(objectId.Value, dateValue); } } }