@artmirarmi

Почему не отправляется письмо?

Всех приветствую! Нужно сделать так, чтобы скрипт отправлял письмо на email. Письмо доходит до адресата, но оно почему-то пустое. Что я делаю не так?

Вот заголовки письма:

Date: Mon, 11 Jun 2018 4:53:21 +0300 (MSK/MSD)
From: <from@domen.ru>
X-Mailer: Yamail [ http://yandex.ru ] 5.0
Reply-To: <from@domen.ru>>
X-Priority: 3 (Normal)
Message-ID: <1528692801@salettalocal.ru>
Subject: Тема письма
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="-----SD6ty54H54JDGSHJD"
To: <gfdgfd@mai.ru>

-----SD6ty54H54JDGSHJD
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit


<p>Hello world!</p>
-----SD6ty54H54JDGSHJD--
.


<?php
class Mail {
	private $smtpConnect;
	private $login, $password;
	private $path;
	private $separator = '-----SD6ty54H54JDGSHJD';
	
	public function __construct($login, $password) {
		$this->login = $login;
		$this->password = $password;
		
		$this->smtpConnect = fsockopen('mail.saletta.ru', 25, $errno, $errstr, 10);
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, "EHLO mail.saletta.ru\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, "AUTH LOGIN\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, base64_encode($login) . "\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, base64_encode($password) . "\r\n");
		$data = $this->getData($this->smtpConnect);
	}
	
	public function send($to, $msg, $files = []) {
		$this->path = 'templates/texts/emails/' . $msg . '.tpl';
		if(!file_exists($this->path)) {
			$this->close();
			exit('Файл почты <b>' . basename($this->path) . '</b> не существует');
		}
		
		$msg = file_get_contents($this->path);
		$subject = $this->getSubject($msg);
		$text = $this->getHeadersByText($this->getText($msg));
		$headers = $this->getHeaders($to, $subject);
		
		if(!empty($files)) $text = $this->addFiles($text, $files);
		
		if(is_array($to)) {
			$result = [];
			for($i = 0, $count = count($to); $i < $count; $i++) {
				$headers .= 'To: <' . $to[$i] . ">\r\n";
				$result[] = $this->sendMail($this->login, $to[$i], $headers, $text);
			} return $result;
		}
		$headers .= 'To: <' . $to . ">\r\n";
		return $this->sendMail($this->login, $to, $headers, $text);
	}
	
	private function sendMail($from, $to, $headers, $text) {
		fputs($this->smtpConnect, 'MAIL FROM:' . $from . "\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, 'RCPT TO:' . $to . "\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, "DATA\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, $headers . "\r\n" . $text . "\r\n" . $this->separator . "--\r\n.\r\n");
		$data = $this->getData($this->smtpConnect);
		
		fputs($this->smtpConnect, "RSET\r\n");
		$data = $this->getData($this->smtpConnect);
		return $data;
	}
	
	public function close() {
		fputs($this->smtpConnect, "QUIT\r\n");
		$data = $this->getData($this->smtpConnect);
		return $data;
	}
	
	private function getData($smtpConnect) {
		$data = '';
		while($str = fgets($smtpConnect, 515)) {
			$data .= $str;
			if(substr($str, 3, 1) == ' ') break;
		} return $data;
	}
	
	private function getHeaders($to, $subject) {
		$headers = 'Date: ' . date('D, j M Y G:i:s') . " +0300 (MSK/MSD)\r\n";
		$headers .= 'From: <' . $this->login . ">\r\n";
		$headers .= "X-Mailer: Yamail [ http://yandex.ru ] 5.0\r\n";
		$headers .= 'Reply-To: <' . $this->login . ">\r\n";
		$headers .= "X-Priority: 3 (Normal)\r\n";
		$headers .= 'Message-ID: <' . time() . '@' . Config::ADDRESS2 . ">\r\n";
		$headers .= 'Subject: ' . $subject . "\r\n";
		$headers .= "MIME-Version: 1.0\r\n";
		$headers .= "Content-type: multipart/mixed; boundary=\"" . $this->separator . "\"\r\n";
		return $headers;
	}
	
	private function getHeadersByText($text) {
		$headers = $this->separator . "\r\n";
		$headers .= "Content-Type: text/html; charset=utf-8\r\n";
		$headers .= "Content-Transfer-Encoding: 8bit\r\n";
		$text = $headers . $text;
		return $text;
	}
	
	private function getSubject($msg) {
		$pattern = '/\{subject\}(.*)\{\/subject\}/';
		preg_match($pattern, $msg, $m);
		return $m[1];
	}
	
	private function getText($msg) {
		$pattern = '/\{subject\}(.*)\{\/subject\}/';
		$msg = preg_replace($pattern, '', $msg, 1);
		return $msg;
	}
	
	private function addFiles($text, $files) {
		for($i = 0, $count = count($files); $i < $count; $i++) {
			$name = basename($files[0]);
			
			$text .= "\r\n\r\n" . $this->separator . "\r\n";
			$text .= "Content-Type: application/octet-stream; name=\"$name\"\r\n";
			$text .= "Content-transfer-encoding: base64\r\n";
			$text .= "Content-Disposition: attachment; filename=\"$name\"\r\n";
			$text .= chunk_split(base64_encode(fread(fopen($files[0], 'rb'), filesize($files[0]))));
		}
		return $text;
	}
}
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
я прошу прощения за странный вопрос, но... PHPMailer почему не подошел? Готовый проверенный класс...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Zelo Москва
от 130 000 руб.
Digital Clouds Новосибирск
от 60 000 руб.
АКМЭ сервис Санкт-Петербург
от 100 000 руб.