Проблема при отправке почты

Focus

Новичок
Проблема при отправке почты

Использую для отправки писем следующую функцию.
Некоторые письма не доходят адресату. Хостер сказал что
письма не соответствуют стандартам RFC. По rfc2047 тема письма должна кодироваться как Base64 или
Quoted-Printable, в ней не должно быть русских символов.

Как переделать мою функцию чтобы все работало нормально?

PHP:
function xmail( $from, $to, $subj, $text, $filename) {
if(is_file($filename))
	{
		$f         = fopen($filename,"rb");
		$un        = strtoupper(uniqid(time()));
		$head      = "From: $from\n";
		$head     .= "To: $to\n";
		$head     .= "Subject: $subj\n";
		$head     .= "X-Mailer: PHPMail Tool\n";
		$head     .= "Reply-To: $from\n";
		$head     .= "Mime-Version: 1.0\n";
		$head     .= "Content-Type:multipart/mixed;";
		$head     .= "boundary=\"----------".$un."\"\n\n";
		$zag       = "------------".$un."\nContent-Type:text/html;\n";
		$zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
		$zag      .= "------------".$un."\n";
		$zag      .= "Content-Type: application/octet-stream;";
		$zag      .= "name=\"".basename($filename)."\"\n";
		$zag      .= "Content-Transfer-Encoding:base64\n";
		$zag      .= "Content-Disposition:attachment;";
		$zag      .= "filename=\"".basename($filename)."\"\n\n";
		$zag      .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
		return @mail("$to", "$subj", $zag, $head);
	}
else
	{
		$subject 	= '=?koi8-r?B?'.base64_encode(convert_cyr_string($subj, "w","k")).'?=';
		$headers  = "Content-type: text/html; charset=windows-1251 \r\n";  
		$headers 	.= "From: FROM <[email protected]>";		
		mail("$to", $subj, $text, $headers);
	}	

}
 

dimagolov

Новичок
как раз наоборот, тут Subject кодируется согласно RFC (ну исключая контроль длинны и разбиение на строки). почему это делается только для сообщений без аттачмента для меня загадка. ну и непонятно зачем при наличии аттачмента subject прописывается дважды.
 

Focus

Новичок
dimagolov
подскажи пожалуйста как при аттачменте правильно прописать этот заголовок, а то ф-я не моя..
 

Фанат

oncle terrible
Команда форума
неужли у нее такая сложная логика?
и непонятно даже, что делает оператор if?
 

Focus

Новичок
Не это понятно.. Не понятно где нужно кодировать..
Когда нет аттачмента - кодируем $subj, когда есть аттачмент - там идет кодирование прикрепленного файла и над темой письма никаких операций нет..
Правильно будет если перед отправкой сообщения я добавлю строку nfr:
PHP:
 $zag      .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
////Добавил строчку
$zag     = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subj, "w","k")).'?=';
 return @mail("$to", "$subj", $zag, $head);
 

Фанат

oncle terrible
Команда форума
эту строку не надо добавлять.
эту строку надо делать один раз, чтобы она была вне if-а
 

Focus

Новичок
тоесть функция должна быть такой..?:

PHP:
function xmail( $from, $to, $subj, $text, $filename) {
 $subject     = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subj, "w","k")).'?=';
if(is_file($filename))
    {
        $f         = fopen($filename,"rb");
        $un        = strtoupper(uniqid(time()));
        $head      = "From: $from\n";
        $head     .= "To: $to\n";
        $head     .= "Subject: $subj\n";
        $head     .= "X-Mailer: PHPMail Tool\n";
        $head     .= "Reply-To: $from\n";
        $head     .= "Mime-Version: 1.0\n";
        $head     .= "Content-Type:multipart/mixed;";
        $head     .= "boundary=\"----------".$un."\"\n\n";
        $zag       = "------------".$un."\nContent-Type:text/html;\n";
        $zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
        $zag      .= "------------".$un."\n";
        $zag      .= "Content-Type: application/octet-stream;";
        $zag      .= "name=\"".basename($filename)."\"\n";
        $zag      .= "Content-Transfer-Encoding:base64\n";
        $zag      .= "Content-Disposition:attachment;";
        $zag      .= "filename=\"".basename($filename)."\"\n\n";
        $zag      .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
        return @mail("$to", $subject , $zag, $head);
    }
else
    {
        $headers  = "Content-type: text/html; charset=windows-1251 \r\n";  
        $headers     .= "From: FROM <[email protected]>";        
        mail("$to", $subject, $text, $headers);
    }    

}
 

dimagolov

Новичок
Focus, найди строчку с заголовком Subject и удали ее. не нужно дважды его устанавливать.
 

Sigorma

Новичок
Focus
Приведи список заголовков которые должны быть указаны согласно RFC но без своего php кода. Полагаю что последние 3 строки кода были выданы хостером как пример правильного использования функции mail(), беда только в том что ТС похоже так и не вкурил.
 
Сверху