Autor Zpráva
Venca
Profil *
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);
}
}
Jakub Vrána
Profil *
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}";

$ret .= "This is a multi-part message in MIME format.{$this->nl}{$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.
Toto téma je uzamčeno. Odpověď nelze zaslat.