private void ProcessMailing(MailingDAO mailingDAO, Mailing mailing) { SmtpServerDAO smtpServerDAO = new SmtpServerDAO(dataAccess.GetConnection()); SmtpServer smtpServer = smtpServerDAO.GetSmtpServer(currentTenant, mailing.smtpServer); ReportFrequencyEnum reportFrequency = (ReportFrequencyEnum)mailing.frequency; ReportTypeEnum reportType = (ReportTypeEnum)mailing.reportType; String recipients = mailing.recipients; DateTime lastSend = mailing.lastSend; // Verifica se está na data de envio, aborta caso não esteja if (!ReportContext.IsScheduledTime(reportFrequency, currentPeriodEndDate)) { return; } // Verifica se o log foi importado PrintLogPersistence logPersistence = new PrintLogPersistence(currentTenant, dataAccess.GetConnection(), null, false); Boolean logImported = logPersistence.FileImported(ReportContext.GetDateRange(reportFrequency)); // Verifica se o relatório já foi enviado hoje Boolean alreadySent = lastSend.Date == DateTime.Now.Date; // Caso o log tenha sido importado e se ainda não enviou, gera o relatório e envia if ((logImported) && (!alreadySent)) { // Inicia o append no arquivo de log (acrescentando o "startingDelimiter") fileLogger.LogInfo("Envio de relatório - Iniciando execução...", true); // Informa dados do mailing fileLogger.LogInfo("Frequência de envio - reportFrequency = " + reportFrequency.ToString()); fileLogger.LogInfo("Relatório - reportType = " + reportType.ToString()); fileLogger.LogInfo("Destinatários - recipients = " + recipients); notifications.Clear(); String reportStamp = DateTime.Now.Ticks.ToString(); String reportFilename = FileResource.MapDesktopResource("Report" + reportStamp + currentFormatExtension); BuildReport(reportFilename, reportType, reportFrequency); String mailSubject = "Relatório " + ReportContext.GetFrequencyCaption(reportFrequency); List <String> attachmentFiles = new List <String>(); attachmentFiles.Add(reportFilename); MailSender mailSender = new MailSender(smtpServer.CreateSysObject(), this); mailSender.SetContents("Email gerado automaticamente, não responder.", attachmentFiles); Boolean success = mailSender.SendMail(mailSubject, currentSysSender, recipients); ProcessNotifications(); if (success) // Grava a data de envio de envio no banco { mailing.lastSend = DateTime.Now.Date; mailingDAO.SetMailing(mailing); fileLogger.LogInfo("Execução concluída."); } } // Tenta remover arquivos temporários, ignora caso os arquivos estejam em uso // tentará novamente nas próximas execuções ReportContext.TryRemoveTempFiles(); }
public void Execute() { // Verifica se as dependências foram instanciadas (se o método InitializeTaskState foi chamado) if (taskParams == null) { return; } if (dataAccess == null) { return; } if (notifications == null) { return; } if (fileLogger == null) { return; } dataAccess.OpenConnection(); TenantDAO tenantDAO = new TenantDAO(dataAccess.GetConnection()); PreferenceDAO preferenceDAO = new PreferenceDAO(dataAccess.GetConnection()); MailingDAO mailingDAO = new MailingDAO(dataAccess.GetConnection()); List <Object> tenantList = tenantDAO.GetAllTenants(); foreach (Tenant tenant in tenantList) { currentTenant = tenant.id; Preference senderPreference = preferenceDAO.GetTenantPreference(currentTenant, "sysSender"); currentSysSender = senderPreference.value; Preference exportPreference = preferenceDAO.GetTenantPreference(currentTenant, "exportFormat"); int exportFormat = 0; // o default é eportar para PDF if (exportPreference != null) { exportFormat = int.Parse(exportPreference.value); } currentFormatExtension = GetFormatExtension(exportFormat); Preference endDatePreference = preferenceDAO.GetTenantPreference(currentTenant, "periodEndDate"); currentPeriodEndDate = 1; // o default é o periodo entre o dia 1 deste mês e o dia 1 do mês passado if (endDatePreference != null) { currentPeriodEndDate = int.Parse(endDatePreference.value); } currentReportBuilder = GetReportBuilder(exportFormat); List <Object> mailingList = mailingDAO.GetAllMailings(currentTenant); foreach (Mailing mailing in mailingList) { ProcessMailing(mailingDAO, mailing); } } dataAccess.CloseConnection(); }
protected void Page_Load(object sender, EventArgs e) { settingsMasterPage = (SettingsMasterPage)Page.Master; settingsMasterPage.InitializeMasterPageComponents(); DataAccess dataAccess = settingsMasterPage.dataAccess; int mailingId; Boolean isNumeric = int.TryParse(Request.QueryString["mailingId"], out mailingId); if (!isNumeric) { EmbedClientScript.ShowErrorMessage(this, "Os parâmetros passados para a página não estão em um formato válido.", true); return; } Tenant tenant = (Tenant)Session["tenant"]; mailingDAO = new MailingDAO(dataAccess.GetConnection()); Mailing mailing = mailingDAO.GetMailing(tenant.id, mailingId); if (mailing == null) { mailing = new Mailing(); mailing.tenantId = tenant.id; } SettingsInput settingsInput = new SettingsInput(settingsArea, null); settingsInput.AddHidden("txtId", mailing.id.ToString()); settingsInput.AddHidden("txtTenantId", mailing.tenantId.ToString()); ListItem[] items = DropDownScaffold.RetrieveStrict("pr_retrieveSmtpServer", dataAccess.GetConnection(), typeof(SmtpServer)); settingsInput.AddDropDownList("cmbSmtpServer", "Servidor SMTP", mailing.smtpServer, items); settingsInput.AddDropDownList("cmbFrequency", "Frequencia de Envio", mailing.frequency, typeof(ReportFrequencyEnum)); settingsInput.AddDropDownList("cmbReportType", "Relatório", mailing.reportType, typeof(ReportTypeEnum)); settingsInput.Add("txtRecipients", "Enviar para", mailing.recipients); settingsInput.AddHidden("txtLastSend", mailing.lastSend.ToShortDateString()); }
private static void ProcessMailingList() { DataConnector dataConnector = new DataConnector(); dataConnector.OpenConnection(); primaryServer = dataConnector.GetServer("Primary"); secondaryServer = dataConnector.GetServer("Secondary"); // Busca o servidor de envio que trabalha na porta 587 ( porta que o NET Smtp Client aceita ) SmtpServerDAO smtpServerDAO = new SmtpServerDAO(dataConnector.MySqlConnection); List <SmtpServerDTO> serverList = smtpServerDAO.GetServers("porta=587"); SmtpServerDTO smtpServer = null; if (serverList.Count == 1) { smtpServer = serverList[0]; } String listaEnvio = ""; MailingDAO mailingDAO = new MailingDAO(dataConnector.MySqlConnection); List <MailingDTO> mailingList = mailingDAO.GetMailings(null); foreach (MailingDTO mailing in mailingList) { // Verifica se hoje é o dia do faturamento Boolean isBillingTime = false; int diaFaturamento = mailing.diaFaturamento; if (diaFaturamento < 1) { diaFaturamento = 1; // Consiste o dia para casos onde o usuário entrou um número negativo ou zero } int daysInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); if (diaFaturamento > daysInMonth) { diaFaturamento = daysInMonth; // Consiste o dia para casos onde exceda a quantidade de dias do mês } isBillingTime = (diaFaturamento == DateTime.Now.Day); // Verifica se já foi enviado hoje Boolean alreadySent = mailing.ultimoEnvio.Date == DateTime.Now.Date; if ((isBillingTime) && (!alreadySent) && (smtpServer != null)) { Boolean active = AreContractsActive(dataConnector, mailing); if (active) { SendMailing(dataConnector, mailing, smtpServer); listaEnvio += " Cliente: " + mailing.businessPartnerCode + " - " + mailing.businessPartnerName + " Enviado para: " + mailing.destinatarios + Environment.NewLine; } } } if (String.IsNullOrEmpty(listaEnvio)) { listaEnvio = "Vazia"; } if (EventLog.SourceExists("Billing Mailer")) { EventLog.WriteEntry("Billing Mailer", "Lista de envio -> " + Environment.NewLine + listaEnvio); } dataConnector.CloseConnection(); }
private static void SendMailing(DataConnector connector, MailingDTO mailing, SmtpServerDTO server) { MailMessage mailMessage = null; if (mailing.codigoContrato == 0) { mailMessage = MountBusinessPartnerBilling(connector, mailing.businessPartnerCode, mailing.enviarDemonstrativo); } else { mailMessage = MountContractBilling(connector, mailing.codigoContrato, mailing.codigoSubContrato, mailing.enviarDemonstrativo); } List <String> reportFiles = null; if (mailing.enviarDemonstrativo && mailMessage.Attachments.Count > 0) { reportFiles = new List <String>(); foreach (Attachment mailAttachment in mailMessage.Attachments) { reportFiles.Add(mailAttachment.Name); } } // TODO: Consertar o envio através do .NET, utilizar algum componente que funcione, o SmtpClient // da Microsoft não suporta SSL implicito SmtpServer smtpServer = SmtpServer.ImportFromDTO(server); MailSender mailSender = new MailSender(smtpServer, new TraceHandler()); mailSender.SetContents(mailMessage.Body, reportFiles); Boolean success = mailSender.SendMail("Faturamento de contrato", server.usuario, mailing.destinatarios); if (!success) { // caso não tenha tido sucesso ao enviar através do SmtpClient do .NET tenta enviar pelo PHP String mailerUrl = "http://" + primaryServer + "/Contratos/AjaxCalls/SendEmail.php"; String mailerParams = "subject=Faturamento%20de%20contrato&mailBody=" + mailMessage.Body + "&recipients=" + mailing.destinatarios; String aditionalParams = "&fileCount=0"; if (reportFiles != null) { aditionalParams = "&fileCount=" + reportFiles.Count; int fileIndex = 0; foreach (String filename in reportFiles) { aditionalParams += "&filename" + fileIndex + "=" + reportFiles[fileIndex]; aditionalParams += "&path" + fileIndex + "=" + Environment.CurrentDirectory + @"\" + reportFiles[fileIndex]; fileIndex++; } } RequestHandler mailerRequest = new RequestHandler(mailerUrl, new TraceHandler()); mailerRequest.StartRequest(mailerParams + aditionalParams, null); String mailerResponse = (String)mailerRequest.ParseResponse(typeof(System.String)); if (mailerResponse == "Email enviado com sucesso!") { success = true; } if (!success) { EventLog.WriteEntry("Billing Mailer", mailerResponse); } } if (success) // e-mail enviado com sucesso, grava no banco de dados a data { MailingDAO mailingDAO = new MailingDAO(connector.MySqlConnection); mailing.ultimoEnvio = DateTime.Now; mailingDAO.SetMailing(mailing); } }
protected void Page_Load(object sender, EventArgs e) { accountingMasterPage = (AccountingMasterPage)Page.Master; accountingMasterPage.InitializeMasterPageComponents(); dataAccess = accountingMasterPage.dataAccess; // action: // null - Sem ação, apenas lista os mailings // 0 - Excluir mailing, lista os restantes // 1 - Teste execução do mailing int?action = null; int?mailingId = null; try { if (!String.IsNullOrEmpty(Request.QueryString["action"])) { action = int.Parse(Request.QueryString["action"]); } if (!String.IsNullOrEmpty(Request.QueryString["mailingId"])) { mailingId = int.Parse(Request.QueryString["mailingId"]); } } catch (System.FormatException) { // Remove todos os controles da página configurationArea.Controls.Clear(); controlArea.Controls.Clear(); // Mostra aviso de inconsistência nos parâmetros WarningMessage.Show(controlArea, ArgumentBuilder.GetWarning()); return; } Tenant tenant = (Tenant)Session["tenant"]; mailingDAO = new MailingDAO(dataAccess.GetConnection()); if (mailingId != null) { switch (action) { case 0: mailingDAO.RemoveMailing(mailingId.Value); Response.Redirect("ConfigMailing.aspx"); // Limpa a QueryString para evitar erros break; case 1: Mailing mailing = mailingDAO.GetMailing(tenant.id, mailingId); TestMailing(mailing); break; default: break; } } List <Object> mailingList = mailingDAO.GetAllMailings(tenant.id); String[] columnNames = new String[] { "Frequência de envio", "Relatório", "Destinatários" }; //String testScript = "window.location='ConfigMailing.aspx?action=1&mailingId=' + {0};"; String alterScript = "window.open('MailingSettings.aspx?mailingId=' + {0}, 'Settings', 'width=540,height=600');"; String removeScript = "var confirmed = confirm('Deseja realmente excluir este item?'); if (confirmed) window.location='ConfigMailing.aspx?action=0&mailingId=' + {0};"; EditableListButton[] buttons = new EditableListButton[] { // Botões que devem aparecer para os items da lista //new EditableListButton("Testar", testScript, ButtonTypeEnum.Execute), new EditableListButton("Editar", alterScript, ButtonTypeEnum.Edit), new EditableListButton("Excluir", removeScript, ButtonTypeEnum.Remove) }; EditableList editableList = new EditableList(configurationArea, columnNames, buttons); foreach (Mailing mailing in mailingList) { ReportFrequencyEnum frequency = (ReportFrequencyEnum)mailing.frequency; ReportTypeEnum reportType = (ReportTypeEnum)mailing.reportType; String[] mailingProperties = new String[] { AssociatedText.GetFieldDescription(typeof(ReportFrequencyEnum), frequency.ToString()), AssociatedText.GetFieldDescription(typeof(ReportTypeEnum), reportType.ToString()), mailing.recipients }; // A lista de mailings não possui item default, isDefaultItem é sempre "false" editableList.InsertItem(mailing.id, false, mailingProperties); } editableList.DrawList(); // O clique do botão chama o script de alteração passando "id = 0", a tela de alteração // interpreta "id = 0" como "criar um novo", o id é então gerado no banco de dados. btnNovo.Attributes.Add("onClick", String.Format(alterScript, 0)); }