9

受信トレイを 10 分ごとにチェックする cron 化された PHP スクリプトがあります。このスクリプトの目的は、当社が提供する SMS 通知サービスの「停止して終了」機能を処理することです。スクリプトがメールの冒頭に「STOP」という単語を含むメールを見つけた場合、通知データベースからユーザーを削除します。

私たちの拠点をカバーするために、上記の基準を満たさない電子メールは、別の電子メール アドレス (エイリアス) に転送され、複数の人が受信して 1 時間ごとにチェックしたいと考えています。ただし、この PHP スクリプトからメールを転送する際に問題が発生しています。

PHPの機能がどのように機能するかを知っていれば、mailメールを送信する前にヘッダーを再挿入する必要があることは明らかです。ただし、MIME マルチパート メールは、バリアや base64 でエンコードされた添付ファイルを含め、常に文字化けしたテキストとして送信されます。

電子メール メッセージを受け取り、PHP スクリプトを使用して適切に転送する簡単な方法を知っている人はいますか?

PHP 5 に組み込まれているネイティブの IMAP 関数を使用しています。PEAR Mail モジュールにもアクセスできます。ただし、Google で検索しても、同様のタスクを実行している例や人を見つけることができませんでした。

4

5 に答える 5

6

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;
}

私はそれを深くテストしたことがなく、いくつかのバグがあると確信していますが、それは始まりかもしれません...このコードを適応させた後、転送スクリプトでインデックス( 、、)を使用$resultできるtextはずです(インスタンス)、MIME 境界をそのまま維持することを心配する必要はありません。htmlattachments

于 2011-01-10T22:55:12.117 に答える
4

これは本当の答えではありませんが、代替方法の提案です。メッセージを既存のアカウント内の別のフォルダーに移動するだけで、はるかに簡単になり、エラーが発生しにくくなる (つまり、配信の問題が発生しない) と思います。つまり、cron が実行され、INBOX 内のすべての電子メールが処理されます。if が STOP を見つけた場合、必要な作業を行い、(IMAP 関数を介して) メールを「Processed」などの名前のサブフォルダーに移動します。それ以外の場合は、電子メールを「Check These」などの名前のサブフォルダーに移動します。そうすれば、転送、追加の配信、または 2 つ目のアカウントについて心配する必要がなくなり、誰もが処理済み、未処理、および保留中のメールを直接監視できます。

于 2010-12-21T21:28:17.500 に答える
1

Swiftmailerライブラリを使用した機能を調べましたか?

http://swiftmailer.org/

私は過去にこれを使用し、あなたが説明したようなアプリケーションではなく、良い結果を得ましたが、件名をチェックして適切なグループに送信したPHPベースの「メーリングリスト」に使用しました.

しかし、私は新しいメッセージを作成しましたが、転送しませんでした. それが役立つことを願っています。

于 2010-12-21T21:22:51.377 に答える
1

これは私に以前に起こったことです。それを修正するために、imap_fetchbody() を使用した後、電子メールの本文で imap_base64() を実行する必要がありました。

$body = imap_fetchbody($imap, 1, 1);
$headers = imap_headerinfo($imap, 1);
$body = imap_base64($body);
于 2010-12-21T21:34:09.233 に答える
0

IO ハンドラーを使用してメールの内容を文字列としてキャプチャし、ヘッダーを分割してから、php の「mail()」関数を使用して送信します。

そうでなければ、本当に php-imap でこれを行いたい場合は、

php-imap 拡張機能は libc-client です。これは pine 電子メール クライアント ソフトウェアの一部であり、pine を使用してそれを行うために必要な手動の手順を理解し、それを行うために pine が行う c-client 呼び出しを調べます。これにより、php で必要な手順が得られます。

c-client のドキュメントはかなり最小限です。使用方法の詳細を取得するには、pine のソースにアクセスするのが最善の方法です。

php 拡張機能の作成者が「便宜上または保護のために」、このパスをブロックするものを省略または変更したことに気付くかもしれません。

于 2014-10-10T02:12:08.723 に答える