57 messaggi dal 24 marzo 2008
Ciao Ragazzi :)

scrivo per chiedere il vostro sempre prezioso aiuto in merito ad un problema che ad oggi non sono riuscito a risolvere. Come avrete capito dalla domanda, parliamo di invio mail.

Faccio una premessa in merito all'ambiente nel quale si verifica il problema:

siamo in IIS6, nel quale coesistono sia applicazioni scritte in asp classic che asp.net, e la versione di Framework .NET di riferimento è la 4.0.

l'invio delle mail avviene attraverso un host smtp che non richiede autenticazione (non posso riportare quello reale, quindi supponiamo sia "pippo.dominio.it"), la porta è la classica 25 e non è richiesta una connessione che utilizzi ssl.

L'invio mail per le applicazioni asp classic avviene tramite CDOSYS, mentre per la parte asp.net viene utilizzato il namespace System.Net.Mail. Nello specifico è un servizio di windows (per la parte ASP.NET) che, ad intervalli regolari, si occupa di interrogare un db in cui è presente una tabella "pending_mails", che poi provvede ad inviare (a gruppi di 10 per volta).

Per maggiore completezza riporto la configurazione della parte asp:


'Create message and configuration objects
set iMsg = CreateObject("CDO.Message")
set iConf = CreateObject("CDO.Configuration")

Set Flds = iConf.Fields

'Apply settings to the configuration object
With Flds
    ' Specify the authentication mechanism to basic (clear-text) authentication. 
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoNone
    ' The username for authenticating to an SMTP server
'  .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "someone"
  ' The password used to authenticate to an SMTP server
'  .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "pppwwwddd"
  .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
    'Specify mail server
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "pippo.dominio.it"
    'Specify the timeout in seconds
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
    ' The port on which the SMTP service specified by the smtpserver field is listening for connections (typically 25)
    '.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
    'Use SSL for the connection (False or True)
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
  .Update
End With



e, qui di seguito, la configurazione (in app.config) per il servizio che invia le mail per le applicazioni ASP.NET:


  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network">
        <network host="pippo.dominio.it"
                 enableSsl="false"
                 port="25"
                 defaultCredentials="false" />
      
      </smtp>
    </mailSettings>
  </system.net>



Il problema è che, mentre l'invio tramite asp classico funziona perfettamente, per ASP.NET il servizio traccia nel proprio log questo errore:

<b>System.Net.Mail.SmtpException: Failure sending mail. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it (indirizzo ip server):25</b>

il codice di invio mail del servizio è il seguente (è all'interno di una funzione. User e Pwd sono presi da db):


            System.Net.Mail.MailMessage mMailMessage = new System.Net.Mail.MailMessage();
            
            mMailMessage.From = new MailAddress(from);

            mMailMessage.To.Add(new MailAddress(to));
           
            if ((bcc != null) && (bcc != string.Empty))
            {
                mMailMessage.Bcc.Add(new MailAddress(bcc));
            }
           
            if ((cc != null) && (cc != string.Empty))
            {
                mMailMessage.CC.Add(new MailAddress(cc));
            }
     
            mMailMessage.Subject = subject;
            mMailMessage.Body = body;
            mMailMessage.Priority = System.Net.Mail.MailPriority.Normal;

            SmtpClient mSmtpClient = new SmtpClient();

            mSmtpClient.Credentials = new NetworkCredential(senderUserName, senderPassword);
       
            mSmtpClient.Send(mMailMessage);



Prima di mettere mano al codice vorrei un vostro parere a riguardo, anche perchè i problemi sono iniziati proprio dopo l'introduzione dell'smtp host non autenticato, mentre in precedenza tutto funzionava regolarmente.

Grazie mille per il vostro aiuto :)

Davide

Nulla è reale...tutto è lecito...
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Davide,
siccome si sta verificando una SocketException, proverei a capire come mai il server SMTP sta rifiutando i tentantivi di connessione della tua applicazione client.
Se tu o un tuo collega avete accesso al server SMTP, proverei a vedere se nel suo log risulta qualche motivazione di rifiuto. A volte può capitare che i server di posta rifiutino le connessioni da parte di client che si presentano con IP dalla bassa reputazione, ma a questo punto non mi spiego perché dalle applicazioni in ASP classico l'invio funzioni.

Fai questa semplice prova: collegati al server via desktop remoto, apri un prompt dei comandi e digita:
telnet pippo.dominio.it 25

Dai invio e aspetta che il server di posta ti invii una risposta. Se la connessione è stata stabilita correttamente, vedrai apparire il banner del server, ovvero il suo messaggio di presentazione. Questa è la prova che non ci sono problemi di connettività, e che dobbiamo andare a ricercare la causa nel codice.

Ciao,
Moreno
Modificato da BrightSoul il 09 novembre 2014 23.17 -

Enjoy learning and just keep making
57 messaggi dal 24 marzo 2008
Ciao Moreno, lieto di rileggerti :)
Ho accesso in terminal al server con privilegi di admin, quindi posso fare tutte le prove che mi hai suggerito.

Concordo con la tua perplessità circa il funzionamento corretto delle applicazioni ASP (delle quali ho cercato di replicare la configurazione anche in ASP.NET in termini di host, porta ed utilizzo o meno di ssl).

Se ti può essere di maggiore informazione, l'host pippo.dominio.it è configurato come smarthost del default SMTP server di IIS, nel caso avessi qualche altra cosa che ritieni possa essere utile controllare.

Ti terrò aggiornato sugli sviluppi, per il momento ti ringrazio del tuo consueto supporto :)

Davide

Nulla è reale...tutto è lecito...
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Davide,

dadox77 ha scritto:

Se ti può essere di maggiore informazione, l'host pippo.dominio.it è configurato come smarthost del default SMTP server di IIS

Non mi è chiara una cosa: a questo punto non ti converrebbe inviare le email a localhost:25? La consegna sarebbe molto più rapida e tu non ti imbatteresti negli sporadici problemi legati alla connettività con il server remoto.

Comunque dovresti aprire una sessione telnet verso pippo.dominio.it e provare a spedire un'email digitando gli appositi comandi. Così riesci a renderti conto del momento in cui il server SMTP ti chiude la connessione (se immediatamente o solo dopo l'invio di un determinato comando). Ecco i comandi da usare in una tipica sessione telnet con un server SMTP.
http://www.yuki-onna.co.uk/email/smtp.html

ciao,
Moreno

Enjoy learning and just keep making
57 messaggi dal 24 marzo 2008
Ciao Moreno,
come mi hai suggerito, ho verificato da desktop remoto se ci fossero problemi:


Se tu o un tuo collega avete accesso al server SMTP, proverei a vedere se nel suo log risulta qualche motivazione di rifiuto. A volte può capitare che i server di posta rifiutino le connessioni da parte di client che si presentano con IP dalla bassa reputazione


Ho cercato nei log ma non ho trovato informazioni che possano aiutarci a capire che errore si verifichi


Fai questa semplice prova: collegati al server via desktop remoto, apri un prompt dei comandi e digita: telnet pippo.dominio.it 25
Dai invio e aspetta che il server di posta ti invii una risposta. Se la connessione è stata stabilita correttamente, vedrai apparire il banner del server, ovvero il suo messaggio di presentazione. Questa è la prova che non ci sono problemi di connettività, e che dobbiamo andare a ricercare la causa nel codice.


da telnet il server non è raggiungibile:

could not open a connection to the host, on port 25: connect failed


ho provato anche un telnet 127.0.0.1 25 ed ho sempre lo stesso errore

Per scrupolo ho provato nuovamente un invio mail da asp classico e tutto funziona regolarmente, mentre per quanto riguarda ASP.NET l'eccezione che viene tracciata nel log del servizio viene sollevata in corrispondenza dell'esecuzione del metodo Send() della classe System.Net.Mail.SmtpClient.

Sono a tua disposizione per ulteriori verifiche.

A presto :)

Davide

Nulla è reale...tutto è lecito...
57 messaggi dal 24 marzo 2008
Ciao Moreno :)


BrightSoul ha scritto:
Non mi è chiara una cosa: a questo punto non ti converrebbe inviare le email a localhost:25? La consegna sarebbe molto più rapida e tu non ti imbatteresti negli sporadici problemi legati alla connettività con il server remoto.


Anche modificando nell'app.config il parametro host portandolo a 127.0.0.1 l'errore è lo stesso (ti riporto l'exception completa)


10/11/2014 9.31.36-System.Net.Mail.SmtpException: Failure sending mail. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it XXX.XX.XX.XX:25
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6, Int32 timeout)
   at System.Net.PooledStream.Activate(Object owningObject, Boolean async, Int32 timeout, GeneralAsyncDelegate asyncCallback)
   at System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)
   at System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
   at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at MailService.MailHelper.SendMailMessage(String hostName, Int32 port, String senderUserName, String senderPassword, String from, String to, String bcc, String cc, String subject, String body, Byte[] attach_bytes, DateTime dateTime, Int32 idTransmission)
   at MailService.SIRDE_MailService.SendPendingMails()
Failure sending mail.




BrightSoul ha scritto:
Comunque dovresti aprire una sessione telnet verso pippo.dominio.it e provare a spedire un'email digitando gli appositi comandi. Così riesci a renderti conto del momento in cui il server SMTP ti chiude la connessione (se immediatamente o solo dopo l'invio di un determinato comando).


appena possibile (ho delle scadenze piuttosto urgenti) proverò. Secondo te, alla luce di quanto abbiamo verificato, potrebbero esserci problemi anche nel codice (che ho postato quando ho aperto questo thread)?

A presto,
Davide

Nulla è reale...tutto è lecito...
57 messaggi dal 24 marzo 2008
Ciao Moreno, ti aggiorno sugli ultimi sviluppi:

ho fatto un test trasferendo il codice c# di invio mail in una nuova pagina ASP.NET e funziona perfettamente, quindi credo che possiamo escludere problemi di codice.

Come ti dicevo, le mail non vengono inviate da una pagina web, ma da un servizio di windows, che è esterno ad IIS.

Visto che nè lo smarthost, nè il virtual smtp server locale (127.0.0.1) è raggiungibile via telnet sulla porta 25, temo che ci sia qualche blocco a livello sistemistico che impedisce connessioni fuori dall'ambito di IIS.

Cosa ne pensi?

Davide

Nulla è reale...tutto è lecito...
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Davide,

dadox77 ha scritto:

temo che ci sia qualche blocco a livello sistemistico

Potrebbe essere. Vedi se nel firewall di Windows esiste qualche regola che sta bloccando il traffico in uscita. Se non la trovi, prova comunque a disabilitarlo un attimo e a vedere se a quel punto riesci ad aprire una sessione telnet su localhost:25.


Prima di fare qualsiasi cosa, però, assicurati che il servizio SMTP sia effettivamente in ascolto su localhost, alla porta 25.
Esegui questo dalla riga di comando, dovrebbe saltar fuori una riga a conferma che il servizio è in ascolto.
netstat -oan | findstr ":25"


ciao,
Moreno

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.