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

Действительно ли безопасно повысить то значение и каковы были бы последствия слишком высокого значения?

Да, безопасно повысить то значение, и ниже возможные затраты [источник]:

  • Каждый использовал часы inotify, поднимает 540 байтов (32-разрядная система), или 1 КБ (дважды - на 64-разрядном) [источники: 1, 2]
  • Это выходит из памяти ядра, которая невыгружаема.
  • Принятие Вас установило макс. в 524 288, и все использовались (невероятные), Вы будете использовать приблизительно 256MB/512MB 32-bit/64-bit памяти ядра.
    • Обратите внимание, что Ваше приложение будет также использовать дополнительную память для отслеживания дескрипторы inotify, файл/пути к каталогам, и т.д. - сколько зависит от его дизайна.

Проверять макс. количество часов inotify:

cat /proc/sys/fs/inotify/max_user_watches

Определять макс. номер часов inotify

Временно:

  • Выполненный sudo sysctl fs.inotify.max_user_watches= с Вашим предпочтительным значением в конце.

Постоянно (более подробная информация):

  • поместить fs.inotify.max_user_watches=524288 в Ваши sysctl настройки. В зависимости от Вашей системы они могли бы быть в одном из следующих мест:
    • Debian/RedHat: /etc/sysctl.conf
    • Дуга: поместите новый файл в /etc/sysctl.d/, например. /etc/sysctl.d/40-max-user-watches.conf
  • можно хотеть перезагрузить sysctl настройки для предотвращения перезагрузки: sysctl -p (Debian/RedHat) или sysctl --system (Дуга)

Проверьте, чтобы видеть, было ли макс. количество часов inotify достигнуто:

Использовать tail с -f (следуйте) за опцией на любом старом файле, например. tail -f /var/log/dmesg: - Если все хорошо, это покажет последние 10 строк и паузу; аварийное прекращение работы с Ctrl-C - Если Вы вне часов, это перестанет работать с этой несколько загадочной ошибкой:

tail: cannot watch '/var/log/dmsg': No space left on device

Видеть, что израсходовало часы inotify

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

Первый столбец указывает на количество inotify fds (не количество часов хотя) и вторые шоу PID того процесса [источники: 1, 2].

67
12.11.2011, 21:49
9 ответов

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

  • С некоторыми mailx реализации, например, от mailutils на Ubuntu или Debian bsd-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"
    
  • С общим POSIX mailx, Я не знаю, как достигнуть заголовки.

Если Вы собираетесь использовать кого-либо mail или mailx, имейте в виду это

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

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

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
62
27.01.2020, 19:31
  • 1
    Испытанное использование примера дурака выше; заменение действительными значениями для имени файла, на адрес электронной почты, и т.д. но не получило "Получателей, были указаны", я очень плохо знаком с дураком, @Gilles Вы знают, почему это, возможно, произошло? (osx пума, дурак 1.5.21 установленных через домашнее пиво) –  Chuck van der Linden 15.07.2013, 19:58
  • 2
    моя вторая строка был "К: myaddress@mycompany.com" (извините из-за отсутствия форматирования, не возможного в ответе, фактический текст был без кавычек), и я включал пустую строку перед включением EOF., там будет конфигурация, которую я должен реализовать дураку? до попытки примера Вы дали (с собственными значениями, которыми заменяют) все, что я сделал был 'назреть, –  Chuck van der Linden 15.07.2013, 22:10
  • 3
    @ChuckvanderLinden' дурака установки Задают новый вопрос. Вставка копии точная команда Вы работали и полное сообщение об ошибке. Посмотрите, можно ли послать электронное письмо от дурака, использующего интерактивный интерфейс. –  Gilles 'SO- stop being evil' 15.07.2013, 22:15
  • 4
    , который я смог отправить чему-то через 'интерактивный' интерфейс, это первоначально, жаловался на почтовое отсутствие каталога и предложил создавать его. напомненный, насколько я ненавижу энергию ;-) но заставил ее отправлять. Я запущу новый вопрос, поскольку это легче к формату и т.д. Точное сообщение об ошибке было, что я сказал, что "Никакие получатели не были указаны". –  Chuck van der Linden 15.07.2013, 22:45
  • 5

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

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

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

5
27.01.2020, 19:31
  • 1
    : недопустимая опция –  pyth0ner 22.06.2011, 09:56
  • 2
    Сделайте Вы имеете mailx? Это могло бы иметь опцию. Если это не работает. Если это не работает, можно рассмотреть использование дурака, хотя я не знаю от руки, что переключатели командной строки сделать это. –  Noufal Ibrahim 22.06.2011, 10:04
  • 3
    , если почта не сокращает горчицу, использует Python... примерами docs.python.org/library/email-examples.html является 3-й или № 6, который удовлетворяет Вашему требованию. –  sdolgy 22.06.2011, 11:40
  • 4
    Python потребует, чтобы Вы записали (и поддержали) сценарий. Командная строка один лайнер имеет различные преимущества. –  Noufal Ibrahim 22.06.2011, 14:04
  • 5
    у меня есть mailx, но "опция-a", не работает, все еще show:mail: недопустимая опция –  pyth0ner 27.06.2011, 04:17
cat htmlfile.html | mail -s "subject" xx@example.com
-5
27.01.2020, 19:31
  • 1
    Нет. Это пошлет текстовое электронное письмо с HTML в теле. –  Noufal Ibrahim 22.06.2011, 09:35
#!/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
14
27.01.2020, 19:31
  • 1
    Это acually не использует mail. –   17.10.2012, 22:09
  • 2
    @user16144 нет, но это - хорошая альтернатива, которую OP хотел бы рассматривать. –  trusktr 12.02.2014, 05:24

С почтой Heirloom mailx, удобным способом является

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

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

.
7
27.01.2020, 19:31

С помощью 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, поскольку он не создает временные файлы, а просто исправляет поток на лету.

3
27.01.2020, 19:31

Мне нужно было указать переменную, такую ​​как SMTP-сервер, поэтому почтовая команда работала следующим образом. Я просмотрел много сообщений и нашел ниже свойство для преобразования тела в text / 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>"

Второй. Передайте этот скрипт команде mail

./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: inline Message-ID: User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 

Value1 Value2

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

0
27.01.2020, 19:31

Я использовал следующие сценарии,

#!/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
2
20.08.2021, 13:35

Опубликовано в другой теме, но в основном в нашей версии mail/mailx (12.5+ )параметр -a для почты больше не работает, так как он добавляет вложение, и я не смог найти замену для дополнительных заголовков, поэтому самым простым способом для меня было использовать sendmail.

Ниже приведен простой 1 лайнер, который я создал для запуска в нашем сценарии bash, который работает для нас. Он просто передает Content -Type :text/html, subject и body и работает.

printf "Content-Type: text/html\nSubject: Test Email\nHTML BODY<b>test bold</b>" | sendmail <Email Address To>

Если вы хотите создать целую html-страницу из переменной, альтернативный метод, который я использовал в сценарии bash, заключался в передаче переменной, как показано ниже.

emailBody="From: <Email Address From>
Subject: Test
Content-Type: text/html; charset=\"us-ascii\"
<html>
<body>
body
<b> test bold</b>

</body>
</html>
"
echo "$emailBody" | sendmail <Email Address To>
0
20.08.2021, 13:35

Теги

Похожие вопросы