Проблемы с кодировкой у скрипта в utf-8, выполняемым по крону.

  • Автор темы Автор темы Alexos
  • Дата начала Дата начала

Alexos

Новичок
Всем привет, сто лет не занимался программированием, нужда снова заставила.

Короче, в качестве примера...
Есть простенький скрипт (в utf-8), отправляющий мне сообщение на мыло.
Если разместить его в корне сайта и запустить через браузер, то всё ок, письмо приходит в нужной кодировке.
Но стоит поставить его на cron, разместив за пределами сайта, как на мыло приходят кракозябрины!
В заголовке также посылаю чарсет утф-8, но нифига.
В чём тут дело?
Спасибо.

зы: забыл, добавить, что мыло отсылается с помощью mb_send_mail();
 
могу предположить что надо в начале вызвать mb_internal_encoding("UTF-8");
 
Wow! У модуля есть свои функции настройки. Спасибо.

Теперь другая проблема. Письмо приходит в плэйн текст, хотя в параметрах заголовков функции mb_send_mail() я указываю Content-type: text/html;

PHP:
<?php
mb_internal_encoding("UTF-8");

$mail="Здравствуйте.<br>Май нейм из Вова.";
$to="[email protected]";
$subject="Тема";
$headers="From: [email protected]\nContent-type: text/html; charset=utf-8\n";

mb_send_mail($to, $subject, $mail, $headers);
?>

зы: Мало сделать, важно понять. Почему вообще за пределами папки требует дополнительных настроек?
 
Видимо на сервере разные php.ini для mod_php и cli, и в них разные настройки.

Насчет content-type - а какие заголовки приходят? А вообще хорошим тоном считается слать основной текст plain а html аттачем. Но это ручками много букв, я давно для отправки почты пользуюсь Swift Mailer
 
fixxxer, пытался заюзать библиотеку Swift Mailer,
не отправляет она у меня по крону письма за пределами корневой папки сайта (((
почему не понимаю!
и ошибки посмотреть не могу, т.к. в логи не пишутся, если скрипт выполняется за пределами public_html

PHP:
// путь специально указываю явным образом, чтобы застраховаться от ошибок
require_once '/usr/home/username/www/sitename/public_html/Swift-4.1.5/lib/swift_required.php';

$transport = Swift_MailTransport::newInstance();

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance()

  ->setSubject('Тестим Свифт мэйлер')
  ->setFrom(array('[email protected]' => 'Мой сайт'))
  ->setTo(array('[email protected]'))
  ->addPart('<q>Here <b>is</b> the message itself!!!</q>', 'text/html')
  ;

$result = $mailer->send($message);

в пределах public_html библиотека работает, за пределами - нет! что за ерунда?
 
ты для начала не через крон вызывай скрипт, а просто через консоль вручную
php -f /path/to/script.php

и включи вывод ошибок
 
вариант а.

в начале кода

ini_set('display_errors',1);
error_reporting(E_ALL);

зайди по ssh на сервер, и запусти в консоли php script_name.php где script_name это твой скрипт который скопипастил выше

вариант б (шелла нет, есть крон).

по хорошему менять хостинг, но если уж так вышло.

ini_set('log_errors', 1);
ini_set('error_log', '/path/to/log/file.txt') где /path/to/log/file.txt это путь по которому ты сможешь (по фтп например) забрать лог, возможно на /path/to/log придется поставить права 0777

пускаешь кроном раз в минуту, смотришь
 
еще можно попробовать запускать в кроне

php -c /path/to/php.ini -f script_name

где /path/to/php.ini путь к вебовому ини файлу, который можно увидеть в phpinfo()

тогда в принципе будет работать в том же контексте

но тут не факт, что сработает, мало ли что там понаконфигуряли

в пределах public_html библиотека работает, за пределами - нет
а, то есть если положить вне public_html?

тут скорее всего дело в open_basedir, ты должен видеть сообщение вида Warning: f open_basedir restriction in effect где то в еррор логах
 
О, сколько наструячили, спасибо, щас буду пробовать!

а, то есть если положить вне public_html? тут скорее всего дело в open_basedir

fixxxer, не работает только эта библиотека! просто функция mail или mb_send_mail (для utf-8) работают прекрасно!
вторая только плэйн текстом отправляет, несмотря на то, что в заголовках указываешь html.
сайт в утфе, поэтому функция mail не катит!
 
упс, странно... разрешил показ ошибок, запустил скрипт через консоль и вот что получилось:

PHP:
$ php cron2.php
PHP Parse error:  syntax error, unexpected T_OBJECT_OPERATOR in /usr/home/supertu/www/site7/cron/cron2.php on line 19

а это строка:
PHP:
->setSubject('Тестим Свифт мэйлер')

не понимает такой синтаксис. у меня складывается впечатление, что за пределами папки public_html работает старый интерпретатор php 4 !!!
как узнать версию пхп как cgi, чтобы подтвердить моё предположение? создать файл с phpinfo() и запустить через консоль за пределами папки?
переделывать скрипт под синтаксис пхп4 тоже смысла нет, т.к. сама либа написана на пхп5 !!!
 
Путь к php5 оказался другой (/usr/local/php5/bin/php). Офигеть мне там понаконфигуряли ))
Проблема вроде бы решена. Если чего, спрошу ещё. Всем спасибо.
 
fixxxer, вопрос по Swift Mailer.
ты не мог бы помочь соптимизировать рассылку оповещений через этот Свифт мэйлер?
100 сообщений с крохотными изображениями (5-10Кб) отправляется 22 секунды! Не многовато ли?

PHP:
foreach(......) {
     $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');
     $mailer = Swift_Mailer::newInstance($transport);
     $message = Swift_Message::newInstance()
         ->setSubject
         и так далее
}

В тело письма изображения включаю через $message->embed(Swift_Image::fromPath($img_dir.$file))

Если вынести транспорт за цикл, то на третьем сообщении выскакивает ошибка
что слишком много сообщений отправляется..
Я не очень то понимаю в почтовых делах. Как сделать правильно? чтобы было максимально быстро..
 
Да дело не в свифте а в настройках sendmail-а (или что там вместо него)
 
Т.е. у меня долго работает скрипт, потому что для каждого нового письма я создаю новое соединение? Так?

Открыл /etc/mail/mailer.conf и увидел: sendmail /usr/local/sbin/exim
Таким образом, я понял, что у меня Exim
Что делать дальше? Как настроить этот егзим на отправку большого количества сообщений?
 
Сверху