Назад | Перейти на главную страницу

cron отправляет электронные письма с неправильной кодировкой

У меня есть следующая команда в cronjob:

*/5 * * * * php /var/www/domain/yii rss/parse

Он выводит электронную почту в неправильной кодировке:

Content-Type: text/plain; charset=ANSI_X3.4-1968

Но когда я запускаю эту команду прямо в CLI и выводю ее в журнал:

php /var/www/domain/yii rss/parse > log

У меня правильная кодировка - UTF-8

Уже пробовали установить lang в / etc / environment:

LANG=en_US.UTF-8

Перезапустил cron, но по-прежнему использует ANSI через CRON. Любые идеи?

Решил мою проблему, добавив в crontab:

crontab -e

Вверху файла я написал:

CONTENT_TYPE="text/plain; charset=utf-8"

Теперь все мои письма о работе cron находятся в кодировке UTF-8.

Что касается этой проблемы, я обнаружил в Debian Jessie в / etc / default / cron следующее:

# Whether to read the system's default environment files (if present)
# If set to "yes", cron will set a proper mail charset from the
# locale information. If set to something other than 'yes', the default
# charset 'C' (canonical name: ANSI_X3.4-1968) will be used.
#
# This has no effect on tasks running under cron; their environment can
# only be changed via PAM or from within the crontab; see crontab(5).
READ_ENV="yes"

Другими словами, по умолчанию в этом дистрибутиве он читает файлы среды. После перезапуска dpkg-reconfigure locales (в моем случае по умолчанию уже было установлено значение UTF8). Я просмотрел / etc / environment и обнаружил, что он пуст. Как только я вставил LC_ALL=en_US.UTF-8 там электронные письма с заданием cron были с правильным заголовком набора символов.

Мне пришлось решить эту проблему глобально для всех пользователей, а не для конкретного. Я попытался настроить / etc / environment и / etc / default / locale, а затем перезапустить cron. Это не помогло. Правильный ответ для меня - использовать команду env в сценарии выскочки (я запускаю сервер ubuntu):

env LC_ALL = en_US.UTF-8

cat /etc/init/cron.conf 
# cron - regular background program processing daemon
#
# cron is a standard UNIX program that runs user-specified programs at
# periodic scheduled times

description     "regular background program processing daemon"

start on runlevel [2345]
stop on runlevel [!2345]

expect fork
respawn
env LC_ALL=en_US.UTF-8

exec cron

Затем я перезапустил cron и получил правильную почту в utf-8.

Когда вы даете команду через CLI, я думаю, вы получаете набор сообщений utf-8, потому что вы используете ПК с ОС MAC или ПК с Linux.

Я сказал это, потому что текущий LANG вашего ПК начинает копироваться в вашем сеансе ssh

grep -i LANG /etc/ssh/sshd_config 
AcceptEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES

от человека sshd_config

AcceptEnv
             Specifies what environment variables sent by the client will be copied into the session’s environ(7).  See SendEnv in ssh_config(5) for how to
             configure the client.  Note that environment passing is only supported for protocol 2.  Variables are specified by name, which may contain the
             wildcard characters ‘*’ and ‘?’.  Multiple environment variables may be separated by whitespace or spread across multiple AcceptEnv directives.
             Be warned that some environment variables could be used to bypass restricted user environments.  For this reason, care should be taken in the
             use of this directive.  The default is not to accept any environment variables.

Ваш процесс crond использует charset = ANSI_X3.4-1968, возможно, это системный LANG по умолчанию, но если вы хотите изменить это

 man 5 crontab