Введите имя домена:
.ua .com.ua .in.ua .org.ua
.ru .com .net .org
Показать все домены

Как проверить работу исходящей почты через SMTP

Ответы на вопросы от компании «Украинский хостинг».

Проверка работы исходящей почты через SMTP


Подмена адреса отправителя, на тарифах обычного хостинга, запрещена. Отправителем нужно указывать е-мейл, созданный в домене, с которого настраиваете отправку


Для того, чтобы проверить работу исходящей почты через SMTP, необходимо в корневой папке сайта создать файл SendMailSmtpClass.php, в котором разместить следующий скрипт, без каких либо исправлений:



smtp_username = $smtp_username;
        $this->smtp_password = $smtp_password;
        $this->smtp_host = $smtp_host;
        $this->smtp_port = $smtp_port;
        $this->smtp_charset = $smtp_charset;

		// разделитель файлов
		$this->boundary = "--".md5(uniqid(time()));
		$this->multipart = "";
    }

    /**
    * Отправка письма
    *
    * @param string $mailTo - получатель письма
    * @param string $subject - тема письма
    * @param string $message - тело письма
    * @param string $smtp_from - отправитель. Массив с именем и e-mail
    *
    * @return bool|string В случаи отправки вернет true, иначе текст ошибки
	*
    */
    function send($mailTo, $subject, $message, $smtp_from) {
		// подготовка содержимого письма к отправке
		$contentMail = $this->getContentMail($subject, $message, $smtp_from,$mailTo);

        try {
            if(!$socket = @fsockopen($this->smtp_host, $this->smtp_port, $errorNumber, $errorDescription, 30)){
                throw new Exception($errorNumber.".".$errorDescription);
            }
            if (!$this->_parseServer($socket, "220")){
                throw new Exception('Connection error');
            }

			$server_name = $_SERVER["SERVER_NAME"];
            fputs($socket, "EHLO $server_namern");
			if(!$this->_parseServer($socket, "250")){
				// если сервер не ответил на EHLO, то отправляем HELO
				fputs($socket, "HELO $server_namern");
				if (!$this->_parseServer($socket, "250")) {
					fclose($socket);
					throw new Exception('Error of command sending: HELO');
				}
			}

            fputs($socket, "AUTH LOGINrn");
            if (!$this->_parseServer($socket, "334")) {
                fclose($socket);
                throw new Exception('Autorization error 1');
            }

            fputs($socket, base64_encode($this->smtp_username) . "rn");
            if (!$this->_parseServer($socket, "334")) {
                fclose($socket);
                throw new Exception('Autorization error 2');
            }

            fputs($socket, base64_encode($this->smtp_password) . "rn");
            if (!$this->_parseServer($socket, "235")) {
                fclose($socket);
                throw new Exception('Autorization error 3');
            }

            fputs($socket, "MAIL FROM: <".$this->smtp_username.">rn");
            if (!$this->_parseServer($socket, "250")) {
                fclose($socket);
                throw new Exception('Error of command sending: MAIL FROM');
            }

			$mailTo = str_replace(" ", "", $mailTo);
			$emails_to_array = explode(',', $mailTo);


			foreach($emails_to_array as $email) {
				fputs($socket, "RCPT TO: <{$mailTo}>rn");
				if (!$this->_parseServer($socket, "250")) {
					fclose($socket);
					throw new Exception('Error of command sending: RCPT TO');
				}
			}


            fputs($socket, "DATArn");
            if (!$this->_parseServer($socket, "354")) {
                fclose($socket);
                throw new Exception('Error of command sending: DATA');
            }

            fputs($socket, $contentMail."rn.rn");
            if (!$this->_parseServer($socket, "250")) {
                fclose($socket);
                throw new Exception("E-mail didn't sent");
            }

            fputs($socket, "QUITrn");
            fclose($socket);
        } catch (Exception $e) {
            return  $e->getMessage();
        }
        return true;
    }


	// добавление файла в письмо
	public function addFile($path){
		$file = @fopen($path, "rb");
		if(!$file) {
			throw new Exception("File `{$path}` didn't open");
		}
		$data = fread($file,  filesize( $path ) );
		fclose($file);
		$filename = basename($path);
		$multipart .=  "rn--{$this->boundary}rn";
		$multipart .= "Content-Type: application/octet-stream; name="$filename"rn";
		$multipart .= "Content-Transfer-Encoding: base64rn";
		$multipart .= "Content-Disposition: attachment; filename="$filename"rn";
		$multipart .= "rn";
		$multipart .= chunk_split(base64_encode($data));

		$this->multipart .= $multipart;
		$this->addFile = true;
	}

	// парсинг ответа сервера
    private function _parseServer($socket, $response) {
        while (@substr($responseServer, 3, 1) != ' ') {
            if (!($responseServer = fgets($socket, 256))) {
                return false;
            }
        }
        if (!(substr($responseServer, 0, 3) == $response)) {
            return false;
        }
        return true;
    }

	// подготовка содержимого письма
	private function getContentMail($subject, $message, $smtp_from,$mailTo){
		// если кодировка windows-1251, то перекодируем тему
		if( strtolower($this->smtp_charset) == "windows-1251" ){
			$subject = iconv('utf-8', 'windows-1251', $subject);
		}
        $contentMail = "Date: " . date("D, d M Y H:i:s") . " UTrn";
        $contentMail .= 'Subject: =?' . $this->smtp_charset . '?B?'  . base64_encode($subject) . "=?=rn";

		// заголовок письма
		$headers = "MIME-Version: 1.0rn";

		// кодировка письма
		if($this->addFile){
			// если есть файлы
			$headers .= "Content-Type: multipart/mixed; boundary="{$this->boundary}"rn";
		}else{
			$headers .= "Content-type: text/html; charset={$this->smtp_charset}rn";
		}
		$headers .= "From: {$smtp_from[0]} <{$smtp_from[1]}>rn"; // от кого письмо
         $headers.= "To: ".$mailTo."rn";
        $contentMail .= $headers . "rn";

		if($this->addFile){
			// если есть файлы
			$multipart  = "--{$this->boundary}rn";
			$multipart .= "Content-Type: text/html; charset=utf-8rn";
			$multipart .= "Content-Transfer-Encoding: base64rn";
			$multipart .= "rn";
			$multipart .= chunk_split(base64_encode($message));

			// файлы
			$multipart .= $this->multipart;
			$multipart .= "rn--{$this->boundary}--rn";

			$contentMail .= $multipart;
		}else{
			$contentMail .= $message ."rn";
		}

		// если кодировка windows-1251, то все письмо перекодируем
		if( strtolower($this->smtp_charset) == "windows-1251" ){
			$contentMail = iconv('utf-8', 'windows-1251', $contentMail);
		}

		return $contentMail;
	}

}
?>

После этих действий необходимо в корневой папке сайта создать еще один файл с расширением php (например mail.php), в котором разместить указанный ниже скрипт, указав в нем собственные настройки:



send('poluchatel@gmail.com', 'Тема', 'Текст', $from);
?>

В данном скрипте необходимо изменить отправителя (почтовый ящик отправителя, пароль, SMTP сервер, порт), почтовый ящик получателя, а так же тему и текст письма.

После внесения изменений и их сохранения, необходимо запустить скрипт (в данном случае mail.php) в браузере, после чего на почтовый ящик получателя будет отправлено письмо.

См.также: