Как отправить письмо в формате HTML с помощью команды linux «mail»?

66

mail -s "subject" xxxxx@gmail.com <test.html работает, но только для обычной электронной почты.

Как правильно отправлять электронную почту в формате HTML с помощью команды Linux mail?

pyth0ner
источник

Ответы:

61

Есть много разных версий mailвокруг. Когда вы выходите за рамки mail -s subject to1@address1 to2@address2 <body(для отправки, это все гарантии POSIX - и даже -sне существовали в старые времена ), они, как правило, имеют различные параметры командной строки. Добавление дополнительного заголовка не всегда легко.

  • С некоторыми mailxреализациями, например, из mailutilsUbuntu или Debianbsd-mailx , это легко, потому что есть опция для этого.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • С Семейной реликвией mailx нет удобного пути. Одна из возможностей вставить произвольные заголовки - установить editheaders=1и использовать внешний редактор (который может быть скриптом).

    ## Prepare a temporary script that will serve as an editor.
    ## This script will be passed to ed.
    temp_script=$(mktemp)
    cat <<'EOF' >>"$temp_script"
    1a
    Content-Type: text/html
    .
    $r test.html
    w
    q
    EOF
    ## Call mailx, and tell it to invoke the editor script
    EDITOR="ed -s $temp_script" heirloom-mailx -S editheaders=1 -s "Subject" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • С обычным POSIXmailx я не знаю, как добраться до заголовков.

Если вы собираетесь использовать любой mailили mailx, имейте в виду, что

  • Это не переносимо даже внутри данного дистрибутива Linux. Например, и Ubuntu, и Debian имеют несколько альтернатив для mailи mailx.
  • При составлении сообщения, mailи mailxобрабатывает строки , начинающиеся с ~как команды. Если вы перенаправляете текст mail, вам нужно сделать так, чтобы этот текст не содержал строк, начинающихся с ~.

Если вы все равно собираетесь установить программное обеспечение, вы можете установить нечто более предсказуемое, чем mail/ Mail/ mailx. Например, дурак . С Mutt вы можете предоставить большинству заголовков на входе -Hопцию, но это не такContent-Type , что необходимо установить с помощью опции Mutt.

mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html

Или вы можете вызвать sendmailнапрямую. Существует несколько версий sendmail, но все они поддерживают sendmail -tотправку почты самым простым способом, считывая список получателей из почты. (Я думаю, что они не все поддерживают Bcc:.) В большинстве систем, sendmailне в обычном $PATH, а в /usr/sbinили /usr/lib.

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html

EOF
Жиль "ТАК - перестань быть злым"
источник
Пробовал, используя пример дурака выше; подставляя реальные значения для имени файла, адреса электронной почты и т. д., но получил "Не было указано ни одного получателя" Я новичок в Mutt, @ Жиль, знаете ли вы, почему это могло произойти? (Osx Mountain Lion, Mutt 1.5.21, установленный через доморощенный)
Чак ван дер Линден
моя вторая строка была «Кому: myaddress@mycompany.com» (извините за отсутствие форматирования, невозможно в ответе, фактический текст был без кавычек), и я включил пустую строку перед вводом в EOF. будет ли конфигурация мне нужно сделать, чтобы заглушить? перед тем, как попробовать пример, который вы дали (с заменой правильных значений), все, что я сделал, это «brew install mutt»
Чак ван дер Линден
@ChuckvanderLinden Задайте новый вопрос. Скопируйте и вставьте точную команду, которую вы запустили, и полное сообщение об ошибке. Посмотрите, можете ли вы отправить электронное письмо от mutt с помощью интерактивного интерфейса.
Жиль "ТАК - перестань быть злым"
Мне удалось что-то отправить через «интерактивный» интерфейс, он изначально жаловался на отсутствие почтового каталога и предлагал его создать. напомнил, как сильно я ненавижу vim ;-) но получил его отправить. Я начну новый вопрос, так как его легче форматировать и т. Д. Точное сообщение об ошибке было именно тем, что я сказал: «Получатели не указаны».
Чак ван дер Линден
Новый вопрос unix.stackexchange.com/questions/83137/…
Чак ван дер Линден
13
#!/bin/sh

(
echo "To: me@example.com"
echo "Subject: hello"
echo "Content-Type: text/html"
echo
echo "<html><b><font size='7'>H</font>ello</b></html>"
echo
) | /usr/sbin/sendmail -t
Улучшитель кода
источник
5
Это на самом деле не использовать mail.
3
@ user16144 Нет, но это хорошая альтернатива, которую ОП мог бы рассмотреть.
trusktr
Да, он не использует почту, но он работает везде, где я пробовал, что больше, чем я могу сказать для других решений.
user1683793
Прекрасно работает и на Mac.
Асим Джалис
7

С фамильной фамилией mailx, удобный способ

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" user@server.com < /tmp/htmlmail.txt

Спасибо, Чувак
протестировал на Fedora 17, и работал

Даниил
источник
1
Чика. Мне это нравится. : -]
Аластер Ирвин
1
Учтите , что это решение может привести к электронной почте , имеющей как «Content-Type: Текст / html» и «Content-Type: текст / равнина», и потенциальные несоответствия , если вы используете этот способ указать кодировку.
Скиппи ле Гран Гуру
5

Вы должны будете добавить Content-Typeзаголовок к своей электронной почте, чтобы это произошло.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" me@example.com

будет работать

Нуфал Ибрагим
источник
2
почта: нелегальный вариант - a
pyth0ner
У тебя есть mailx? Это может иметь вариант. Если это не сработает. Если это не сработает, вы можете подумать об использовании mutt, хотя я не знаю, что это за командная строка.
Нуфал Ибрагим
1
если почта не подрезает горчицу, используйте python ... docs.python.org/library/email-examples.html примеры - третий или №6, который соответствует вашим требованиям.
sdolgy
Python потребует от вас написать (и поддерживать) скрипт. Командная строка одного лайнера имеет разные преимущества.
Нуфал Ибрагим
У меня есть mailx, но «опция -a» не работает, все равно покажи: mail: недопустимая опция - a
pyth0ner
3

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

Скрипт, который я использую ( ~/bin/sendmail-mailx-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 письмо по электронной почте:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" xxxxx@gmail.com < test.html

Этот метод более эффективен, чем предложенный @Gilles, потому что он не создает временные файлы и просто исправляет поток на лету.

loentar
источник
1

Я использовал приведенные ниже сценарии

#!/bin/ksh

(
echo "To: yourmail@domain.com"
echo "Subject: Job Status"
echo "Content-Type: text/html"
echo
echo "<html>
<head>
<title>Status of the jobs during the day</title>
<style>
table, th, td {
    border: 1px solid blue;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
}
</style>
</head>
<body>
<table style='width:100%'>
<tr bgcolor='#808080'>
    <th>Job Name</th>
    <th>System name</th>
    <th>Status</th>
  </tr>
  <tr>
    <td>Job-1</td>
    <td>Sys</td>
    <td>Sucess</td>
  </tr>
  <tr>
    <td>Job-2</td>
    <td>sys</td>
    <td>Failure</td>
  </tr>
  <tr>
    <td>Job-3</td>
    <td>sys</td>
    <td>Sucess</td>
  </tr>
 </table>
</body></html>"
echo
) | /usr/sbin/sendmail -t
Bhabatosh
источник
0

Для меня мне нужно было указать переменную, такую ​​как SMTP-сервер, поэтому команда mail работала следующим образом. Я искал во многих сообщениях, и я нашел свойство ниже, чтобы преобразовать тело в текст / HTML. Теперь письмо, которое я получаю, находится в формате HTML.

Content-Disposition: встроенный

Версия для Unix: Red Hat Enterprise Linux Server, версия 6.6 (Сантьяго)

Первый. Создайте в скрипте любую необходимую информацию (testSql.sh)

echo "<html><body><pre>"
mysql -u USERNAME -pPASSWORD -P PORTNUMBER -h HOSTNAME DBNAME --table -e "select columns from tablename where member in ('value1','value2')"
echo "</pre></body></html>"

Во-вторых. Передайте этот скрипт в почтовую команду

./testSql.sh  | mail -v -S smtp=smtp://IP:PORTNUMBER -s "$(echo -e "This is the subject\nContent-Type: text/ht ml\nMIME-Version: 1.0\nContent-Disposition: inline")" userid@email.com

Делая это, я получаю информацию, как показано ниже в электронном письме:

Content-Disposition: встроенный ID сообщения: User-Agent: Heirloom mailx 12.4 29.07.08 MIME-версия: 1.0 Content-Type: text / plain; charset = us-ascii Content-Transfer-Encoding: 7bit

Значение1 Значение2

Value1 и Value2 согласно тегам HTML, выполненным в testSql.sh

Vaibhav
источник
-5
cat htmlfile.html | mail -s "subject" xx@example.com

источник
5
Нет. Это отправит текстовое электронное письмо с HTML в теле.
Нуфал Ибрагим