3

下書きした電子メールに添付ファイルを追加しようとしていますが、機能しないようです。ここここの例に従おうとしましたが、成功しませんでした。

これまでのところ、私ができることは次のとおりです。

  1. Exchange サーバーに接続する
  2. メールボックスを開く
  3. HTMLメールの下書き
  4. 電子メールをメールボックスに追加し、html を正しくレンダリングします。(コンテンツタイプとして text/html を使用する場合)。他のものを使用すると、html がプレーンテキストとして表示されます。

補足として、下書きが作成された後、電子メールは Exchange 2010 サーバーのメールボックスに追加され、表示されてから Outlook 2010 経由で送信されます。

以下は、私のメーラー クラスと、メールを下書きするためのコードです。

メーラー.php

<?php

class mailer
{
    const USER      =   'user';
    const PASSWORD  =   'pass';
    const MAILBOX   =   '{conn}DRAFTS';

    // STRING ORDER: $content-type . $from . $to . $cc . $subject . "\r\n\r\n" . $message
    public $message;
    public $imap_conn;
    public $boundary;

    function __construct()
    {
        // Open the message property so we can start appending strings.
        $this->message = '';

        // Open the IMAP connection
        $this->imap_conn = imap_open(self::MAILBOX,self::USER,self::PASSWORD);
    }

    public function content_type($string_type)
    {
        $this->message .= "Content-type:{$string_type}\r\n";
    }

    public function from($string_from)
    {
        $this->message .= "From:{$string_from}\r\n";
    }

    public function to($string_to)
    {
        $this->message .= "To:{$string_to}\r\n";
    }

    public function cc($string_cc)
    {
        $this->message .= "Cc:{$string_cc}\r\n";
    }

    public function mime($float_mime_version)
    {
        $this->message .= "MIME-Version:{$float_mime_version}\r\n";
    }

    public function subject($string_subject)
    {
        $this->message .= "Subject:{$string_subject}\r\n\r\n";
    }

    public function message($string_message)
    {
        $this->message .= "{$string_message}\r\n";
    }

    public function set_boundary($string_boundary)
    {
        $this->boundary = $string_boundary;
    }

    public function append()
    {
        imap_append($this->imap_conn,self::MAILBOX,$this->message,"\\Draft");
        imap_close($this->imap_conn);
    }
}

?>

ドラフトコード

// A random hash used for the boundary
$rh = md5(date('c',time()));
$data = chunk_split(base64_encode('Testing'));


$m = new mailer;
$m->set_boundary('--PHP-mixed-' . $rh);
$m->content_type('multipart/mixed; boundary="' . $m->boundary . '"');
$m->mime('1.0');
$m->from('from@mail.com');
$m->to('to@mail.com');
$m->cc('cc1@mail.com,cc2@mail.com');
$m->subject('A new email');
$m->message("
    {$m->boundary}
    Content-Type: text/html; charset=\"utf-8\"
    Content-Transfer-Encoding: base64

    Testing my <b>HTML</b>
    </br>
    {$m->boundary}
    Content-Type: application/octet-stream; name=\"test.txt\"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename=\"test.txt\"

    {$data}
    {$m->boundary}--
    "));
$m->append();

追加される前のメッセージ

Content-type:multipart/mixed; boundary="--PHP-mixed-b408f941593cf92b5a8bd365abb4e64f"
MIME-Version:1.0
From:from@mail.com
To:to@mail.com
Cc:cc1@mail.com
Subject:New Message


            --PHP-mixed-b408f941593cf92b5a8bd365abb4e64f
            Content-Type: text/html; charset="utf-8"
            Content-Transfer-Encoding: "base64"

            My <b>html</b> content



            --PHP-mixed-b408f941593cf92b5a8bd365abb4e64f
            Content-Type: application/octet-stream; name="test.txt"
            Content-Transfer-Encoding: base64
            Content-Disposition: attachment; filename="test.txt"



            --PHP-mixed-b408f941593cf92b5a8bd365abb4e64f--
4

2 に答える 2

1

質問: IMAP 経由で PHP で下書きした電子メールに添付ファイルを追加するにはどうすればよいですか?

回答: つまり、問題は 2 つの場所にありました。

  1. 改行 (\r\n) の不適切な配置。各ヘッダーの後に 1 つの改行を入れ、セクションの各終了ヘッダーの後に 2 つの改行を入れる必要があります。図 1 を参照してください。

  2. 不適切な境界。境界は -- で始まり、その後に一意の文字列が続く必要があります。メッセージの終了境界は、次で始まり、次で終わる必要があります -- 図 2 を参照してください

図1

Content-Type: text/html\r\n
Content-Encoding: base64\r\n\r\n
"Message text here."\r\n

図 2

--unique
Content-Type: text/html\r\n
Content-Encoding: base64\r\n\r\n
HTML stuff here.\r\n
--unique
Content-Type: application/octet-stream\r\n
Content-Disposition: attachment; filename=\"logs.csv\"\r\n
Content-Transfer-Encoding: base64\r\n\r\n
Attachment(s)\r\n
--unique--

これを正しく理解するのに非常に長い時間がかかったので、これについてより詳細な記事を書く予定です.

于 2013-04-22T20:49:43.527 に答える
0

これまでのデバッグについてさらに情報を提供していただけると助かります。ファイルは正常に読み取られていますか? メールボックスに何か届きますか?また、最後の追加の前に完全なメッセージの出力を確認するのにも役立ちます。

これで解決するかどうかはわかりませんが、成功したコードと 2 番目の例から、メッセージには追加のファイル名プロパティがあり、値は引用符で囲まれているはずです。

Content-Type: application/octet-stream; name="test.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.txt"
于 2013-04-18T19:27:23.293 に答える