Як надіслати HTML-адресу електронної пошти за допомогою команди "пошта" Linux?


66

mail -s "subject" xxxxx@gmail.com <test.html працює, але лише для простого текстового повідомлення.

Який правильний спосіб надсилання HTML-пошти за допомогою команди Linux mail?

Відповіді:


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
    
  • З Heirloom 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 встановлений через домашню)
Chuck van der Linden

мій другий рядок був "Кому: myaddress@mycompany.com" (вибачте за відсутність форматування, неможливо у відповіді. Фактичний текст був цитатами), і я включив порожній рядок перед введенням у EOF. Чи буде конфігурація, яку мені потрібно зробити, щоб вимкнути? до того, як спробувати приклад, який ви дали (із заміненими належними значеннями), все, що я робив, - це «варити встановити мут»
Чак ван дер Лінден

@ChuckvanderLinden Задайте нове запитання. Скопіюйте та вставте точну команду, яку ви виконали, та повне повідомлення про помилку. Подивіться, чи можете ви надіслати електронний лист від mutt за допомогою інтерактивного інтерфейсу.
Жиль

Мені вдалося щось надіслати через «інтерактивний» інтерфейс, він спочатку скаржився на відсутність поштового каталогу та запропонував його створити. нагадав, як сильно ненавиджу vim ;-), але отримав його для надсилання. Почну нове запитання, оскільки його простіше форматувати і т. Д. Точне повідомлення про помилку було саме тим, що я сказав: "Не було вказано одержувачів".
Чак ван дер Лінден


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

Так, він не використовує пошту, але працює скрізь, я спробував це, що більше, ніж я можу сказати, для інших рішень.
користувач1683793

Прекрасно працює і на Mac.
Асим Джаліс

7

З поштою Heirloom зручним способом є

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: текст / рівнина», і потенційні невідповідності , якщо ви використовуєте цей спосіб вказати кодування.
Skippy le Grand Gourou

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, оскільки він не створює тимчасових файлів і просто фіксує потік на ходу.


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

0

Для мене мені потрібно було вказати таку змінну, як SMTP-сервер, тому команда пошти працювала нижче. Я шукав багато публікацій, і я знайшов нижче властивість перетворювати тіло в текст / html. Тепер я отримав електронний лист у форматі HTML.

Зміст-диспозиція: вбудований

Версія Unix: Red Hat Enterprise Linux Server Edition 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

Роблячи це, я отримую інформацію, як показано нижче в електронній пошті:

Контент-розпорядження: вбудований Ідентифікатор повідомлення: Користувач-агент: Heirloom mailx 12.4 7/29/08 MIME-Версія: 1.0 Тип вмісту: текст / звичайна; charset = us-ascii Content-Transfer-Encoding: 7bit

Значення1 Значення2

Value1 та Value2 відповідно до тегів HTML, зроблених у testSql.sh


-5
cat htmlfile.html | mail -s "subject" xx@example.com

5
Ні. Це надішле текстовий електронний лист із HTML у тілі.
Нуфал Ібрагім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.