Страница 1 из 1

Отправка почты скриптом через Планировщик

Добавлено: 24 фев 2014, 14:37
NEGr
Добрый день.

Сразу хочется сказать создателю OpenServer большое спасибо.
Перешел с денвера - небо и земля.

Теперь непосредственно к сути вопроса:
Имеется php скрипт, который конектится к mysql, собирает от туда статистику, формирует письма и отправляет их.
Хочется запихнуть этот скрипт в планировщик, что собственно и пытался сделать.
Но раз уж я здесь пишу -это у меня не получилось.
В логах планировщика запуска скрипта происходит успешно.

Думал вначале что не правильно создал задание. Подсунул в задание другой скрипт - который тупо создает папку. Задание выполняется - папки создаются. Следом подсунул скрипт, который отправляет тестовое письмо. Задание выполняется- но письма не отправляются.

Собственно вопрос возможно ли запускать через планировщик скрипты которые могли бы конектится к базе и(или) отправлять письма?

P.S. на данный момент это реализованно через связку Windows Sheduler + Excel VBA. Проблема в том что все письма подписываются моим email. Что не очень хорошо.

Прошу вашей помощи, форумчане.

Добавлено спустя 1 час 16 секунд:
Да на всякий случай сама задача:
%progdir%\modules\php\%phpdriver%\php-win.exe -c %progdir%\modules\php\%phpdriver%\php.ini -q -f %sitedir%\mylocalhost\BPD\notice.php

В папку с php положил файлик php.ini с абсолютными ссылками на папки с модулями расширения php. В папку sendmail также подложил файлик sendmail.ini, в котором явно указал порт и почтовый smtp сервер.

Не помогло....

Добавлено: 24 фев 2014, 15:52
kosmom
Если скрипт дергается через http - настройте планировщик через wget
Если не дергается - значит проблема в скрипте

Добавлено: 25 фев 2014, 09:31
NEGr
kosmom писал(а):Если скрипт дергается через http - настройте планировщик через wget
Если не дергается - значит проблема в скрипте
Скрипт отрабатывает нормально(по крайней мере из браузера).
На всякий случай вот сам скрипт:
<?
// Имя сервера базы данных
$dblocation = "xx.xx.xx.xxx";
$dbname = "XXX";
$dbuser="Xxxxx";
$dbpass="xxxxxxx";
// Число выводимых сообщений на странице
$pnumber = 10;
$sendmaile = false;
// Соединяемся с сервером 
$db= @mysql_connect($dblocation,$dbuser,$dbpass);
@mysql_select_db($dbname, $db);

///функция отправки письма
function send_mail($myto,$mycc,$myfrom,$mysubject,$body,$myatt)
{
  $subject = '=?windows-1251?B?'.base64_encode($mysubject).'?=';
  $boundary = "--".md5(uniqid(time())); // генерируем разделитель
  $headers = "From: ".$myfrom."\r\n";    
  $headers .= "Return-path: <".$myfrom.">\r\n";
  $headers .= "CC: ".$mycc."\r\n";  
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
  $multipart = "--".$boundary."\r\n";
  $multipart .= "Content-type: text/plain; charset=\"windows-1251\"\r\n";
  $multipart .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

  $body =  $body."\r\n\r\n";
  $myfile=$myatt;
  $myatt='=?windows-1251?B?'.base64_encode($myatt).'?=';
  $multipart .= $body;
 
  $file = '';
  if ( !empty( $myfile ) ) {
    $fp = fopen($myfile, "r");
    if ( $fp ) {
      $content = fread($fp, filesize($myfile));
      fclose($fp);
      $file .= "--".$boundary."\r\n";
      $file .= "Content-Type: application/octet-stream\r\n";
      $file .= "Content-Transfer-Encoding: base64\r\n";
      $file .= "Content-Disposition: attachment; filename=\"".$myatt."\"\r\n\r\n";
      $file .= chunk_split(base64_encode($content))."\r\n";
    }
  }
  $multipart .= $file."--".$boundary."--\r\n";

  if( mail($myto, $subject, $multipart, $headers) )
    return true;
  else
    return false;
}

$sql= "(select 'T' type,t.name name,day(t.date_end_plan)-day(t.date_start) kolvo,u.mail mail
        from tasks t 
        join users u on u.Login=t.rs
        where t.archive='No' and t.notice='1' and (day(t.date_end_plan)-day(t.date_start))<=2 )
        Union
       (SELECT 'ST' type,st.name name,day(st.date_end_plan)-day(st.date_start) kolvo,u.mail mail
        FROM sub_tasks st
        join tasks t on t.id=st.id_task
        join users u on u.Login=t.rs
        where st.notice='1' and st.procent<>100 and (day(st.date_end_plan)-day(st.date_start))<=2) order by 4,1 desc";
$res=mysql_query($sql);
$cells = array();
$kolvo=0;
while ($row = mysql_fetch_assoc($res))
{
    $cells[]=$row;
	$kolvo=$kolvo+1;
}		
$i_s=0;
///формирование текста писем из результатов запроса
for($i=0;$i<$kolvo+1;$i++)
{	
	if($cells[$i]["mail"]<>$cells[$i+1]["mail"])
	{
		$k_t=0;
		$k_st=0;
		$myTextT="";
		$myTextST="";
		$myText="";
		for($j=$i_s;$j<$i+1;$j++)
		{
			if($cells[$j]["type"]=="T")
			{
				$myTextT=$myTextT.chr(9).$cells[$j]["name"].": ".chr(9).$cells[$j]["kolvo"]." д.\n";
				$k_t=$k_t+1;
			}
			else
			{
				$myTextST=$myTextST.chr(9).$cells[$j]["name"].": ".chr(9).$cells[$j]["kolvo"]." д.\n";
				$k_st=$k_st+1;			
			}
		}
		$myText=$myText."Количество просроченных задач и задач с заканчивающимся сроком составляет ".$k_t."шт.:\n".$myTextT.
						"Количество просроченых подзадач и подзадач с заканчивающимсяся сроком составляет ".$k_st."шт.:\n".$myTextST;
		$MyTo = $cells[$i]["mail"];
		$myFrom="xxxxx@xxx.ru";
		send_mail($MyTo,"",$myFrom,"Напоминание о ваших задачах/подзадачах",$myText,"");//отправляем письмо	
		$i_s = $i + 1;
	}
}
?>
Так понимаю дело все-таки в том что во всех файлах ini (php, mysql, sendmail) в путях указаны переменные, а не абсолютные значения. Как я говорил, я пробовал подсовывать в папки с php,mysql, sendmail ini файлы с абсолютными путями - не помогло.

Вообще возможен ли запуск таких скриптов? Если да, то в какую сторону мне рыть?

Добавлено: 25 фев 2014, 10:08
kosmom
Если через http все отрабатывает - значит отработает через wget
Ройте в эту сторону

Добавлено: 25 фев 2014, 11:08
NEGr
kosmom писал(а):Если через http все отрабатывает - значит отработает через wget
Ройте в эту сторону
Понял. Буду читать и пробовать.
А по поводу ini файлов - нужно ли их кидать в директории с модулями и указывать в них абсолютные пути?

Добавлено спустя 26 минут 13 секунд:
Cпасибо, kosmom.
Все получилось.
Ступил поначалу про wget. Полез даже сначала его скачивать. Потом вспомнил что он мелькал в описании OpenServerа.

Просто забил в планировщик:
%progdir%\modules\wget\bin\wget.exe -q --no-cache http://xx.xx.xx.xxx/notice.php и все заработало, безо всяких дополнительных ini файлов.

Добавлено: 28 фев 2014, 08:01
NEGr
Тему можно закрывать