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

Alexos

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

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

зы: забыл, добавить, что мыло отсылается с помощью mb_send_mail();
 

fixxxer

К.О.
Партнер клуба
могу предположить что надо в начале вызвать mb_internal_encoding("UTF-8");
 

Alexos

Новичок
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);
?>
зы: Мало сделать, важно понять. Почему вообще за пределами папки требует дополнительных настроек?
 

fixxxer

К.О.
Партнер клуба
Видимо на сервере разные php.ini для mod_php и cli, и в них разные настройки.

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

Alexos

Новичок
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 библиотека работает, за пределами - нет! что за ерунда?
 

Beavis

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

и включи вывод ошибок
 

fixxxer

К.О.
Партнер клуба
вариант а.

в начале кода

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

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

fixxxer

К.О.
Партнер клуба
еще можно попробовать запускать в кроне

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 где то в еррор логах
 

Alexos

Новичок
О, сколько наструячили, спасибо, щас буду пробовать!

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

Alexos

Новичок
упс, странно... разрешил показ ошибок, запустил скрипт через консоль и вот что получилось:

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 !!!
 

Alexos

Новичок
Путь к php5 оказался другой (/usr/local/php5/bin/php). Офигеть мне там понаконфигуряли ))
Проблема вроде бы решена. Если чего, спрошу ещё. Всем спасибо.
 

Alexos

Новичок
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))

Если вынести транспорт за цикл, то на третьем сообщении выскакивает ошибка
что слишком много сообщений отправляется..
Я не очень то понимаю в почтовых делах. Как сделать правильно? чтобы было максимально быстро..
 

fixxxer

К.О.
Партнер клуба
Да дело не в свифте а в настройках sendmail-а (или что там вместо него)
 

Alexos

Новичок
Т.е. у меня долго работает скрипт, потому что для каждого нового письма я создаю новое соединение? Так?

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