22 messaggi dal 18 maggio 2007
Salve, ho sviluppato un windows service che legge da un database e invia delle email di alert, una email per ogni record letto dal db (parliamo comunque di una ventina di email a elaborazione). Fatto sta che dopo le prime 4 email le altre mi danno errore. Devo prendere qualche accorgimento tra l'invio di un'email e un'altra? Vi posto il codice del mio servizio windows.

private void elaborazione()
{
createLogFile log = new createLogFile();
log.WriteLog("Inizio elaborazione() ...");

try
{
contratti_data contr = new contratti_data();

log.WriteLog("Lettura contratti in scadenza");
List<Contratto> contratti = contr.getContrattiInScadenza();

log.WriteLog("Email da inviare: " + contratti.Count.ToString());

foreach (Contratto contratto in contratti)
{
log.WriteLog("IdContratto: " + contratto.IdContratto.ToString() + " Invio Email di alert a: " + contratto.Email);

inviaEmail(contratto);
}
}
catch (Exception ex)
{
log.WriteLog("ERRORE in elaborazione(). " + ex.Message);
}
log.WriteLog("Fine elaborazione() ...");
}
protected void inviaEmail(Contratto _contratto)
{
string emailPostmaster = ConfigurationSettings.AppSettings["emailPostmaster"];
string passwordPostmaster = ConfigurationSettings.AppSettings["passwordPostmaster"];
string emailAmministratore1 = ConfigurationSettings.AppSettings["emailAmministratore1"];
string emailAmministratore2 = ConfigurationSettings.AppSettings["emailAmministratore2"];
string emailAmministratore3 = ConfigurationSettings.AppSettings["emailAmministratore3"];
string emailAmministratoreCCN = ConfigurationSettings.AppSettings["emailAmministratoreCCN"];
string emailReplyTo = ConfigurationSettings.AppSettings["emailReplyTo"];
string smtp = ConfigurationSettings.AppSettings["smtp"];
string test = ConfigurationSettings.AppSettings["test"];
string emailtest = ConfigurationSettings.AppSettings["emailtest"];

if (test.ToLower()=="si")
{
emailAmministratore1 = emailAmministratore1=="" ? "" : emailtest;
emailAmministratore2 = "";
emailAmministratore3 = "";
emailAmministratoreCCN = "";
_contratto.Email = "";
}

//create the mail message
MailMessage oMsg = new MailMessage();
if (_contratto.Email.Trim() != "")
{
oMsg.To.Add(_contratto.Email.Trim().Replace("\\", "\\\\").Replace("'", "''"));
}
if (emailAmministratore1.Trim() != "")
{
oMsg.To.Add(new MailAddress(emailAmministratore1, emailAmministratore1));
}
if (emailAmministratore2.Trim() != "")
{
oMsg.To.Add(new MailAddress(emailAmministratore2, emailAmministratore2));
}
if (emailAmministratore3.Trim() != "")
{
oMsg.To.Add(new MailAddress(emailAmministratore3, emailAmministratore3));
}
if (emailAmministratoreCCN.Trim() != "")
{
oMsg.Bcc.Add(new MailAddress(emailAmministratoreCCN, emailAmministratoreCCN));
}

//set the addresses
oMsg.From = new MailAddress(emailPostmaster, "Jdk srl Servizio Alert Contratti");
oMsg.ReplyTo = new MailAddress(emailReplyTo);

//La proprietà .To è una collezione di destinatari,
//quindi possiamo addizionare quanti destinatari vogliamo.
//oMsg.To.Add(new MailAddress("kduhcm@alice.it", "kduhcm@alice.it"));
//Imposto oggetto
oMsg.Subject = "Contratto in scadenza prot." + _contratto.ProtocolloContratto + " " + _contratto.RagioneSociale;
//Imposto contenuto

string corpoemail = "Gentile utente, <br />";
corpoemail += "il contratto con protocollo " + _contratto.ProtocolloContratto + " stipulato con la societa' " + _contratto.RagioneSociale + " e' in scadenza.<br /><br /><br />";
corpoemail += _contratto.DescContratto + "<br /><br /><br />";
corpoemail += "Data Contratto: " + _contratto.DataContratto + "<br />";
corpoemail += "Data Inizio Contratto: " + _contratto.DataInizioContratto + "<br />";
corpoemail += "Data Fine Contratto: " + _contratto.DataFineContratto + "<br /><br /><br />";
corpoemail += "Procedere al rinnovo o formulare una nuova offerta.<br /><br /><br />";

oMsg.Body = corpoemail;
oMsg.IsBodyHtml = true;
//Imposto il Server Smtp
SmtpClient oSmtp = new SmtpClient(smtp);
//Possiamo impostare differenti metodi di spedizione.
//Imposta consegna diretta.
oSmtp.DeliveryMethod = SmtpDeliveryMethod.Network;
//Alcuni Server SMTP richiedono l'accesso autenticato
NetworkCredential oCredential = new NetworkCredential(emailPostmaster, passwordPostmaster);
oSmtp.UseDefaultCredentials = false;
oSmtp.Credentials = oCredential;

//Spediamo la mail
createLogFile log = new createLogFile();
try
{
oSmtp.Send(oMsg);
log.WriteLog("Email inviata con successo.");
}
catch (Exception ex)
{
log.WriteLog("Errore durante invio email. " + ex.Message);
}
}
Modificato da KDUHCM il 25 settembre 2015 11.35 -

"Quanto piu ci innalziamo, tanto piu piccoli sembriamo a quelli che non possono volare."
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

KDUHCM ha scritto:

Devo prendere qualche accorgimento tra l'invio di un'email e un'altra?

Dipende dalle politiche imposte dal server SMTP che stai usando.

Se si tratta di un server SMTP aziendale che è sotto il tuo controllo, probabilmente lo puoi configurare affinché accetti un qualsiasi numero di email provenienti da rete locale.

Se invece stai usando un SMTP fornito da terzi (es. Tiscali, Libero, Aruba, ecc..) è probabile che impediscano agli utenti di inviare un certo volume di email nell'unità di tempo. Questo ti impone di fare delle pause tra un'invio e l'altro. Devi chiedere al fornitore del servizio SMTP quali sono questi limiti, in modo che tu possa conformarti ad essi.

ciao,
Moreno

Enjoy learning and just keep making
22 messaggi dal 18 maggio 2007
Mi appoggio su Aruba. Dici di mettere una pausa tra un invio e l'altro. Che comando c# potrei usare? Ho provato con thread. Sleep(6000) ma il risultato è identico, mi invia le prime 4 email e poi i successivi invii vanno in errore

"Quanto piu ci innalziamo, tanto piu piccoli sembriamo a quelli che non possono volare."
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
il server SMTP ti manda un testo di errore che spieghi il problema? Vorrei confermare che dipenda effettivamente dalla frequenza con cui invii i messaggi.

Cercando su internet ho trovato questo documento di Aruba che spiega le quote di consegna delle email.
https://affiliazione.aruba.it/riv/Policy%20Aruba_download.pdf

Mail Relay
In generale non sono consentite trasmissioni di massa o trasmissioni di informazioni commerciali via e-mail per un volume di più di 5.000 (cinquemila) utenti al giorno con una media di 250 messaggi ogni 20 minuti. Se si desidera inviare più di 5.000 messaggi al giorno, si prega di contattare il nostro team di supporto per ulteriori informazioni.

250 messaggi ogni 20 minuti sono 1 ogni 5 secondi (quasi). Pero io chiederei conferma ai loro tecnici. Non ho idea se quel documento è ancora attuale o no, e se si riferisce agli utenti finali del servizio di hosting.

ciao,
Moreno
Modificato da BrightSoul il 27 settembre 2015 15.37 -

Enjoy learning and just keep making
22 messaggi dal 18 maggio 2007
Il messaggio di errore purtroppo non da molte indicazioni. 'failure sending email'. Sicuramente il problema è che si sta cercando di inviare più email in un arco di tempo troppo ravvicinato rispetto a quelle consentite dal mail server. Che comando c# posso utilizzare per mettere un 'wait' di n secondi tra un invio e un altro? Thread.sleep non da il risultato sperato.

"Quanto piu ci innalziamo, tanto piu piccoli sembriamo a quelli che non possono volare."
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
Thread.Sleep va bene, a meno che tu non stia parallelizzando l'invio e inviando più email contemporaneamente.
Prova ad aspettare qualche secondo in più tra un invio e l'altro oppure, se le email non sono personalizzate, prova ad includere una ventina di indirizzi email per messaggio aggiungendoli come Ccn (in modo che ogni destinatario non possa leggere gli indirizzi degli altri).

ciao,
Moreno

Enjoy learning and just keep making
22 messaggi dal 18 maggio 2007
Niente da fare. Ho provato addirittura a mettere un thread.sleep a 60000 (un minuto) e niente. Il servizio l'ho installato su un server amazon micro. Sul server di prima le email partivano... Ti posto il log

9/29/2015 1:18:41 PM ==> Start del servizio
9/29/2015 1:18:46 PM ==> Inizio elaborazione() ...
9/29/2015 1:18:46 PM ==> Lettura contratti in scadenza
9/29/2015 1:18:47 PM ==> Email da inviare nella giornata: 10. (Verranno inviate solo le email non ancora inviate. Vedi tabella invioAllarmi.)
9/29/2015 1:18:47 PM ==> Allarmi gia inviati nel corso della giornata: 0
9/29/2015 1:18:47 PM ==> IdContratto: 118 Invio Email di alert a: xxxx@xxx.it
9/29/2015 1:18:50 PM ==> Email inviata con successo.
9/29/2015 1:18:50 PM ==> Thread.Sleep(60000)
9/29/2015 1:19:50 PM ==> END Thread.Sleep(60000)
9/29/2015 1:19:50 PM ==> IdContratto: 131 Invio Email di alert a: xxxx@xxx.it
9/29/2015 1:19:51 PM ==> Email inviata con successo.
9/29/2015 1:19:51 PM ==> Thread.Sleep(60000)
9/29/2015 1:20:51 PM ==> END Thread.Sleep(60000)
9/29/2015 1:20:51 PM ==> IdContratto: 136 Invio Email di alert a: xxxx@xxx.it
9/29/2015 1:20:53 PM ==> Email inviata con successo.
9/29/2015 1:20:53 PM ==> Thread.Sleep(60000)
9/29/2015 1:21:53 PM ==> END Thread.Sleep(60000)
9/29/2015 1:21:53 PM ==> IdContratto: 138 Invio Email di alert a: xxxx@xxx.it
9/29/2015 1:21:54 PM ==> Email inviata con successo.
9/29/2015 1:21:54 PM ==> Thread.Sleep(60000)
9/29/2015 1:22:54 PM ==> END Thread.Sleep(60000)
9/29/2015 1:22:54 PM ==> IdContratto: 141 Invio Email di alert a: xxxx@xxx.it
9/29/2015 1:23:15 PM ==> Errore durante invio email. Failure sending mail.
9/29/2015 1:23:15 PM ==> Thread.Sleep(60000)

"Quanto piu ci innalziamo, tanto piu piccoli sembriamo a quelli che non possono volare."
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
sei sicuro che il problema non sia l'indirizzo email del destinatario? Che so... dominio non più esistente o indirizzo sintatticamente non valido.

Comunque, dobbiamo capire qual è l'errore specifico che viene restituito dal server SMTP altrimenti non possiamo sapere come va risolto.
O ti viene inserito nell'eccezione (es. hai visto nella InnerException se c'è?) oppure dobbiamo andare a scoprirlo in qualche altro modo.
Potresti aprire una sessione telnet con il server SMTP e provare ad inviare la mail in quel modo. Così è garantito che vedrai l'errore.
http://it.wikihow.com/Inviare-una-Email-Usando-Telnet
Se vuoi tentare in questo modo, la sessione telnet deve essere iniziata dal server Amazon micro, quindi dovrai loggarti con desktop remoto e agire da lì.
Potrebbero pure esserci delle restrizioni sul traffico in uscita sulla porta dell'SMTP, non saprei.

ciao,
Moreno
Modificato da BrightSoul il 29 settembre 2015 19.54 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.