Як надіслати 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.