Autor | Zpráva | ||
---|---|---|---|
Venca Profil * |
#1 · Zasláno: 21. 1. 2005, 17:25:00
Zdravím, mám jeden problém se kterým si nevím rady, chtěl jsem si udělat mailer v php5. problém je ten, že když odesílám mail s přílohou, tak má příloha o 57 bytů míň než předtím, to je docela tristní :) A text zprávy se též nezobrazí. Musím tam mít asi nějakej error v těle mailu. Lámal sem si s tím hlavu už dva dny a jsem zoufalej.
Vím, že kód je docela dlouhej 3.8K, ale třeba si někdo z vás všimne, co tám mám za chybu. Díky class mail { private $attachments; private $boundary; public $headers; private $nl; private $encoding_charset; private $encoding_binary; private $encoding_text; private $text_encoding_types; public $to; public $from; public $subject; public $body; public function __construct($to, $from, $subject, $body, $attachments = false) { $this->boundary = "bound-".md5(uniqid(time())); $this->nl = "\n"; $this->encoding_binary = "base64"; $this->encoding_text = "quoted-printable"; $this->encoding_charset = "iso-8859-2"; $this->text_encoding_types = array("text/plain", "text/html"); $this->to = $to; $this->from = $from; $this->subject = $subject; $this->body = $body; $this->headers .= "MIME-Version: 1.0\n"; $this->headers .= "To: $this->to\n"; $this->headers .= "From: {$this->from}\n"; $this->headers .= "Sender: {$this->from}\n"; $this->headers .= "Reply-To: {$this->from}\n"; $this->headers .= "Subject: {$this->subject}\n"; $this->headers .= "X-Mailer: PHP ".phpversion()."\n"; $this->check_attachments($attachments); } private function check_attachments($attachments) { if (is_array($attachments)) foreach ($attachments as $val) { $fp = fopen($val, "r"); $message = fread($fp, filesize($val)); fclose($fp); $this->add_attachment($message, $val); } else $this->boundary = false; } private function add_attachment($message, $name, $ctype = "application/octet-stream") { $this->attachments[] = array("message" => $message, "name" => $name, "ctype" => $ctype); } private function build() { $ret = ""; $ret .= "Content-Type: multipart/mixed; boundary = \"{$this->boundary}\"{$this->nl}"; $ret .= "This is a multi-part message in MIME format.{$this->nl}{$this->nl}"; $ret .= "--{$this->boundary}"; $this->attachments = array_reverse($this->attachments); foreach ($this->attachments as $val) $ret .= $this->build_parts($val)."--{$this->boundary}"; $ret .= "--"; return $ret; } private function build_parts($attachment) { $ret = ""; $message = $attachment["message"]; if (!in_array($attachment["ctype"], $this->text_encoding_types)) { $message = chunk_split(base64_encode($message)); $ret .= "{$this->nl}Content-Transfer-Encoding: {$this->encoding_binary}{$this->nl}"; $ret .= "Content-Type: {$attachment["ctype"]}; name = \"{$attachment["name"]}\"{$this->nl}"; $ret .= "Content-Disposition: attachment; name = \"{$attachment["name"]}\"{$this->nl}{$this->nl}"; } else { $message = $this->quoted_printable_decode($message); $ret .= "{$this->nl}Content-Transfer-Encoding: {$this->encoding_text}{$this->nl}"; $ret .= "Content-Type: {$attachment["ctype"]}; charset={$this->encoding_charset}{$this->nl}{$this->nl}"; } $ret .= $message.$this->nl.$this->nl; return $ret; } private function quoted_printable_decode($str) { $ret = ""; for($i = 0; $i < strlen($str); $i++) $ret .= (ord($str[$i]) > 127)?"=".bin2hex($str[$i]):$str[$i]; return $ret; } public function send() { if (is_array($this->attachments)) { $this->add_attachment($this->body, "", "text/plain"); $this->headers = $this->build(); return mail($this->to, $this->subject, "", $this->headers); } else return mail($this->to, $this->subject, $this->body, $this->headers); } } |
||
Časová prodleva: 23 dní
|
|||
Jakub Vrána Profil * |
#2 · Zasláno: 13. 2. 2005, 20:36:46
Jednu chybu vidím v "fread($fp, filesize($val));". Druhý parametr slouží k určení délky, která se maximálně může načíst, ne k určení délky, která se vždy načte. Lepší je proto použít funkci file_get_contents(). Tím to ale nejspíš nebude.
Pak mi také přijde divné "$ret .= $message.$this->nl.$this->nl;". Nemělo by tam být jenom jedno NL? Tady bych dvě NL dal spíše za hlavičku. $ret .= "Content-Type: multipart/mixed; boundary = \"{$this->boundary}\"{$this->nl}"; A na závěr mi přijde divné, že celá zpráva se posílá v parametru additional_headers funkce mail(). Osobně bych tam dal jenom hlavičky a tělo zprávy bych dal do parametru message. |
||
Časová prodleva: 20 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0