Как отправить HTML письмо с помощью командной строки linux - PullRequest
56 голосов
/ 07 апреля 2010

Мне нужно отправить письмо в формате HTML. У меня есть только командная строка linux и команда "mail".

В настоящее время использовали:

echo "To: address@example.com" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" address@example.com < /var/www/report.csv

Но в моем почтовом агенте я получаю только обычный текст.

alt text

Ответы [ 11 ]

49 голосов
/ 28 апреля 2011

Это сработало для меня:

echo "<b>HTML Message goes here</b>" | mail -s "$(echo -e "This is the subject\nContent-Type: text/html")" foo@example.com
41 голосов
/ 04 сентября 2012

Моя версия почты не имеет --append и слишком умна для echo -e \n -трюка (она просто заменяет \ n пробелом). Он, однако, имеет -a:

mail -a "Content-type: text/html" -s "Built notification" address@example.com < /var/www/report.html
26 голосов
/ 13 декабря 2012

Создайте файл с именем tmp.html и вставьте в него следующую строку:

<b>my bold message</b>

Затем вставьте все это в командную строку: (с круглыми скобками и всем).

(
  echo To: youremail@blah.com
  echo From: el@defiant.com
  echo "Content-Type: text/html; "
  echo Subject: a logfile
  echo
  cat tmp.html
) | sendmail -t

Почта будет отправлена. И сообщение было выделено жирным шрифтом вместо тегов <b>.

Источник:
Как отправить html письмо с помощью команды bash "sendmail"?

8 голосов
/ 08 апреля 2010

Проблема в том, что при перенаправлении файла в «почту» он используется только для тела сообщения. Любые заголовки, которые вы вставляете в файл, вместо этого попадают в тело.

Попытка:

mail --append="Content-type: text/html" -s "Built notification" address@example.com < /var/www/report.csv

- append позволяет добавлять в почту произвольные заголовки, где вы должны указать тип содержимого и расположение содержимого. Нет необходимости встраивать заголовки To и Subject в ваш файл или указывать их с помощью --append, поскольку вы уже неявно задаете их в командной строке (-s это тема и пример address @. com автоматически становится To).

6 голосов
/ 19 августа 2014

В OS X (10.9.4) cat работает, и это проще, если ваша электронная почта уже находится в файле:

cat email_template.html  | mail -s "$(echo -e "Test\nContent-Type: text/html")" karl@marx.com
3 голосов
/ 17 сентября 2014

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

Используемый мной скрипт (~/bin/sendmail-hook):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g
}' | sendmail $@

Этот скрипт изменяет значения в заголовке письма следующим образом:

  • Content-Type: на text/html; charset=utf-8
  • Content-Transfer-Encoding: на 8bit (не уверен, действительно ли это необходимо).

Для отправки электронного письма в формате HTML:

mail -Ssendmail='~/bin/sendmail-hook' \
    -s "Built notification" address@example.com < /var/www/report.csv
2 голосов
/ 17 ноября 2017

Я нашел действительно простое решение: добавьте в почтовую команду модификатор -aContent-Type: text / html.

В вашем случае будет:

mail -aContent-Type:text/html -s "Built notification" address@example.com < /var/www/report.csv
2 голосов
/ 27 марта 2012

Очень старый вопрос, однако он занял высокое место, когда я погуглил вопрос по этому поводу.

Найдите ответ здесь:

Отправка HTML-почты с использованием сценария оболочки

2 голосов
/ 07 апреля 2010

Вы должны использовать перенаправление режима добавления >> вместо >

1 голос
/ 16 февраля 2017

Я боролся с подобной проблемой (с почтой) в одном из моих хитов post_receive git, и, наконец, я обнаружил, что sendmail на самом деле лучше работает для такого рода вещей, особенно если вы немного знаете, как создаются электронные письма (и кажется, что ты знаешь). Я знаю, что этот ответ приходит очень поздно, но, возможно, он будет полезен и другим. Я использовал оператор heredoc и функцию, которая расширяет переменные, поэтому он также может запускать встроенные сценарии. Просто проверьте это (скрипт bash):

<code>#!/bin/bash
recipients=(
    'john@example.com'
    'marry@not-so-an.example.com'
#   'naah@not.this.one'
);
sender='highly-automated-reporter@example.com';
subject='Oh, who really cares, seriously...';
sendmail -t <<-MAIL
    From: ${sender}
    `for r in "${recipients[@]}"; do echo "To: ${r}"; done;`
    Subject: ${subject}
    Content-Type: text/html; charset=UTF-8

    <html><head><meta charset="UTF-8"/></head>
    <body><p>Ladies and gents, here comes the report!</p>
    <pre>`mysql -u ***** -p***** -H -e "SELECT * FROM users LIMIT 20"`
MAIL

Обратите внимание на обратные пометки в части MAIL для генерации некоторого вывода и помните, что оператор <<- удаляет только табуляции (не пробелы) с начала строк, поэтому в этом случае копирование-вставка не будет работать (вам нужно заменить отступы с правильными вкладками). Или используйте оператор << и не делайте никаких отступов. Надеюсь, это кому-нибудь поможет. Конечно, вы можете использовать обратные пометки за пределами части MAIL и сохранить выходные данные в какую-то переменную, которую позже сможете использовать в части MAIL - независимо от вкуса и читабельности. И я знаю, #!/bin/bash не всегда работает в каждой системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...