S22.Imap

di il
11 risposte

S22.Imap

Salve volevo sapere come sarebbe possibili implementare ad imap un flusso di dati che tenesse la connessione keep alive cioè sempre accesa visto che dopo un po il canale si chiude
Grazie e buona giornata

11 Risposte

  • Re: S22.Imap

    ap9819 ha scritto:


    Salve volevo sapere come sarebbe possibili implementare ad imap un flusso di dati che tenesse la connessione keep alive cioè sempre accesa visto che dopo un po il canale si chiude
    Ti basterebbe inviare periodicamente un comando di sola lettura (es. acquisizione delle cartelle o verifica di nuovi messaggi nella cartella corrente), ossia un comando che non alteri le informazioni sul server, in modo da azzerare il conteggio del timeout che dopo alcuni minuti causa la chiusura automatica della connessione.

    Ciao!
  • Re: S22.Imap

    Come potrei inviare questo tipo di comando?
    Ci sono funzioni specifiche oppure bisognerebbe implementare un contatore che quando finisce esegue questa funzione
  • Re: S22.Imap

    ap9819 ha scritto:


    Come potrei inviare questo tipo di comando?
    Avrai implementato nel tuo programma qualcosa che legga una qualsiasi informazione dal server IMAP, no?

    ap9819 ha scritto:


    Ci sono funzioni specifiche oppure bisognerebbe implementare un contatore che quando finisce esegue questa funzione
    Dipende. Magari vi sono framework che supportano già questo tipo di funzionalità, ma dipende da cosa hai utilizzato per colloquiare con il server.

    Se la documentazione riporta un meccanismo "built in", allora è il caso fortunato e si usa quello, altrimenti con un timer impostato a un periodo inferiore a quello di timeout, o comunque sufficientemente basso (tipo 15-20 secondi), si effettua l'operazione.

    Ciao!
  • Re: S22.Imap

    Ho implementato che ogni tot millisecondi devo rifare il login così facendo sono spento un secondo e poi sono arrivo.
    Potrebbe essere una via per tenere (quasi) sempre attivo il canale?
  • Re: S22.Imap

    ap9819 ha scritto:


    Ho implementato che ogni tot millisecondi devo rifare il login così facendo sono spento un secondo e poi sono arrivo.
    Potrebbe essere una via per tenere (quasi) sempre attivo il canale?
    Non mi sembra una buona idea: se cambia nome utente e password, il tuo "ping" non va più a buon fine; inoltre, si presuppone che il comando sia da inviare una volta instaurata la connessione e una volta che l'autenticazione è andata a buon fine.

    Il protocollo IMAP supporta un : perché non usare questo che è appositamente pensato allo scopo?
  • Re: S22.Imap

    Ho visto questo comando ma sinceramente sto usando i thread e non i async quindi non so come dovrei fare e soprattutto devo istallare Mapkit??
    Oppure sto dicendo una marea di boiate??
    Se per esempio uso un timer e dico di usare questo comando come dovrebbe essere la sintassi??
  • Re: S22.Imap

    ap9819 ha scritto:


    Ho visto questo comando ma sinceramente sto usando i thread e non i async
    Scusa, ma questo cosa c'entra? Il comando fa parte dell'RFC del protocollo IMAP, ossia è uno dei comandi che i client IMAP possono mandare ai relativi server, e i server sono tenuti a supportarlo, poi come venga inviato, da che linguaggio e con quale framework e/o modalità non ha alcuna importanza.

    ap9819 ha scritto:


    quindi non so come dovrei fare e soprattutto devo istallare Mapkit??
    Oppure sto dicendo una marea di boiate??
    Che ne so... cosa stai usando per colloquiare con il server IMAP?
    E' una domanda che ho già fatto, ma non hai risposto.
    Non hai nemmeno riportato una riga di codice.

    ap9819 ha scritto:


    Se per esempio uso un timer e dico di usare questo comando come dovrebbe essere la sintassi??
    Cioè, per poterti rispondere, devo costruirmi un client IMAP e fare il lavoro al posto tuo per fornirti un esempio?

    Fornisci tu i dettagli mancanti, riporta il codice, specifica la libreria che stai utilizzando, fai una ricerca rapida per capire come inviare il comando in questione al server IMAP.

    In mancanza di tutto questo, avendo io la sfera di cristallo in riparazione, non saprei cosa dirti di più.
  • Re: S22.Imap

    Questo è quello che ho .
    Le altre cose sono funzioni che non penso servano per risolvere il problema
    
    Using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Timers;
    using System.Threading;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Mail;
    using S22.Imap;
    using System.Threading.Tasks;
    using System.Runtime.CompilerServices;
    
    namespace mail_test
    {
      public partial class Main : Form
      {
        Historical hist = new Historical();
    
        List<Thread> thread_list = new List<Thread>();
        List<string> white_list = new List<string>();
    
        private const string METRON_CMD = "METRON201";
        private const string HISTORICAL_CMD = "STORICO METRON201";
    
        private string mail_user = "";
        private string mail_pwd = "";
    
        // Variabile che monitora lo stato della connessione ad internet
        private bool net_status = false;
        private static Thread msg_handler;
        private static System.Timers.Timer timer_log;
    
        public Main()
        {
          InitializeComponent();
          //creo timer login
          SetTimer();
          // Carico le credenziali
          Account acc = new Account();
          mail_user = acc.Get_username();
          mail_pwd = acc.Get_password();
    
          // Se le credenziali sono state caricate correttamente
          if(!mail_user.Equals("") && !mail_pwd.Equals(""))
          {
            lbl_username.Text = mail_user;
          }
          else
          {
            string msg = "Username o password non caricati correttamente" + Environment.NewLine;
            msg += "controllare il file " + acc.Get_file();
    
            MessageBox.Show(msg);
            this.Close();
          }
    
          // Carico la white list
          white_list = new White_list_handler().Get_white_list();
    
          for (int i = 0; i < white_list.Count; i++)
          {
            check_list_wl.Items.Add(white_list[i]);
          }
    
          for (int i = 0; i < check_list_wl.Items.Count; i++)
          {
            check_list_wl.SetItemChecked(i, true);
          }
    
          // Mi preparo a ricevere richieste
          Thread t = new Thread(Mail_listener)
          {
            IsBackground = true,
            Priority = ThreadPriority.Highest
          };
         
    
          t.Start();
          thread_list.Add(t);
        }
    
        private void Mail_listener()
        {
          using (ImapClient client = new ImapClient("imap.gmail.com", 993, mail_user, mail_pwd, AuthMethod.Login, true))
          {
            client.NewMessage += new EventHandler<IdleMessageEventArgs>(Handle_mail_recieved_evt);
            while (true) ;
          }
        }
    }
     
  • Re: S22.Imap

    Dovrei far restare attivo il canale perchè dopo un po si scollega
  • Re: S22.Imap

    ap9819 ha scritto:


    Questo è quello che ho.
    Ok, finalmente si comprende che era il nome della libreria usata per il client... vallo a immaginare.

    Se leggi la documentazione, troverai come gestire l'uso del comando IDLE che ti consente di sapere se il server supporta il mantenimento della connessione e la ricezione di notifiche push quando ci sono nuovi messaggi, e anche come gestire la disconnessione durante questa fase di attesa (idle, appunto) per provare a ricollegarti.

    Vedi questo esempi di codice presi direttamente dalla documentazione della libreria:
    Receiving IMAP IDLE notifications
    Handling disconnects during IDLE

    Leggi con attenzione anche il resto della guida in linea per ulteriori dettagli.

    Ciao!
  • Re: S22.Imap

    Grazie mille ora proverò a verificare se il problema era quello grazie anche per la pazienza
Devi accedere o registrarti per scrivere nel forum
11 risposte