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(); }
protected void btnSubmit_Click(object sender, EventArgs e) { Mailing mailing = new Mailing(); try { foreach (String fieldName in Request.Form) { if (fieldName.Contains("txtId")) { mailing.id = int.Parse(Request.Form[fieldName]); } if (fieldName.Contains("txtTenantId")) { mailing.tenantId = int.Parse(Request.Form[fieldName]); } if (fieldName.Contains("cmbSmtpServer")) { mailing.smtpServer = int.Parse(Request.Form[fieldName]); } if (fieldName.Contains("cmbFrequency")) { mailing.frequency = int.Parse(Request.Form[fieldName]); } if (fieldName.Contains("cmbReportType")) { mailing.reportType = int.Parse(Request.Form[fieldName]); } if (fieldName.Contains("txtRecipients")) { mailing.recipients = Request.Form[fieldName]; // Verifica o formato da string de destinatários, caso não seja um // formato válido gera uma exceção (formatException) if (String.IsNullOrEmpty(mailing.recipients)) { throw new FormatException(); } MailAddressCollection recipients = new MailAddressCollection(); recipients.Add(mailing.recipients); // gera formatException caso não estejam separados por vírgula } if (fieldName.Contains("txtLastSend")) { mailing.lastSend = DateTime.Parse(Request.Form[fieldName]); } } } catch (System.FormatException) { EmbedClientScript.ShowErrorMessage(this, "Os valores informados não estão em um formato válido!"); return; } mailingDAO.SetMailing(mailing); EmbedClientScript.CloseWindow(this); }
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); } }