4

PHPメール機能を使用して、HTML本文と添付ファイルを含むメールを送信しようとしています。添付ファイルがないと、問題なくHTMLメールを受信できますが、ファイルを添付しようとすると、本文にすべてのMIME情報が含まれ、添付ファイルもエンコードされます。

添付ファイルなしの電子メール関数のコードは次のとおりです。これは問題なく機能します。

        $this->to = $to;
        $this->subject = $subject;
        $this->message = $message;
        $this->headers = "From: " . Mailer::FROM_EMAIL . "\r\n";
        $this->headers .= "MIME-Version: 1.0\r\n";
        $this->headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

そして、これが添付ファイル付きの電子メールバージョンのコードです。

        $this->to = $to;
        $this->subject = $subject;
        $this->attachment = 
                chunk_split(base64_encode(file_get_contents($attachment)));        

        //create a boundary string. It must be unique 
        //so we use the MD5 algorithm to generate a random hash        
        $boundary = md5(date('r', time()));                
        $this->headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com\r\n";        
        $this->headers .= "MIME-Version: 1.0\r\n ";
        $this->headers .= "Content-Type: multipart/mixed; boundary=\"PHP-mixed-$boundary\"\r\n"; 

        $this->message =    
"--PHP-mixed-$boundary
Content-Type: text/html; charset=\"ISO-8859-1\"

" . $message . "


--PHP-mixed-$boundary
Content-Type: application/pdf; name=\"test.pdf\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

".$this->attachment ."
--PHP-mixed-$boundary--";

私はこの関数を使用してメールを送信しています:

public function send(){

    if (preg_match(Mailer::PATTERN, trim(strip_tags($this->to)))) { 
        $cleanedTo = trim(strip_tags($this->to)); 
    } else { 
        return FALSE; 
    }                 
    return mail ($cleanedTo, $this->subject, $this->message, $this->headers); 
}

そして、次のようにMailerオブジェクトを作成します。

$mailer = new Mailer("youremail@gmail.com", "test mail", "Some <b>old good</b> HTML email", 'pdf/test.pdf');
//$mailer = new Mailer("youremail@gmail.com", "test mail", "Some <b>old good</b> HTML email");

$mailer->send();

そして、私が受け取る電子メールは次のとおりです。

--PHP-mixed-e37929b72bbc6f8e3b37cf802619aac1
Content-Type: text/html; charset="ISO-8859-1"

Some <b>old good</b> HTML email


--PHP-mixed-e37929b72bbc6f8e3b37cf802619aac1
Content-Type: application/pdf; name="test.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment

JVBERi0xLjMKMSAwIG9iago8 ... FT0YK

--PHP-mixed-e37929b72bbc6f8e3b37cf802619aac1--

私は答えに本当に近いと思います、しかし...私はそれを見つけるためにあなたの助けが必要です。

4

2 に答える 2

2
$this->headers .= "MIME-Version: 1.0\r\n ";
$this->headers .= "Content-Type: multipart/mixed; boundary=\"PHP-mixed-$boundary\"\r\n"; 

MIME-Version 行の改行の後のスペースを削除します。Content-Type の前にあるこの末尾のスペースにより、前の行の続きになります。

ところで: コードが Linux/Unix で実行されている場合は、各行の最後にのみ "\n" を使用してください。

于 2012-12-27T19:54:26.417 に答える
0

このヘッダーを使用します:

Content-Type:multipart/mixed;

また、私はこのクラスを見ることをお勧めします

于 2012-12-24T14:22:56.657 に答える