Linux mail <file.log имеет Content-Type: application/octet-stream (приложение без имени в Gmail)

Я использовал

 mail -s "here is a log file" "[email protected]" < log/logfile.log

Что раньше приходилось с заголовками:

User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Но теперь файлы длиннее. Я получаю вложения без имени, потому что с этим:

User-Agent: Heirloom mailx 12.4 7/29/08
MIME-Version: 1.0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

Итак, если все остальное не работает, проверьте руководство man mail...

NAME
       mailx - send and receive Internet mail

SYNOPSIS
       mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops]
              [-A account] [-S variable[=value]] to-addr . . .

Ни один из этих параметров не кажется полезным, так как я могу заставить Content-Type: text/plain?

Ответы

Ответ 1

Персональная страница - это хорошее место для начала! Продолжайте читать, пока не дойдете до раздела MIME TYPES и обратите пристальное внимание на следующее:

В противном случае, или если имя файла не имеет расширения, типы содержимого text/plain или application/octet-stream        используемый для текстовых или международных текстовых файлов, второй для любого файла, который содержит форматирование char -        актеры, отличные от новых строк и горизонтальных табуляторов.

Итак, если ваше сообщение содержит "символы форматирования" (которые в общем случае означают управляющие символы), отличные от новых строк и вкладок, оно будет автоматически классифицироваться как application/octet-stream. Бьюсь об заклад, что если вы внимательно посмотрите на данные, вы найдете некоторые управляющие символы, плавающие вокруг.

Вы можете обойти это с помощью...

  • Включая файл журнала как вложение (используя -a) вместо основного тела сообщения и настройте файл ~/.mime.types для идентификации файлов *.log в виде текста /plain.
  • Отфильтруйте управляющие символы, используя что-то вроде tr.
  • Для отправки почты используйте другой MUA, например mutt. На самом деле вы можете просто написать сообщение самостоятельно и отправить его прямо на sendmail:

    (
      echo To: [email protected]
      echo From: [email protected]
      echo Subject: a logfile
      echo
      cat logfile.log
    ) | sendmail -t
    

Ответ 2

Недавно я получил аналогичную проблему и, наконец, получил более короткое решение:

cat -v log/logfile.log | mail -s "here is a log file" "[email protected]"

Подробнее о обсуждении cat с mailx.

Ответ 3

У меня возникли проблемы с тем, чтобы запустить автоматические сценарии электронной почты после перехода на Ubuntu Precise 12.04. Я не знаю, когда Ubuntu (или Debian) обменял bsd-mailx на heirloom-mailx, но две команды "mail" ведут себя по-разному. (Например, heirloom использует -a для вложений, в то время как он используется для дополнительных заголовков в bsd.) В моем случае heirloom-mailx не смог надежно определить тип Mime и продолжал отправлять текст в виде вложений. Обвиняйте меня за то, что вы не лишаете контрольных символов или что-то еще, но я не вижу большого смысла в изменении сценариев, которые отлично справились с задачей до обновления. Поэтому, если вы предпочитаете самостоятельно настраивать Mimetype, bsd-mailx - лучшее решение.

sudo apt-get install bsd-mailx 
sudo apt-get remove heirloom-mailx

Решил это для меня.

Ответ 4

В системах на базе RedHat (SL, CentOS, Fedora и т.д.) вы захотите установить bsd-mailx, а затем соответствующим образом установите /etc/alternatives/mail:

sudo yum -y install bsd-mailx
sudo alternatives --set mail /usr/bin/bsd-mailx

Конечно, вы рискуете сломать приложения, которые полагаются на поведение heirloom-mailx, но явно не называют "mailx" вместо "mail".

Для отображения информации о /bin/mail в настоящее время указывает на:

sudo alternatives --display mail

Чтобы проверить наличие установленных пакетов mailx:

sudo rpm -qa *mailx

Ответ 5

В моем случае script был вызван из cron, где LC_ * не был определен, а акценты интерпретировались как "контрольные символы". Я только что вставил следующие строки в начале моего файла crontab:

LC_NAME=fr_FR.UTF-8
LC_ALL=fr_FR.UTF-8