Отправка HTML-почты с использованием сценария оболочки - PullRequest
47 голосов
/ 23 июля 2010

Как я могу отправить электронное письмо в формате HTML, используя скрипт оболочки?

Ответы [ 10 ]

57 голосов
/ 23 июля 2010

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

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: me@example.com" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
you@example.com

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

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

Обновление

Сценарий оболочки - это, по сути, текстовый файл с окончаниями строк 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

45 голосов
/ 26 июля 2010

Теги включают в себя «sendmail», поэтому вот решение, использующее это:

(
echo "From: me@xyz.com "
echo "To: them@xyz.com "
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"' me@mydomain.com -s "subject" <  message.html
37 голосов
/ 07 сентября 2012

До сих пор я нашел два быстрых пути в CMD Linux

  1. Использовать старую почту

mail -s "$(echo -e "This is Subject\nContent-Type: text/html")" test@yahoo.com < mytest.html

  1. Используйте Mutt

mutt -e "my_hdr Content-Type: text/html" test@yahoo.com -s "subject" < mytest.html

2 голосов
/ 01 августа 2010

Другой вариант - использовать msmtp.

Вам нужно настроить .msmtprc примерно так (пример использует gmail):

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

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

(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <email@domain.tld>

в вашем скрипте

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

From: sender@domain.tld
To: email@domain.tld
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@domain.tld

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

2 голосов
/ 28 июля 2010

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

0 голосов
/ 03 июля 2018

Используя стандартный почтовый индекс CentOS 7 (отображается как 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, он возвращается к простому тексту.

Метод 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 fromaddress@example.com toaddress@example.com

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

Затем приходит содержимое test.txt, которое выводится.

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

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

Это работает для решения проблем семейной реликвии и практически не требует скриптов.

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

0 голосов
/ 29 июня 2018

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

scanuser @ owncloud: ~ $ vi sendMailAboutNewDocuments.sh

mail -s "You have new mail" -a "Content-type: text/html" -a "From: sender@xxx.com" $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 recipient@xxx.com test.doc
0 голосов
/ 19 апреля 2015

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

Command

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

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

From: donotreply@example.com
To: admin@example.com
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

0 голосов
/ 08 января 2015
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
0 голосов
/ 15 марта 2011

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

mail person@email.com -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@email.com -s"Tomorrow's orders as of now" -a"Content-Type: text/html; charset=\"us-ascii\""
...