Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#1 2010-06-26 22:27:34

Luca
Участник
Зарегистрирован: 2009-03-19
Сообщений: 398
Рейтинг :   

SMTP авторизованная отправка

Почти все развитые CMS умеют отправлять сообщения через авторизованные SMTP соединения. NG умеет только через функцию mail в PHP - это не удобно. Приходится вместо модуля CMS для регистрации использовать модуль форума. У меня FluxBB - он это дело умеет.

Хотелось бы иметь такую возможность в NG. Я думаю код можно у FluxBB позаимствовать.

Не в сети

#2 2011-01-02 18:23:33

Luca
Участник
Зарегистрирован: 2009-03-19
Сообщений: 398
Рейтинг :   

Re: SMTP авторизованная отправка

Таки всё еще актуально! Без этого NG не пригодна для Windows хостингов!

Не в сети

#3 2011-01-15 02:24:17

WESTnik
Участник
Зарегистрирован: 2011-01-13
Сообщений: 1
Рейтинг :   

Re: SMTP авторизованная отправка

Пример в котором реализована отправка писем с использованием smtp-сервера, для которого требуется авторизация. Поэтому не забудь добавить в скрипт соответствующие реквизиты доступа, например:

<?php

 $mhSmtpMail_Server     = "smtp.domain.tld";       // Укажите адрес SMTP-сервера
 $mhSmtpMail_Port       = "25";                    // Порт SMTP-сервера, как правило 25
 $mhSmtpMail_Username   = "postmaster@domain.tld"; // Имя почтового ящика (пользователя)
 $mhSmtpMail_Password   = "password";              // и пароль к нему.
 $mhSmtpMail_From       = "Имя отправителя";       // Имя отправителя в поле From

// Обратите внимание, что в условиях нашей почтовой системы, имя пользователя требуется указывать полностью, например postmaster@domain.tld

function MailSmtp($to, $subject, $message, $headers)

{

  global $mhSmtpMail_Server, $mhSmtpMail_Port, $mhSmtpMail_Username, $mhSmtpMail_Password;

  $mhSmtpMail_localhost  = "localhost";
  $mhSmtpMail_newline    = "\r\n";
  $mhSmtpMail_timeout    = "30";

  $smtpConnect = fsockopen($mhSmtpMail_Server, $mhSmtpMail_Port, $errno, $errstr, $mhSmtpMail_timeout);
  $smtpResponse = fgets($smtpConnect, 515);

  if(empty($smtpConnect))
    {
      $output = "Failed to connect: $smtpResponse";
      return $output;
    }
  else
    {
      $logArray['connection'] = "Connected: $smtpResponse";
    }

  fputs($smtpConnect,"AUTH LOGIN" . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['authrequest'] = "$smtpResponse";

  fputs($smtpConnect, base64_encode($mhSmtpMail_Username) . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['authmhSmtpMail_username'] = "$smtpResponse";

  fputs($smtpConnect, base64_encode($mhSmtpMail_Password) . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['authmhSmtpMail_password'] = "$smtpResponse";

  fputs($smtpConnect, "HELO $mhSmtpMail_localhost" . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['heloresponse'] = "$smtpResponse";

  fputs($smtpConnect, "MAIL FROM: $mhSmtpMail_Username" . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['mailmhSmtpMail_fromresponse'] = "$smtpResponse";

  fputs($smtpConnect, "RCPT TO: $to" . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['mailtoresponse'] = "$smtpResponse";

  fputs($smtpConnect, "DATA" . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['data1response'] = "$smtpResponse";

  fputs($smtpConnect, "Subject: $subject\r\n$headers\r\n\r\n$message\r\n.\r\n");

  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['data2response'] = "$smtpResponse";

  fputs($smtpConnect,"QUIT" . $mhSmtpMail_newline);
  $smtpResponse = fgets($smtpConnect, 515);
  $logArray['quitresponse'] = "$smtpResponse";

}

?>

Этот код можно добавить в function sendEmailMessage после " $message    .=    chunk_split(base64_encode(fread($file, filesize($filename))))."\n";} "
Также неплохо заменить хедеры, например на эти:

 $headers = "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/html; charset=windows-1251\r\n";
  $headers .= "To: $to\r\n";
  $headers .= "From: Tournir Registration <admin@excessive.ru>";

Вот эту часть

$mhSmtpMail_Server     = "smtp.excessive.ru";       // Укажите адрес SMTP-сервера
$mhSmtpMail_Port       = "25";                    // Порт SMTP-сервера, как правило 25
$mhSmtpMail_Username   = "admin@excessive.ru"; // Имя почтового ящика (пользователя)
$mhSmtpMail_Password   = "cLAN1124";              // и пароль к нему.
$mhSmtpMail_From       = "Администрация excessive.ru";       // Имя отправителя в поле From

вставляй до функции.

Удачи!:D

Не в сети

#4 2011-01-15 03:59:20

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: SMTP авторизованная отправка

WESTnik, вот только далеко не все хостеры позволяют использовать функцию fsockopen() ...

Не в сети

#5 2011-01-22 13:11:24

Luca
Участник
Зарегистрирован: 2009-03-19
Сообщений: 398
Рейтинг :   

Re: SMTP авторизованная отправка

В минимуме хотя бы с гуглем скрутить. В том плане что гугль предоставляет публичные smtp сервера для отправки писем.

Не в сети

#6 2012-10-25 16:05:59

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: SMTP авторизованная отправка

Быстрое наколеночное решение. По хорошему это надо причесывать и добавлять в движок.

/engine/includes/inc/functions.inc.php

function sendEmailMessage($to, $subject, $message, $filename = false, $mail_from = false, $ctype = 'text/html', $smtp = true) {
	global $lang, $config;

	// Include new PHP mailer class
	@include_once root.'includes/classes/phpmailer/class.phpmailer.php';
	$mail	= new phpmailer;

	if($smtp){
		$__smtp = array(
			"host" => "mail.ayola.net", 			//smtp сервер
			"debug" => 0,              			//отображение информации дебаггера (0 - нет вообще)
			"auth" => true,           			//сервер требует авторизации
			"port" => 25,             			//порт (по-умолчанию - 25)
			"username" => "info@example.ru", //имя пользователя на сервере
			"password" => "*****",	   //пароль
			"addreply" => "info@example.ru",		//ваш е-mail
			"replyto" => "info@example.ru"    //e-mail ответа
		);
		
		$mail->IsSMTP();  # Sets Mailer to send message using SMTP.
		$mail->IsHTML(true);
		try {
		
			$mail->CharSet	= 'Windows-1251';
			$mail->FromName	= '[ INFO ]';
		  $mail->Host       = $__smtp['host'];
		  $mail->SMTPDebug  = $__smtp['debug'];
		  $mail->SMTPAuth   = $__smtp['auth'];
		  $mail->Port       = $__smtp['port'];
		  $mail->Username   = $__smtp['username'];
		  $mail->Password   = $__smtp['password'];
		  $mail->AddReplyTo($__smtp['addreply'], $__smtp['username']);
		  $mail->AddAddress($to);                //кому письмо
		  $mail->SetFrom($__smtp['addreply'], $__smtp['username']); //от кого (желательно указывать свой реальный e-mail на используемом SMTP сервере
		  $mail->AddReplyTo($__smtp['addreply'], $__smtp['username']);
		  $mail->Subject = htmlspecialchars($subject);
		  $mail->MsgHTML($message);
		  if (($filename !== false) && (is_file($filename))) {
				$mail->AddAttachment($filename);
			}
		  $mail->Send();
		  # echo "Message sent Ok!</p>\n";
		} catch (phpmailerException $e) {
		  echo $e->errorMessage();
		} catch (Exception $e) {
		  echo $e->getMessage();
		}
		
		return 0;
	}

	$mail->CharSet	= 'Windows-1251';
	$mail->FromName	= 'NGCMS sender';
	$mail->From		= (!$mail_from) ? "mailbot@".str_replace("www.", "", $_SERVER['SERVER_NAME']) : $mail_from;
	$mail->Subject	= $subject;
	$mail->Body		= $message;
	$mail->AddAddress($to, $to);
	if (($filename !== false) && (is_file($filename))) {
		$mail->AddAttachment($filename);
	}

	return $mail->Send();


	$mail_from	=	(!$mail_from) ? "mailbot@".str_replace("www.", "", $_SERVER['SERVER_NAME']) : $mail_from;
	$uniqid		=	md5(uniqid(time()));

	$headers	=	'From: '.$mail_from."\n";
	$headers	.=	'Reply-to: '.$mail_from."\n";
	$headers	.=	'Return-Path: '.$mail_from."\n";
	$headers	.=	'Message-ID: <'.$uniqid.'@'.$_SERVER['SERVER_NAME'].">\n";
	$headers	.=	'MIME-Version: 1.0'."\n";
	$headers	.=	'Date: '.gmdate('D, d M Y H:i:s', time())."\n";
	$headers	.=	'X-Priority: 3'."\n";
	$headers	.=	'X-MSMail-Priority: Normal'."\n";
	$headers	.=	'X-Mailer: '.engineName.' : '.engineVersion."\n";
	$headers	.=	'X-MimeOLE: '.engineName.' : '.engineVersion."\n";
	$headers	.=	'content-type: multipart/mixed;boundary="----------'.$uniqid.'"'."\n\n";
	$headers	.=	'------------'.$uniqid."\n";
	$headers	.=	'content-type: '.$ctype.';charset='.$lang['encoding'].''."\n";
	$headers	.=	'content-transfer-Encoding: 8bit';

	if (is_file($filename)){
		$file		=	fopen($filename, 'rb');
		$message	.=	"\n".'------------'.$uniqid."\n";
		$message	.=	'Content-Type: application/octet-stream;name="'.basename($filename).'"'."\n";
		$message	.=	'Content-Transfer-Encoding: base64'."\n";
		$message	.=	'Content-Disposition: attachment;';
		$message	.=	'filename="'.basename($filename).'"'."\n\n";
		$message	.=	chunk_split(base64_encode(fread($file, filesize($filename))))."\n";
	}

	@mail($to, $subject, $message, $headers);
}

Не в сети

#7 2013-05-07 10:19:35

RGyaznoff
Участник
Откуда Россия Москва
Зарегистрирован: 2013-05-07
Сообщений: 1
Рейтинг :   

Re: SMTP авторизованная отправка

Пример в котором реализована отправка писем с использованием smtp-сервера, для которого требуется авторизация.

Не в сети

#8 2013-05-30 08:28:13

OLzenizin
Участник
Откуда Россия Москва
Зарегистрирован: 2013-05-30
Сообщений: 1
Рейтинг :   

Re: SMTP авторизованная отправка

вот только далеко не все хостеры позволяют использовать функцию fsockopen() ...

Не в сети

#9 2013-06-07 13:27:26

RaSSveT
Участник
Зарегистрирован: 2013-01-10
Сообщений: 15
Рейтинг :   
Сайт

Re: SMTP авторизованная отправка

А как бы доделать эту функцию для возможности отправки почты с SSL?


Wolverine пишет:

Быстрое наколеночное решение. По хорошему это надо причесывать и добавлять в движок.

/engine/includes/inc/functions.inc.php

function sendEmailMessage($to, $subject, $message, $filename = false, $mail_from = false, $ctype = 'text/html', $smtp = true) {
	global $lang, $config;

	// Include new PHP mailer class
	@include_once root.'includes/classes/phpmailer/class.phpmailer.php';
	$mail	= new phpmailer;

	if($smtp){
		$__smtp = array(
			"host" => "mail.ayola.net", 			//smtp сервер
			"debug" => 0,              			//отображение информации дебаггера (0 - нет вообще)
			"auth" => true,           			//сервер требует авторизации
			"port" => 25,             			//порт (по-умолчанию - 25)
			"username" => "info@example.ru", //имя пользователя на сервере
			"password" => "*****",	   //пароль
			"addreply" => "info@example.ru",		//ваш е-mail
			"replyto" => "info@example.ru"    //e-mail ответа
		);
		
		$mail->IsSMTP();  # Sets Mailer to send message using SMTP.
		$mail->IsHTML(true);
		try {
		
			$mail->CharSet	= 'Windows-1251';
			$mail->FromName	= '[ INFO ]';
		  $mail->Host       = $__smtp['host'];
		  $mail->SMTPDebug  = $__smtp['debug'];
		  $mail->SMTPAuth   = $__smtp['auth'];
		  $mail->Port       = $__smtp['port'];
		  $mail->Username   = $__smtp['username'];
		  $mail->Password   = $__smtp['password'];
		  $mail->AddReplyTo($__smtp['addreply'], $__smtp['username']);
		  $mail->AddAddress($to);                //кому письмо
		  $mail->SetFrom($__smtp['addreply'], $__smtp['username']); //от кого (желательно указывать свой реальный e-mail на используемом SMTP сервере
		  $mail->AddReplyTo($__smtp['addreply'], $__smtp['username']);
		  $mail->Subject = htmlspecialchars($subject);
		  $mail->MsgHTML($message);
		  if (($filename !== false) && (is_file($filename))) {
				$mail->AddAttachment($filename);
			}
		  $mail->Send();
		  # echo "Message sent Ok!</p>\n";
		} catch (phpmailerException $e) {
		  echo $e->errorMessage();
		} catch (Exception $e) {
		  echo $e->getMessage();
		}
		
		return 0;
	}

	$mail->CharSet	= 'Windows-1251';
	$mail->FromName	= 'NGCMS sender';
	$mail->From		= (!$mail_from) ? "mailbot@".str_replace("www.", "", $_SERVER['SERVER_NAME']) : $mail_from;
	$mail->Subject	= $subject;
	$mail->Body		= $message;
	$mail->AddAddress($to, $to);
	if (($filename !== false) && (is_file($filename))) {
		$mail->AddAttachment($filename);
	}

	return $mail->Send();


	$mail_from	=	(!$mail_from) ? "mailbot@".str_replace("www.", "", $_SERVER['SERVER_NAME']) : $mail_from;
	$uniqid		=	md5(uniqid(time()));

	$headers	=	'From: '.$mail_from."\n";
	$headers	.=	'Reply-to: '.$mail_from."\n";
	$headers	.=	'Return-Path: '.$mail_from."\n";
	$headers	.=	'Message-ID: <'.$uniqid.'@'.$_SERVER['SERVER_NAME'].">\n";
	$headers	.=	'MIME-Version: 1.0'."\n";
	$headers	.=	'Date: '.gmdate('D, d M Y H:i:s', time())."\n";
	$headers	.=	'X-Priority: 3'."\n";
	$headers	.=	'X-MSMail-Priority: Normal'."\n";
	$headers	.=	'X-Mailer: '.engineName.' : '.engineVersion."\n";
	$headers	.=	'X-MimeOLE: '.engineName.' : '.engineVersion."\n";
	$headers	.=	'content-type: multipart/mixed;boundary="----------'.$uniqid.'"'."\n\n";
	$headers	.=	'------------'.$uniqid."\n";
	$headers	.=	'content-type: '.$ctype.';charset='.$lang['encoding'].''."\n";
	$headers	.=	'content-transfer-Encoding: 8bit';

	if (is_file($filename)){
		$file		=	fopen($filename, 'rb');
		$message	.=	"\n".'------------'.$uniqid."\n";
		$message	.=	'Content-Type: application/octet-stream;name="'.basename($filename).'"'."\n";
		$message	.=	'Content-Transfer-Encoding: base64'."\n";
		$message	.=	'Content-Disposition: attachment;';
		$message	.=	'filename="'.basename($filename).'"'."\n\n";
		$message	.=	chunk_split(base64_encode(fread($file, filesize($filename))))."\n";
	}

	@mail($to, $subject, $message, $headers);
}

Не в сети

#10 2013-06-08 00:29:11

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: SMTP авторизованная отправка

RaSSveT, для отправки почты используется библиотека phpmailer (лежит в engine/includes/classes/phpmainer/).
Она, вроде, поддерживает работу с SSL.

При желании можешь пропатчить функцию отправки email сообщения sendEmailMessage(), которая находится в engine/includes/inc/functions.inc.php и реализовать необходимый функционал.

Не в сети

#11 2013-06-08 14:02:58

RaSSveT
Участник
Зарегистрирован: 2013-01-10
Сообщений: 15
Рейтинг :   
Сайт

Re: SMTP авторизованная отправка

Вроде разобрался. Спасибо.

Не в сети

#12 2013-07-11 20:46:44

NZavaloff
Участник
Откуда Астраханская область, Камызякс
Зарегистрирован: 2013-07-11
Сообщений: 1
Рейтинг :   

Re: SMTP авторизованная отправка

$mail->IsSMTP();  # Sets Mailer to send message using SMTP.

Не в сети

#13 2013-07-15 20:13:16

ISaminov
Участник
Откуда Россия Москва
Зарегистрирован: 2013-07-15
Сообщений: 1
Рейтинг :   

Re: SMTP авторизованная отправка

Пример в котором реализована отправка писем с использованием smtp-сервера, для которого требуется авторизация.

Не в сети

#14 2013-08-27 08:38:01

Esevroff
Участник
Откуда Россия Москва
Зарегистрирован: 2013-08-27
Сообщений: 1
Рейтинг :   

Re: SMTP авторизованная отправка

При желании можешь пропатчить функцию отправки email сообщения sendEmailMessage(), которая находится в engine/includes/inc/functions.inc.php и реализовать необходимый функционал.

Не в сети

Подвал раздела

Работает на FluxBB