Domanda

Abbiamo uno script PHP cron'ed che controlla una casella di posta ogni dieci minuti. Lo scopo di questo script è quello di gestire "STOP per uscire" la funzionalità per il nostro servizio di notifica via SMS forniamo. Se lo script rileva eventuali messaggi di posta elettronica con la parola "STOP" all'inizio della e-mail, togliamo l'utente dal nostro database di notifica.

Per coprire le nostre basi, vorremmo qualsiasi email che non soddisfano i criteri di cui sopra devono essere inoltrati a un altro indirizzo di posta elettronica (che è un alias) che molte persone ricevono e controllare ogni ora. Tuttavia, stiamo incorrere in problemi di inoltro dei messaggi di posta elettronica da questo script PHP.

Conoscere come la funzione mail di lavori PHP, è abbastanza ovvio che abbiamo bisogno di reinserire le intestazioni prima di spedire. Tuttavia, MIME email multipart sempre vengono inviati come garble del testo, inclusi le barriere e gli eventuali allegati Base64 codificati.

Qualcuno sa di un modo semplice per fare un messaggio e-mail e lo trasmette sulla corretta utilizzando uno script PHP?

Stiamo usando le funzioni IMAP native incorporate in PHP 5. Abbiamo anche l'accesso al modulo PEAR Mail. Tuttavia, siamo stati in grado di trovare qualsiasi esempi o persone che fanno attività simili ricerca Google.

È stato utile?

Soluzione

ho codificato questo metodo molto tempo fa per analizzare un messaggio di e-mail nelle loro parti appropriate tramite IMAP:

function Message_Parse($id)
{
    if (is_resource($this->connection))
    {
        $result = array
        (
            'text' => null,
            'html' => null,
            'attachments' => array(),
        );

        $structure = imap_fetchstructure($this->connection, $id, FT_UID);

        if (array_key_exists('parts', $structure))
        {
            foreach ($structure->parts as $key => $part)
            {
                if (($part->type >= 2) || (($part->ifdisposition == 1) && ($part->disposition == 'ATTACHMENT')))
                {
                    $filename = null;

                    if ($part->ifparameters == 1)
                    {
                        $total_parameters = count($part->parameters);

                        for ($i = 0; $i < $total_parameters; $i++)
                        {
                            if (($part->parameters[$i]->attribute == 'NAME') || ($part->parameters[$i]->attribute == 'FILENAME'))
                            {
                                $filename = $part->parameters[$i]->value;

                                break;
                            }
                        }

                        if (is_null($filename))
                        {
                            if ($part->ifdparameters == 1)
                            {
                                $total_dparameters = count($part->dparameters);

                                for ($i = 0; $i < $total_dparameters; $i++)
                                {
                                    if (($part->dparameters[$i]->attribute == 'NAME') || ($part->dparameters[$i]->attribute == 'FILENAME'))
                                    {
                                        $filename = $part->dparameters[$i]->value;

                                        break;
                                    }
                                }
                            }
                        }
                    }

                    $result['attachments'][] = array
                    (
                        'filename' => $filename,
                        'content' => str_replace(array("\r", "\n"), '', trim(imap_fetchbody($this->connection, $id, ($key + 1), FT_UID))),
                    );
                }

                else
                {
                    if ($part->subtype == 'PLAIN')
                    {
                        $result['text'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
                    }

                    else if ($part->subtype == 'HTML')
                    {
                        $result['html'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
                    }

                    else
                    {
                        foreach ($part->parts as $alternative_key => $alternative_part)
                        {
                            if ($alternative_part->subtype == 'PLAIN')
                            {
                                echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';

                                $result['text'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
                            }

                            else if ($alternative_part->subtype == 'HTML')
                            {
                                echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';

                                $result['html'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
                            }
                        }
                    }
                }
            }
        }

        else
        {
            $result['text'] = imap_body($this->connection, $id, FT_UID);
        }

        $result['text'] = imap_qprint($result['text']);
        $result['html'] = imap_qprint(imap_8bit($result['html']));

        return $result;
    }

    return false;
}

Non ho mai testato a fondo e sono sicuro che ha qualche bug, ma potrebbe essere un inizio ... Dopo aver adattato questo codice si dovrebbe essere in grado di utilizzare gli indici $result (text, html, attachments) con lo script di inoltro (usando SwiftMailer per esempio), senza preoccuparsi di mantenere intatti i confini MIME.

Altri suggerimenti

Questo non è davvero una risposta, ma un suggerimento per un metodo alternativo. Penso che sarebbe molto più semplice e meno soggetto a errori (vale a dire, nessun problema di consegna) se semplicemente spostato i messaggi in giro per diverse cartelle all'interno del conto esistente. Vale a dire, le piste ed i processi tutti i messaggi di posta elettronica in Posta in arrivo cron. Se se reperti di STOP, lo fa il lavoro richiesto e poi (tramite le funzioni IMAP) semplicemente sposta l'email in una sottocartella denominata "elaborati" o simili. In caso contrario, si muove l'e-mail in una sottocartella denominata "Check Questi" o simili. Quindi non c'è bisogno di preoccuparsi di inoltro, o ulteriori consegne, o di un secondo conto, e tutti possono controllare direttamente i trasformati, allo stato grezzo, e mail in attesa.

Hai dato un'occhiata a funzionalità utilizzando Swiftmailer biblioteca?

http://swiftmailer.org/

Ho usato questo in passato e hanno ottenuto buoni risultati, sebbene sapessimo non in un'applicazione come avete descritto, ho invece utilizzato per PHP basate 'mailing list' in cui ho controllato per soggetti ed inviato ai gruppi.

Ma ho creato un nuovo messaggio, non lo feci avanti. Speranza che aiuta.

Questo è successo a me prima. Al fine di risolvere il problema che ho dovuto fare un imap_base64 () sul corpo della e-mail dopo aver imap_fetchbody utilizzato ().

$body = imap_fetchbody($imap, 1, 1);
$headers = imap_headerinfo($imap, 1);
$body = imap_base64($body);

utilizzare un gestore di IO per catturare il contenuto della e-mail sotto forma di stringa, dividere le intestazioni e quindi utilizzare il PHP 'mail ()' funzione per inviarlo.

Altrimenti, se si vuole veramente fare questo con php-imap,

l'estensione php-imap è libc-client, che è parte del software client di posta elettronica pine capire i passaggi manuali necessari per farlo utilizzando pino e poi guardare il c-client chiama marche di pino per farlo. che vi darà i passi necessari in php.

la documentazione c-client è piuttosto minimale, andare alla fonte pino è il modo migliore per ottenere i dettagli di utilizzo.

Credo che si potrebbe scoprire che l'autore dell'estensione di PHP ha "per la vostra convenienza o protezione" omessa o roba cambiato che blocca questo percorso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top