Question

Nous avons un script PHP cron'ed qui vérifie une boîte de réception toutes les dix minutes. Le but de ce script est de gérer « STOP pour quitter » fonctionnalité pour notre service de notification par SMS que nous fournissons. Si le script trouve des e-mails avec le mot « STOP » au début de l'e-mail, nous enlevons l'utilisateur de notre base de données de notification.

Pour couvrir nos bases, nous aimerions tous les e-mails qui ne répondent pas aux critères ci-dessus pour être transmis à une autre adresse e-mail (ce qui est un alias) que plusieurs personnes reçoivent et vérifier toutes les heures. Cependant, nous sommes en cours d'exécution dans les problèmes des e-mails à partir expédition ce script PHP.

Savoir comment la fonction mail des travaux PHP, il est évident nous avons besoin tout à fait pour les en-têtes réinsérez avant de l'envoyer. Cependant, des e-mails de MIME multipart sont envoyés comme toujours garble du texte, y compris les barrières et les pièces jointes base64 codées.

Quelqu'un sait-il d'un moyen simple de prendre un message e-mail et l'envoyer sur l'utilisation appropriée d'un script PHP?

Nous utilisons les fonctions IMAP natives intégrées à PHP 5. Nous avons également accès au module PEAR Mail. Cependant, nous avons été incapables de trouver des exemples ou des personnes effectuant des tâches similaires en effectuant une recherche Google.

Était-ce utile?

La solution

Je codé cette méthode il y a beaucoup de temps pour analyser un message électronique dans leurs parties appropriées en utilisant 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;
}

Je ne l'ai jamais testé profondément et je suis sûr qu'il a quelques bugs, mais il pourrait être un début ... Après avoir adapté ce code, vous devriez être en mesure d'utiliser les indices de $result (text, html, attachments) avec votre script de transfert (en utilisant SwiftMailer par exemple), sans se soucier de maintenir les limites MIME intactes.

Autres conseils

Ce n'est pas vraiment une réponse, mais une suggestion pour une autre méthode. Je pense que ce serait beaucoup plus simple et moins sujette à l'erreur (à savoir, pas de problèmes de livraison) si vous avez simplement déplacé les messages autour de différents dossiers dans le compte existant. À savoir, les pistes Cron et traite tous les e-mails dans INBOX. Si si trouve arrêt, il fait le travail nécessaire, puis (via des fonctions IMAP) se déplace simplement l'e-mail à un sous-dossier nommé « traité » ou similaire. Dans le cas contraire, il déplace l'e-mail à un sous-dossier nommé « Check Ces » ou similaires. Ensuite, vous n'avez pas à vous soucier de la transmission, ou d'autres livraisons, ou un deuxième compte, et tout le monde peut surveiller les traités, non transformés, et en attente mails directement.

Avez-vous pris un coup d'œil à la fonctionnalité en utilisant Swiftmailer bibliothèque?

http://swiftmailer.org/

J'ai utilisé dans le passé et ont obtenu de bons résultats, altho pas dans une application comme vous avez décrit, je l'ai cependant utilisé pour «listes de diffusion de PHP sur la base où je VÉRIFIÉ sujet et envoyé à un groupe approprié.

Mais j'ai créé un nouveau message, n'a pas transmis. Hope qui aide.

Ce qui est arrivé à moi avant. Pour résoudre ce problème, je devais faire un imap_base64 () sur le corps de l'e-mail après avoir utilisé imap_fetchbody ().

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

utiliser un gestionnaire IO pour capturer le contenu de l'e-mail comme une chaîne, divisée sur les en-têtes, puis utilisez le php « mail () » la fonction de l'envoyer.

Sinon, si vous voulez vraiment faire avec php-imap,

l'extension php-imap est libc-client qui fait partie du logiciel client de messagerie pin figure les étapes manuelles nécessaires pour le faire en utilisant le pin, puis regarder le c-client appelle marques pin de le faire. qui vous donnera les étapes nécessaires en php.

la documentation c-client est assez minime, aller à la source de pin est la meilleure façon d'obtenir les détails d'utilisation.

Je pense que vous pouvez constater que l'auteur de l'extension php a « pour votre commodité ou protection » omis ou des choses changé qui bloque ce chemin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top