2025-04-15 12:10:19 +02:00

379 lines
16 KiB
C#
Raw Permalink Blame History

using EmailManager.SendEmailWS;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Configuration;
using System.Diagnostics;
using System.IO;
namespace EmailManager
{
public class Email
{
private static Log logger = new Log(ConfigurationManager.AppSettings["pathLog"]);
static int Main(string[] args)
{
return Send(args);
}
private static int Send(string[] args)
{
string ambiente = ConfigurationManager.AppSettings["ambiente"];
string cawTo_Bin = ConfigurationManager.AppSettings["cawTo_Bin"];
string tngServer = args[0];
string tngJobset = args[1];
string tngJob = args[2];
string funzione = "GESTORE EMAIL";
string fac_I_100 = ConfigurationManager.AppSettings["fac_I_100"];
string fac_T_100 = ConfigurationManager.AppSettings["fac_T_100"];
string fac_E_100 = ConfigurationManager.AppSettings["fac_E_100"];
string argomentiCawToInizio = "-n " + tngServer + " " + fac_I_100 + " " + tngJobset + " - " + tngJob + " - Funzione " + funzione + " INIZIATA";
string argomentiCawToTerminato = "-n " + tngServer + " " + fac_T_100 + " " + tngJobset + " - " + tngJob + " - Funzione " + funzione + " terminata con SUCCESSO";
string argomentiCawToErrore = "-n " + tngServer + " " + fac_E_100 + " " + tngJobset + " - " + tngJob + " - Funzione "; //+funzione + " terminata con ERRORE";
try
{
//START
StartTng(ambiente, cawTo_Bin, argomentiCawToInizio);
string queryListaEmail = ConfigurationManager.AppSettings["SP_LISTA_EMAIL_DA_INVIARE"];
string queryUpdateEmail = ConfigurationManager.AppSettings["SP_UPDATE_EMAIL_INVIATE"];
IDataReader emails = DataAccess.ExecuteDataReaderStoredProcedure(DBProvider.SqlServerStampeC6, queryListaEmail, null);
SendEmail sendEmailWS = new SendEmail();
while (emails.Read())
{
int id = (int)emails["Email_Id"];
string da = (string)emails["E_From"];
string a = null;
try
{
a = emails["E_To"].ToString();
}
catch
{
string missingEntryProcedure = ConfigurationManager.AppSettings["SP_BP_DISCARDED_ADDR_MISSING_ADD_ENTRY"];
List<Parametro> parameters = new List<Parametro>();
parameters.Add(new Parametro()
{
DbType = DbType.Int32,
ParameterName = "EmailId",
Value = id
});
parameters.Add(new Parametro()
{
DbType = DbType.String,
ParameterName = "Description",
Value = "E_To field missing in email informations."
});
DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, missingEntryProcedure, parameters);
Console.WriteLine(String.Format("E_To field missing in email informations. Email id: '{0}'", id));
logger.Write(String.Format("E_To field missing in email informations. Email id: '{0}'", id));
continue;
}
string cc = (string)emails["E_Cc"];
string bcc = (string)emails["E_Ccn"];
string oggetto = (string)emails["E_Subject"];
string corpo = (string)emails["Testo"];
List<byte[]> allegati = null;
//if (emails["Cc"] != DBNull.Value)
// cc = (string)emails["Cc"];
//if (emails["Bcc"] != DBNull.Value)
// bcc = (string)emails["Bcc"];
//if (emails["Oggetto"] != DBNull.Value)
// oggetto = (string)emails["Oggetto"];
//if (emails["Corpo"] != DBNull.Value)
// corpo = (string)emails["Corpo"];
//List<Parametro> parametro = new List<Parametro>();
//Parametro pId = new Parametro();
//pId.DbType = DbType.Int32;
//pId.ParameterName = "Email_Id";
//pId.Value = id;
//parametro.Add(pId);
//SqlDataReader attachments = (SqlDataReader)DataAccess.ExecuteDataReaderStoredProcedure(DBProvider.SqlServer, "sp_getEmailAllegati", parametro);
//if (attachments.HasRows) {
// allegati = new List<byte[]>();
// while (attachments.Read())
// allegati.Add((byte[])attachments["Allegato"]);
//}
bool res = sendEmailWS.SendMail(da, a, cc, bcc, oggetto, corpo, allegati == null ? null : allegati.ToArray());
int righe = 0;
if (res)
{
List<Parametro> parametri = new List<Parametro>();
Parametro pId = new Parametro();
pId.DbType = DbType.Int32;
pId.ParameterName = "Email_Id";
pId.Value = id;
parametri.Add(pId);
Parametro pDataInvio = new Parametro();
pDataInvio.DbType = DbType.DateTime;
pDataInvio.ParameterName = "DataInvio";
pDataInvio.Value = DateTime.Now;
parametri.Add(pDataInvio);
righe = DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, queryUpdateEmail, parametri);
}
if (!res)
{
throw new Exception("Non <20> stata inviata l'email id:" + id.ToString());
}
if (righe <= 0)
{
throw new Exception("Non <20> stato fatto l'update dell'email id:" + id.ToString());
}
}
//V,M Controlli automatici C6 (Quando si migra al framework 3.5 richiamare direttamente l'exe come libreria
//come facciamo con la gestioneFlussoGiornaliero nell'invio tramite ftp [libreria smartFTPThread])
string path = ConfigurationManager.AppSettings["AutoC6ChecksPath"];
if (File.Exists(path))
{
System.Diagnostics.Process processo_controlli = new Process();
processo_controlli.StartInfo.FileName = path;
processo_controlli.Start();
while (!processo_controlli.HasExited)
;
}
else
{
ScriviErroreNelDB(666, "Mancata chiamata autoc6checks: " + path, 1030, "GESTOREPDF", "GESTOREPDF");
}
//
//FINISH
StartTng(ambiente, cawTo_Bin, argomentiCawToTerminato);
return 0;
}
catch (DataBaseException ex)
{
try
{
funzione = "ScriviErroreNelDB";
ScriviErroreNelDB(-292929, "Errore nel Gestore EMAIL: " + getDataBaseException(ex), -292929, "Gestore EMAIL", "Gestore EMAIL");
funzione = "GESTORE EMAIL";
}
catch { }
argomentiCawToErrore += funzione + " terminata con ERRORE";
StartTng(ambiente, cawTo_Bin, argomentiCawToErrore);
return 1;
}
catch (Exception ex)
{
try
{
funzione = "ScriviErroreNelDB";
ScriviErroreNelDB(-292929, "Errore nel Gestore EMAIL: " + getException(ex), -292929, "Gestore EMAIL", "Gestore EMAIL");
funzione = "GESTORE EMAIL";
}
catch { }
argomentiCawToErrore += funzione + " terminata con ERRORE";
StartTng(ambiente, cawTo_Bin, argomentiCawToErrore);
return 1;
}
}
private static string getDataBaseException(DataBaseException ecc)
{
const string aCapo = "#/n#";
string ritorno = "";
ritorno += aCapo;
ritorno += " Informazioni Comando SQL:" + aCapo;
ritorno += " sql file name: " + ecc.SqlFileName + aCapo;
ritorno += " connection string: " + ecc.ConnectionStringWithoutCredentials + aCapo;
//ritorno += " command text: " + ecc.CommandText + aCapo;
//controllo se ci sono i parametri
if (ecc.Parameters != null)
{
foreach (Parametro parametro in ecc.Parameters)
{
ritorno += aCapo;
ritorno += " parametro: " + parametro.ParameterName + aCapo;
ritorno += " dimensione: " + parametro.Size.ToString() + aCapo;
ritorno += " direzione: " + parametro.Direction.ToString() + aCapo;
ritorno += " tipo: " + parametro.DbType.ToString() + aCapo;
if (parametro.Value == null)
ritorno += " valore: null" + aCapo;
else
{
string valoreParametro = "";
if (parametro.Size > 500)
{
valoreParametro = " valore: null(sono visualizzati solo i primi 500 bytes): " + parametro.Value.ToString().Substring(0, 500);
}
else
{
valoreParametro = " valore: " + parametro.Value.ToString();
}
ritorno += valoreParametro + aCapo;
}
}
}
ritorno += aCapo;
ritorno += " tipo: DataBaseException" + aCapo;
ritorno += " descrizione: " + ecc.Eccezione.Message + aCapo;
ritorno += " sorgente: " + ecc.Eccezione.Source + aCapo;
ritorno += " traccia: " + FormattaErrore(ecc.StackTrace) + aCapo;
return ritorno;
}
private static string getException(Exception ecc)
{
const string aCapo = "#/n#";
string ritorno = "";
ritorno += aCapo;
ritorno += " tipo: " + ecc.GetType().ToString() + aCapo;
ritorno += " descrizione: " + ecc.Message + aCapo;
ritorno += " sorgente: " + ecc.Source + aCapo;
if (ecc.InnerException != null)
{
ritorno += " descrizione Inner: " + ecc.InnerException.Message + aCapo;
ritorno += " sorgente Inner: " + ecc.InnerException.Source + aCapo;
}
ritorno += " traccia: " + FormattaErrore(ecc.StackTrace) + aCapo;
return ritorno;
}
private static string FormattaErrore(string errore)
{
const string aCapo = "#/n#";
const string spazio = " ";
string separatore1 = " at ";
string separatore2 = " in ";
string separatore3 = ":line ";
string erroreInterno = errore.Replace(separatore1, "@");
string ritorno = aCapo;
//nome metodo e tutto il resto
string[] messaggioErrore = erroreInterno.Split('@');
string messaggioSenzaSpazi;
string[] messaggioInterno;
foreach (string messaggio in messaggioErrore)
{
messaggioSenzaSpazi = messaggio.Trim();
if (messaggioSenzaSpazi != "")
{
messaggioSenzaSpazi = messaggioSenzaSpazi.Replace(separatore2, "@");
messaggioInterno = messaggioSenzaSpazi.Split('@');
if (messaggioInterno.GetUpperBound(0) == 1)
{
ritorno += spazio + "metodo: " + messaggioInterno[0] + aCapo;
string fileLineaSingolo = messaggioInterno[1].Replace(separatore3, "@");
string[] fileLinea = fileLineaSingolo.Split('@');
ritorno += spazio + "percorsoFile: " + fileLinea[0] + aCapo;
ritorno += spazio + "linea: " + fileLinea[1] + aCapo;
ritorno += aCapo;
}
else
{
ritorno += spazio + "metodo: " + messaggioInterno[0] + aCapo;
}
}
}
return ritorno;
}
private static void ScriviErroreNelDB(int codiceErrore, string descrizioErrore, int localeId, string nomePackage, string descrizionePackage)
{
int scriviErroreNelDB = int.Parse(ConfigurationManager.AppSettings["scriviErroreNelDB"]);
if (scriviErroreNelDB == 1)
{
//try
//{
List<Parametro> parametri = new List<Parametro>();
Parametro parametro = new Parametro();
parametro.DbType = DbType.Int32;
parametro.ParameterName = "codiceErrore";
parametro.Value = codiceErrore;
parametri.Add(parametro);
parametro = new Parametro();
parametro.DbType = DbType.String;
parametro.ParameterName = "descrizioErrore";
parametro.Value = descrizioErrore;
parametri.Add(parametro);
parametro = new Parametro();
parametro.DbType = DbType.DateTime;
parametro.ParameterName = "dataTime";
parametro.Value = DateTime.Now;
parametri.Add(parametro);
parametro = new Parametro();
parametro.DbType = DbType.String;
parametro.ParameterName = "localeID";
if (localeId == 0)
parametro.Value = System.DBNull.Value;
else
parametro.Value = localeId;
parametri.Add(parametro);
parametro = new Parametro();
parametro.DbType = DbType.String;
parametro.ParameterName = "descrizionePackage";
parametro.Value = descrizionePackage;
parametri.Add(parametro);
parametro = new Parametro();
parametro.DbType = DbType.String;
parametro.ParameterName = "nomePackage";
parametro.Value = nomePackage;
parametri.Add(parametro);
DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[UT_INSERT_ERROR]", parametri);
//}
//catch (Exception ex)
//{
// DataBaseException dataBaseException = (DataBaseException)ex;
// Console.WriteLine(dataBaseException.Message);
//}
}
}
private static void StartTng(string ambiente, string cawTo_Bin, string argomentiCaw)
{
if (!ambiente.Equals("SVILUPPO"))
{
Process processTng = new Process();
try
{
processTng = Process.Start(cawTo_Bin, argomentiCaw);
while (!processTng.HasExited) ;
}
catch (Exception ex)
{
throw new Exception("cawTo_Bin: Non riesco ad eseguire " + cawTo_Bin + " sulla macchina " + System.Environment.MachineName + ":" + ex.Message);
}
finally
{
processTng.Close();
processTng.Dispose();
}
}
}
}
}