check se email è attiva

Salve

ho una lista di indirizzi email interni e vorrei creare qualcosa che mi dica se tale email è attiva o meno.

Ho provato una soluzione, vale a dire l'invio di un'email e aspettandomi eventualmente una notifica che la destinazione non è raggiungibile; ma dopo n test con email inesistenti, non mi è mai arrivata una risposta simile.

In che modo potrei risolvere?

La mia soluzione, cercando di ottenere le notifiche in mioindirizzo@dominio.

$to = "fake@fake";
$subject = "test";
$body = "still active?";
$header = "From: Me <mioindirizzo@dominio>\r\n";
ini_set('sendmail_from', 'mioindirizzo@dominio');
if (mail($to, $subject, $body, $header)) {
  echo("Ok");
} else {
  echo("!Ok");
}
echo "\n";

Grazie

inviato 6 anni fa
larchitetto
X 0 X

Mi è appena arrivata la notifica, indi lo script funziona.

Il problema adesso è un altro: l'applicazione avvia il check, ma non riceverà l'esito della risposta. Sarò poi io a ricevere le varie notifiche per ogni email.

Idee a riguardo?

Grazie  :bye:

risposto 6 anni fa
larchitetto
X 0 X

Aggiungo una domanda, riguardante il medesimo esercizio.

Lo script di prima è diventato una classe:

class LinksDirctoryCSV {
   private $path_name;
   private $handle;
   private $status;
   public function __construct($path_name) {
      $this->path_name = $path_name;
      $this->handle = fopen($this->path_name, "r");
      $this->status = $this->handle !== FALSE;
   }
   public function __destruct() {
      if ($this->status) {
         fclose($this->handle);
      }
   }
   public function __toString() {
      if ($this->status) {
         $opened = "opened r";
      } else {
         $opened = "NOT opened";
      }
      return "{'". $this->path_name. "' [". $opened. "]}";
   }
   public function check_email() {
      $emails = array();
        if ($this->status) {
             while (($data = fgetcsv($this->handle)) !== FALSE) {
                $data = $data[1];
                $count = 0;
                $email = str_replace("mailto:", "", $data, $count);
                if ($count > 0) {
                   $email = str_replace("[at]", "@", $email);
                   $emails[] = $email;
                }
             }
        }
        return $emails;
   }
   public function send_email($from_email, $from_name, $subject, $body) {
      $report = array();
      foreach ($this->check_directory_email() as $to) {
         $header = "From: ". $from_name ." <". $from_email. ">\r\n";
         ini_set('sendmail_from', $from_email);
         if (mail($to, $subject, $body, $header)) {
              $email_sent[] = $to;
              $status = true;
         } else {
            $status = false;
         }
         $report[$to] = $status;
      }
      return $report;
   }
}

Tutto funziona correttamente, ma ho un piccolo bachetto prevedibile. Non appena un oggetto esegue un metodo che richiama fgetcsv et similia, $this->handle scorre tutto il file fino al punto in cui si ferma (o per EOF o altro). Un altro metodo che richiama successivamente fgetcsv et similia si troverebbe parte o tutto il file già letto.

È possibile resettare $this->handle senza dover chiudere e riaprire il file??

risposto 6 anni fa
larchitetto
X 0 X

Rispondo al tuo secondo messaggio.

Allora tu puoi controllare se l'email inserita è corretta o meno. Per vedere se l'account email è attivo o meno lo puoi sapere solamente:

- l'utente ti ha risposto all'email (l'email è arrivata ed è stata letta),

- il server di posta dell'account ti risponde che l'account è inesistente,

- il server di posta dell'account ti risponde che l'account ha la casella di posta piena,

- il server di posta dell'account ti risponde che l'account è stato disattivato,

- il server di posta dell'account ti risponde che l'account è altro.

Negli ultimi casi il server di posta dell'account "incriminato" ti risponde con una email e ti dice che errore è avvenuto.

Per cui tu potresti creare un mini client imap (script in php) che si connette all'account della tua posta elettronica e controlla le varie email alla ricerca di quelle che contengono un errore proveniente dal server di posta della persona che hai tentato di contattare via email.

Se ne trova una legge l'email e ti segnala l'errore e come comportarsi.

Spero di essermi spiegato.

Per:

È possibile resettare $this->handle senza dover chiudere e riaprire il file??

Non ho capito...scusami...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Si si ti sei spiegato pienamente per quanto riguarda l'IMAP client.

Per il file, esplico meglio qua.

$this->handle = fopen($this->path_name, "r");

Cioè è il puntatore al file.

Se utilizzo delle funzioni di lettura, assieme ad altri parametri passo anche $this->handle, ad esempio:

while (($data = fgetcsv($this->handle)) !== FALSE) { /* code */ }

Ciò significa che $this->handle, ad ogni ciclo, aggiorna l'indirizzo puntato, fino all'interruzione del ciclo che può avvenire per diversi motivi, EOF in primis.

Per poter avere $this->handle che punti all'inizio del file, si potrebbe chiudere il file (fclose($this->handle)) per poi riaprirlo nuovamente.

Quindi mi chiedevo se esisteva un modo per far si che $this->handle punti all'inizio del file senza dover chiuderlo e riaprirlo. Altrimenti quei due metodi della classe, ad esempio, non li posso utilizzare, se non chiudo e riapro il file all'inizio di ogni metodo.

Se non si capisce una cippa, a disposizione per esplicare nuovamente, eventualmente...

risposto 6 anni fa
larchitetto
X 0 X

Tu vorresti creare un metodo che ti permetta di riposizionare il puntatore del file all'inizio del file senza dover chiuderlo e riaprirlo giusto?

Hai già dato un occhio alla funzione fseek?

http://php.net/manual/en/function.fseek.php

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Salve,

Ho letto la pagina completa. Ma in ultimo, ho letto il post di Mario. Ha risolto il problema.

Egli ha suggerito a destra, è già dato alla funzione fseek?

Grazie Mario  O0

risposto 6 anni fa
ischio
modificato 6 anni fa
X 0 X
Egli ha suggerito a destra, è già dato alla funzione fseek?

Puoi chiarire questa frase?

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Tu vorresti creare un metodo che ti permetta di riposizionare il puntatore del file all'inizio del file senza dover chiuderlo e riaprirlo giusto?

Si, esattamente questo.

Hai già dato un occhio alla funzione fseek?

http://php.net/manual/en/function.fseek.php

No, non avevo guardato. Una volta lessi che si poteva fare via php, ma non ricordavo come e non sapevo che cercare in verità.

Sembra faccia al caso mio :P

Avevo provato una cosa un po' grezza, cioè una cosa simile:

$this->begin = $this->handle = open($this->path_name, "r");

Per poi creare un metodo di reset da inserire all'inizio di ogni metodo che ne scorre il file:

public function resetter() {
$this->handle = $this->start;
}

Ma non funziona, della serie "ci ho provato" :D

Grazie  O0

risposto 6 anni fa
larchitetto
X 0 X

Facci sapere come va con fseek.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Funziona!  O0

class File extends BaseFile {
  private $path_name;
  private $handle;
  private $status;
  private $mode;
  public function __construct($path_name, $mode = "r") {
    $this->path_name = $path_name;
    $this->mode = $mode;
    $this->handle = fopen($this->path_name, $this->mode);
    $this->status = $this->handle !== FALSE;
  }
  public function __destruct() {
    if ($this->status) {
      fclose($this->handle);
    }
  }
  public function __toString() {
    if ($this->status) {
      $opened = "opened ". $this->mode;
    } else {
      $opened = "NOT opened";
    }
    return "{'". $this->path_name. "' [". $opened. "]}";
  }
  public function seek($point = 0) {
    //http://php.net/manual/en/function.fseek.php
    if ($this->status) {
      fseek($this->handle, $point);
    }
  }
  public function read() {
    $this->seek();
    if ($this->status) {
      return fread($this->handle, filesize($this->path_name));
    }
  }
}

BaseFile è una classe astratta che recupera solamente tutte le informazioni date di base del php per poter sapere ad esempio le dimensioni del file, e cose così...

Tale classe può essere estesa, per overridare il metodo read, così da differenziare il tipo di lettura se file di testo, xml, csv... e se per carattere, per linea...

 :bye:

risposto 6 anni fa
larchitetto
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda