using System; using System.Data; using System.Data.SqlTypes; using CMS.CMSHelper; using CMS.GlobalHelper; using CMS.Newsletter; using CMS.UIControls; public partial class CMSModules_Newsletters_Controls_SendIssue : CMSAdminControl { #region "Properties" /// /// ID of newsletter issue that should be sent, required for template based newsletters. /// public int IssueID { get; set; } /// /// Newsletter ID, required for dynamic newsletters. /// public int NewsletterID { get; set; } /// /// Indicates if 'Schedule newsletter mail-out' option should be displayed. /// public bool ShowScheduler { get; set; } /// /// Indicates if 'Send draft' option should be displayed. /// public bool ShowSendDraft { get; set; } /// /// Indicates if 'Send later' option should be displayed. /// public bool ShowSendLater { get; set; } #endregion #region "Page events" protected void Page_Load(object sender, EventArgs e) { if (StopProcessing || ((IssueID <= 0) && (NewsletterID <= 0))) { return; } if (!RequestHelper.IsPostBack()) { int newsletterId = NewsletterID; if (newsletterId <= 0) { IssueInfo issue = IssueInfoProvider.GetIssueInfo(IssueID); if (issue != null) { newsletterId = issue.IssueNewsletterID; } else { StopProcessing = true; return; } } // Fill draft emails box NewsletterInfo newsletter = NewsletterInfoProvider.GetNewsletterInfo(newsletterId); if (newsletter != null) { txtSendDraft.Text = newsletter.NewsletterDraftEmails; } else { StopProcessing = true; } } calendarControl.DateTimeTextBox.CssClass = "EditingFormCalendarTextBox"; } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); // Show/hide specific send options plcSendScheduled.Visible = ShowScheduler; plcSendDraft.Visible = ShowSendDraft; plcSendLater.Visible = ShowSendLater; } protected void radGroupSend_CheckedChanged(object sender, EventArgs e) { calendarControl.Enabled = radSchedule.Checked; txtSendDraft.Enabled = radSendDraft.Checked; } #endregion #region "Methods" /// /// Sends the issue according to sending options. /// public bool SendIssue() { bool result = radSendLater.Checked; if (IssueID > 0) { // Depending on action chosen, send the issue if (radSendNow.Checked) { result = SendNow(); } else if (radSchedule.Checked) { result = SendScheduled(); } else if (radSendDraft.Checked) { result = SendDraft(); } } return result; } /// /// Sends issue immediately. /// private bool SendNow() { RemovePreviousTaskAndSendIssue(IssueID, DateTime.Now); return true; } /// /// Schedules mail-out of the issue to the future. /// private bool SendScheduled() { if (IsValidDate(calendarControl.SelectedDateTime)) { RemovePreviousTaskAndSendIssue(IssueID, calendarControl.SelectedDateTime); } else { ErrorMessage = GetString("newsletter.incorrectdate"); } return String.IsNullOrEmpty(ErrorMessage); } /// /// Sends issue to testing email addresses. /// /// True when everything went ok private bool SendDraft() { string draftEmails = txtSendDraft.Text.Trim(); if (String.IsNullOrEmpty(draftEmails)) { ErrorMessage = GetString("newsletter.recipientsmissing"); } else if (!ValidationHelper.AreEmails(draftEmails)) { ErrorMessage = GetString("newsletter.wrongemailformat"); } else { IssueInfoProvider.SendIssue(IssueID, draftEmails); } return String.IsNullOrEmpty(ErrorMessage); } /// /// Removes all scheduled tasks for the given issue. /// /// Issue ID /// DateTime when to send private void RemovePreviousTaskAndSendIssue(int issueId, DateTime when) { IssueInfo issue = IssueInfoProvider.GetIssueInfo(IssueID); if (issue != null) { // Remove all previously scheduled tasks (if any) IssueInfoProvider.DeleteMailoutTask(issue.IssueGUID, issue.IssueSiteID); // Schedule new task for new mailout time IssueInfoProvider.SendIssue(issue, when); } } /// /// Decides about DateTime validity. /// /// DateTime to valid /// True when DateTime is valid private static bool IsValidDate(DateTime date) { return (date > SqlDateTime.MinValue.Value) && (date < SqlDateTime.MaxValue.Value); } #endregion }