Подтвердить что ты не робот

Отправка HTML-почты с помощью оболочки script

Как отправить HTML-сообщение с помощью оболочки script?

4b9b3361

Ответ 1

Сначала вам нужно составить сообщение. Голый минимум состоит из этих двух заголовков:

MIME-Version: 1.0
Content-Type: text/html

... и соответствующий текст сообщения:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
</head>
<body>

<p>Hello, world!</p>

</body>
</html>

После этого вы можете передать соответствующую информацию команде mail:

body = '...'

echo $body | mail \
-a "From: [email protected]" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
[email protected]

Это упрощённый пример, так как вам также необходимо позаботиться о кодировках, кодировках, максимальной длине строки... Но это в основном идея.

В качестве альтернативы вы можете написать script в Perl или PHP, а не в простой оболочке.

Update

Оболочка script представляет собой текстовый файл с окончанием строки Unix, который начинается с строки shebang, которая сообщает оболочке, что интерпретатор должен передать файл, выполнить некоторые команды на языке, который интерпретатор понимает и имеет разрешение на выполнение (в Unix - атрибут файла). Например, скажем, вы сохраняете следующее как hello-world:

#!/bin/sh

echo Hello, world!

Затем вы назначаете разрешение на выполнение:

chmod +x hello-world

И вы можете, наконец, запустить его:

./hello-world

Что бы это ни было, это не связано с первоначальным вопросом. Вы должны ознакомиться с базовыми сценариями оболочки, прежде чем выполнять с ним сложные задачи. Здесь вы найдете пару ссылок о bash, популярной оболочке:

http://www.gnu.org/software/bash/manual/html_node/index.html

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

Ответ 2

Теги включают "sendmail", поэтому здесь можно использовать следующее решение:

(
echo "From: [email protected] "
echo "To: [email protected] "
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/alternative; " 
echo ' boundary="some.unique.value.ABC123/server.xyz.com"' 
echo "Subject: Test HTML e-mail." 
echo "" 
echo "This is a MIME-encapsulated message" 
echo "" 
echo "--some.unique.value.ABC123/server.xyz.com" 
echo "Content-Type: text/html" 
echo "" 
echo "<html> 
<head>
<title>HTML E-mail</title>
</head>
<body>
<a href='http://www.google.com'>Click Here</a>
</body>
</html>"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t

Обертка для sendmail может облегчить эту работу, например mutt:

mutt -e 'set content_type="text/html"' [email protected] -s "subject" <  message.html

Ответ 3

До сих пор я нашел два быстрых способа в cmd linux

  • Использовать почту старой школы

mail -s "$(echo -e "This is Subject\nContent-Type: text/html")" [email protected] < mytest.html

  • Использовать mutt

mutt -e "my_hdr Content-Type: text/html" [email protected] -s "subject" < mytest.html

Ответ 4

Другим вариантом является sendEmail script http://caspian.dotconf.net/menu/Software/SendEmail/, он также позволяет вам установить тип сообщения как html и включить файл как тело сообщения. Подробнее см. Ссылку.

Ответ 5

Другая опция - msmtp.

Вам нужно настроить свой .msmtprc с чем-то вроде этого (например, используется gmail):

account default
host smtp.gmail.com
port 587
from [email protected]
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user [email protected]
password <password>
logfile ~/.msmtp.log

Затем просто позвоните:

(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <[email protected]>

в script

Обновление. Для почты HTML вы также должны помещать заголовки, поэтому вы можете сделать такой файл:

From: [email protected]
To: [email protected]
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body <b>should</b> start after one blank line from the header.

И напишите ему как

cat email-template | msmtp [email protected]

То же самое можно сделать и с помощью командной строки, но может быть проще использовать файл.

Ответ 7

cat > mail.txt <<EOL
To: <email>
Subject: <subject>
Content-Type: text/html

<html>
$(cat <report-table-*.html>)
This report in <a href="<url>">SVN</a>
</html>

EOL

А потом:

sendmail -t < mail.txt

Ответ 8

Mime header и from, to address также может быть включен в html файл сам.

Команда

cat cpu_alert.html | /usr/lib/sendmail -t

cpu_alert.html образец файла.

From: [email protected]
To: [email protected]
Subject: CPU utilization heigh
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body should start after one blank line from the header.

Пример кода доступен здесь: http://sugunan.net/git/slides/shell/cpu.php

Ответ 9

Вот мой (данная "почта" настроена правильно):

scanuser @owncloud: ~ $ vi sendMailAboutNewDocuments.sh

mail -s "You have new mail" -a "Content-type: text/html" -a "From: [email protected]" $1 << EOF
<html>
<body>
Neues Dokument: $2<br>
<a href="https://xxx/index.php/apps/files/?dir=/Post">Hier anschauen</a>
</body>
</html>

EOF

сделать исполняемый файл:

chmod +x sendMailAboutNewDocuments.sh

затем позвоните:

./sendMailAboutNewDocuments.sh [email protected] test.doc

Ответ 10

Используя CentOS 7 по умолчанию mailx (отображается как heirloom-mailx), я упростил это до простого использования текстового файла с требуемыми заголовками и статической границей для многочастной/смешанной и многочастной/альтернативной установки.

Я уверен, что вы можете выяснить, multipart/related, если вы хотите с той же настройкой.

test.txt:

--000000000000f3b2150570186a0e
Content-Type: multipart/alternative; boundary="000000000000f3b2130570186a0c"

--000000000000f3b2130570186a0c
Content-Type: text/plain; charset="UTF-8"

This is my plain text stuff here, in case the email client does not support HTML or is blocking it purposely

My Link Here <http://www.example.com>

--000000000000f3b2130570186a0c
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">
<div>This is my HTML version of the email</div>
<div><br></div>
<div><a href="http://www.example.com">My Link Here</a><br></div>
</div>

--000000000000f3b2130570186a0c--
--000000000000f3b2150570186a0e
Content-Type: text/csv; charset="US-ASCII"; name="test.csv"
Content-Disposition: attachment; filename="test.csv"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_jj5qmzqz0

Границы определяют составные сегменты.

Идентификатор границы, который не имеет тире в конце, является начальной точкой сегмента.

Тот, с двумя чертами в конце, является конечной точкой.

В этом примере есть часть в главном разделе multipart/mixed для multipart/alternative.

Многоэлементный/альтернативный метод в основном говорит: "Откат к этому, ЕСЛИ приоритетная часть не выполняется" - в этом примере HTML-клиенты обычно воспринимают приоритет как HTML. Если почтовый клиент не отображает HTML, он возвращается к простому тексту.

Метод multipart/mixed, который инкапсулирует все это сообщение, в основном говорит, что здесь разный контент, отображающий оба.

В этом примере я разместил вложение в виде файла CSV на электронную почту. Вы увидите, что вложение подключается с помощью base64 в приведенной ниже команде.

Я добавил в качестве примера вложение, вам нужно будет настроить тип контента в соответствии с вложением и указать, будет ли он встроенным или нет.

X-Attachment-Id необходим для некоторых провайдеров, случайным образом идентифицируйте установленный вами идентификатор.

Команда для отправки по почте это:

echo -e "'cat test.txt; openssl base64 -e < test.csv'\n--000000000000f3b2150570186a0e--\n" | mailx -s "Test 2 $( echo -e "\nContent-Type: multipart/mixed; boundary=\"000000000000f3b2150570186a0e\"" )" -r [email protected] [email protected]

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

Затем идет сбрасывание содержимого test.txt.

Что касается вложения, я использую openssl (который является довольно стандартным в системах) для преобразования файлового вложения в base64.

Кроме того, я добавил оператор закрытия границ в конце этого эха, чтобы обозначить конец сообщения.

Это работает вокруг проблем семейной реликвии и практически без сценариев.

Вместо этого эхо может быть фидом или любым другим количеством методов.

Ответ 11

Используйте CLI для массовой рассылки, эффективный и мощный инструмент для отправки динамических электронных писем в список рассылки с помощью одной простой команды: bulkmail mail !

Do quick, mini, hassle-free email marketing with this small but Powerful tool 💌

Ответ 12

В дополнение к правильному ответу от mdma, вы также можете использовать команду mail следующим образом:

mail [email protected] -s"Subject Here" -a"Content-Type: text/html; charset=\"us-ascii\""

Вы получите то, что ищете. Не забудьте указать <HTML> и </HTML> в письме. Вот быстрый скрипт, который я использую для отправки ежедневного отчета в формате HTML:

#!/bin/sh
(cat /path/to/tomorrow.txt mysql -h mysqlserver -u user -pPassword Database -H -e "select statement;" echo "</HTML>") | mail [email protected] -s"Tomorrow orders as of now" -a"Content-Type: text/html; charset=\"us-ascii\""