Как отправить html письмо с помощью команды bash «sendmail»?

КРИТЕРИИ ОЦЕНИВАНИЯ ПИСЬМА

  1. Решение коммуникативной задачи (2 балла);
  2. Организация текста (2 балла);
  3. Языковое оформление текста (2 балла).

Максимальное количество баллов за задание – 6.

Давайте рассмотрим такой образец личного письма:

Hi Ronny, 
Thank you for the e-mail! I am glad to hear from you. I'm sorry I couldn't answer earlier because I was busy with my exams.
In your message you asked me about summer. You know, the weather here is varied in this season. It can be rather hot in the south of the country and cool in the north. As for me, I prefer summer, this is the season when we have vacations. This summer I am planning to go the summer camp, then my parents are going to take me to the country.
By the way, I'd like to know more about your uncle. Where does your uncle live? Has he got a family? How long is he going to stay with you? I've got to go now, as I've got lots of homework to do. 
Keep in touch!
Yours, 
Alice

В данном письме 145 слов (в рамки уложились).

В обращении должно быть имя, после имени не забываем ставить запятую!

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

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

I’m sorry I couldn’t answer earlier because I was busy with my exams.

Переходим к ответам на вопросы при помощи такого соединительного предложения:

In your message you asked me about summer.

Отвечаем на каждый вопрос одним сложным или двумя простыми предложениями. Одно простое предложение в качестве ответа на вопрос считается как неполный ответ.

You know, the weather here is varied in this season. It can be rather hot in the south of the country and cool in the north. As for me, I prefer summer, this is the season when we have vacations. This summer I am planning to go the summer camp, then my parents are going to take me to the country.

Далее мы задаем три вопроса другу по конкретной теме. В данном случае, например, необходимо задать вопросы про дядю:

By the way, I’d like to know more about your uncle. Where does your uncle live? Has he got a family? How long is he going to stay with you?

Завершаем письмо, указывая причину:

I’ve got to go now, as I’ve got lots of homework to do.

Указываем ссылку на будущие контакты:

Keep in touch!

Пишем завершающую фразу и Ваше имя на отдельной строке, точки в конце не ставим:

Yours,

Alice

Для осуществления логической связи между предложениями Вам необходимо использовать в тексте письма вводные слова и выражения, а также личные местоимения.

В данном примере были использованы:

As for me, – что касается меня

You know, – ты знаешь

By the way, – кстати

В письме достаточно 3-4 таких выражений, не перегружайте ими письмо, а также помните о стиле, такие выражения, как “moreover”, “nevertheless” и прочие, характерные для публицистического/официального стиля, нам не подойдут.

Для тех, кто хочет максимально эффективно подготовиться к ЕГЭ по английскому языку актуальные материалы на 2022 год:

НОВЫЙ ФОРМАТ 2022!

Удачи на экзамене!

Как исправить ошибку Recipient Address Rejected?

Каждая из перечисленных причин имеет свой способ решения. Исправив первопричину, удастся избавиться и от ошибки.

1) Указать правильного получателя

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

Совет! Ошибка особенно часто появляется при попытке создать массовую рассылку. Среди всех пользователей есть те, которые уже переехали или удалили свой почтовый ящик. Один из вариантов исправления – создать почтовый ящик CatchAll для массовых рассылок.

Если удалось установить, что почтовый ящик существует, но продолжает появляться ошибка «Адрес получателя отклонен», следует попробовать другие способы.

2) Извлечь из спама

Часто причиной ошибки становится активная система фильтрации спама, установленная на домене получателя. Из-за каких-то прошлых действий на почте вас могли внести в список спама, поэтому и возвращается ошибка.

Всего есть 3 основные причины:

  • Владелец спам-фильтра уже помечал подобные сообщения в качестве спама. Все письма от этого отправителя автоматически будут получать такую пометку.
  • Электронная почта помещена в черный список. Политика домена может привести к тому, что каждое письма с такой почты будет помечаться как спам.
  • Сообщение получено, но разделено системой и не было доставлено правильному почтовому ящику.

Единственное решение во всех случаях – попросить добавить вашу почту в белый список. Для этого нужно связаться с человеком другим способом, возможно, просто с другой почты.

3) Очистить временные данные

Есть большая вероятность, что проблемы с отправкой наблюдаются только при подключении к конкретной сети. В таком случае у вас есть все причины полагать, что причиной стал DNS. Сообщение «Адрес получателя отклонен. Ошибка в доступе» будет следствием проблем протокола или передачи данных. Если откинуть сбой сетевого адаптера (нужно проверить подключение к интернету), то проблема в DNS. Чаще всего все дело во временных данных.

Как выполнить сброс кэша DNS, TCP/IP:

  1. Нажать сочетание клавиш Win + R и в диалоговое окно (должно сразу появиться) нужно ввести cmd.
  2. Щелкнуть по сочетанию клавиш Ctrl + Shift + Enter – это приведет к запуску консоли с правами администратора.
  3. Если появится запрос на подтверждение доступа от UAC, в нем нужно нажать на кнопку «Разрешить».
  4. Ввести команды, после каждой нажимая Enter:

Остается только закрыть командную строку и попробовать отправить письмо снова.

4) Настроить папки Exchange

Применимо только для тех, кто пытается отправить письмо после настройки Exclaimer Cloud через Microsoft 365. Скорее всего проблемой является блокировка доступа к каталогам DBEB. Система предусмотрена в Microsoft 365 по умолчанию и автоматически отклоняет все письма с адресами, не предусмотренными в Azure Active Directory. Они даже могут присутствовать, но считаться внешними, ведь хранятся в почтовом ящике общедоступных папок, не синхронизированных с Azure.

Что нужно сделать:

  • ароверить, что все общедоступные сервера размещены локально;
  • удостовериться в том, что общедоступные сервера есть в Exchange Online;
  • отключить блокировку DBEB.

Ошибка Recipient Address Rejected может быть исправлена либо изменением адреса получателя, либо внесением корректив в его настройки фильтрации для приходящих писем. Исключение – Exclaimer Cloud Microsoft 365, но это отдельная история.

1

Отправка писем из скриптов bash/shell

Теперь давайте копнем глубже и попробуем отправить письмо из скрипта оболочки. Ниже простой скрипт, отправляющий информацию по использованию диска.

#!/bin/bash
du -sh | mail -s "disk usage report" [email protected]

Откройте новый файл, вставьте в него приведенные выше строки, сохраните и запустите. Вы получите письмо, содержащее вывод команды «du -sh».
И последняя хитрость в письмах из командной сроки — добавление вложений к письмам, отправляемым из скриптов. Предположим, вам необходимо сделать резервную копию директории с конфигурационными файлами, заархивировать ее и отправить в качестве вложения с помощью mutt:

#!/bin/bash
tar -zcf /home/user/backup.tar.gz /home/user/files_to_backup
echo "Archived configuration files" | mutt -a /home/user/backup.tar.gz -s "backup data" [email protected]

Команда echo в начале третьей строки добавляет текст «Archived configuration files» в тело письма.

Как отправить письмо c вложением (attachment)

С такой задачей сталкивалось огромнейшее количество разработчиков и, как следствие, существует огромнейшее количество готовых решений. Большинство из них содержит различного рода ошибки, реализовывает не всю функциональность или сложны в применении. Но самый весомый минус — подавляющая масса разработчиков после написания класса, отвечающего его личным потребностям сегодняшнего дня, никогда более не возвращаются к поддержке и доработке исходных кодов.

В связи с этим дальнейшие примеры кода будут базироваться на готовом решении, взятом из PEAR (репозиторий приложений и модулей PHP). Пакет, который будет использован в примерах, называется Mail_Mime. Скачать последнюю версию пакета и получить исчерпывающую документацию можно по адресуhttp://pear.php.net/package/Mail_Mime. Рассмотрим пример его использования:

Приведенный код довольно понятен, но все же несколько слов о нем.

Переменная $mime является экземпляром класса Mail_mime. В его конструктор мы передали необязательный параметр, определяющий, какой именно перевод строки будет использован: «\n» или «\r\n». Данный предназначен для формирования тела и заголовков отправляемого письма. При помощи метода setTXTBody мы определяем текстовую часть письма. В качестве параметра метод принимает строку или имя файла, который будет использован. Аналогично при помощи метода setHTMLBody мы задаем содержимое HTML-версии письма.

Рассмотрим метод addAttachment подробнее. Принимаемые параметры:

  • string $data

    Полный путь к прикрепляемому файлу на сервере либо его содержимое. Обязательный параметр.

  • string $c_type

    Значение заголовка Сontent-type, который будет отправлен. Необязательный параметр, значение по умолчанию — application/octet-stream.

  • string $name

    Имя прикрепляемого файла. Будет использован только в случае, если первый параметр ($data) является содержимым файла.

  • boolean $isfile

    Определяет, является ли первый параметр путем к файлу. Необязательный параметр, значение по умолчанию — true.

  • string $encoding

    Значение заголовка Content-Transfer-Encoding, определяющего формат, в котором будет отправлено приложение. Необязательный параметр. Допустимые значения: base64 (используется для двоичных файлов), quoted-printable(используется для текстовых файлов). Значение по умолчанию: base64.

Таким образом, есть два способа применения данного метода.

  1. указывая путь к файлу на сервере:
    $mime->addAttachment('/home/user/report.txt', 'text/plain');
  2. указывая содержимое файла (в таком случае третий и четвертый параметры необходимо указывать принудительно):
    $mime->addAttachment($contentFile, 'text/plain', 'report.txt', false);

Переходим к формированию заголовка и тела письма. Это все еще обязанности экземпляра класса Mail_mime. Для формирования тела письма применяется метод get, который в качестве необязательного параметра принимает ассоциативный . Ключами могут выступать следующие значения: text_encoding, html_encoding, 7bit_wrap, text_charset, html_charset. Для формирования заголовков используется метод headers. В качестве необязательного параметра принимает хеш-массив. Для более детального ознакомления с допустимыми значениями данного параметра обратитесь к RFC-822.

Вызов метода get() должен осуществиться до того, как будет вызван метод headers(). Убедитесь, что в Вашем коде это условие соблюдено.

Сам процесс отправки уже сформированного письма возложен на класс Mail. Вначале необходимо при помощи статического вызова метода factory создать экземпляр данного класса. В нашем примере он принимает единственный параметр — строку ‘mail’. Более детально принимаемые параметры и их значения описаны ниже в статье, где описываются альтернативные способы отправки почты.

Процесс отправки почты завершается вызовом метода send, принимающего в качестве входящего параметра адресатов, заголовки письма и его тело.

Проверку на ошибки, во время отправки письма, можно реализовать используя следующий код:

Для дальнейшего ознакомления с возможностями Mail и Mime_mail ознакомьтесь с разделами «Как отправить письмо с картинками», «Альтернативные способы отправки писем»

Отправка подписанного и зашифрованного письма через PHPMailer

По-умолчанию, PHPMailer шифрует все отправляемые письма. Отключить шифрование письма можно только при отправке писем через SMTP использовав код:

$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;

Чтобы подписать письмо подписью DKIM, необходимо выполнить несколько действий:

  • Сгенерировать приватный (private) и публичный (public) ключи для вашего домена
  • Добавить DNS-запись для домена типа TXT с публичным ключом
  • Настроить DKIM подпись в PHPMailer перед отправкой письма

Теперь опишу каждый шаг немного подробнее.

Генерация приватного и публичного ключей

Если у вас Linux-хостинг и есть доступ в Shell, то сгенерировать файлы ключей проще простого, нужно выполнить всего 2 команды с обычными правами своего пользователя:

openssl genrsa -out test-private.pem 1024
openssl rsa -in test-private.pem -out test-public.pem -pubout

Соответственно, test-private.pem и test-public.pem — это приватный и публичный ключи. Сохранить их нужно в папке, которая будет не доступна посетителям сайта или кому-то еще кроме вас.

Если нет возможности выполнить команды в shell, тогда чтобы сгенерировать приватный (private) и публичный (public) ключи и сохранить их в файлы, можно воспользоваться следующим кодом:

$domain = 'test.ru';                   // ваш домен
$privatekeyfile = 'test-private.pem';  // имя файла, в который будет записан приватный ключ
$publickeyfile = 'test-public.pem';    // имя файла, в который будет записан публичный ключ

if (file_exists($privatekeyfile)) {
  echo "<p>Using existing keys</p>";
  $privatekey = file_get_contents($privatekeyfile);
  $publickey = file_get_contents($publickeyfile);
} else {
  echo "<p>Create keys</b>";
  $pk = openssl_pkey_new(
      
  );
  openssl_pkey_export_to_file($pk, $privatekeyfile);
  $pubKey = openssl_pkey_get_details($pk);
  $publickey = $pubKey;
  file_put_contents($publickeyfile, $publickey);
  $privatekey = file_get_contents($privatekeyfile);
}
echo "<p>Private key (keep this private!):</p><pre>" . $privatekey . "</pre>";
echo "<p>Public key:</p><pre>" . $publickey . "</pre>";

Внимание! Не забудьте убедиться, что папка, в которую будут сохраняться файлы, доступна для записи

Добавление DNS-записи с публичным ключом

DNS-запись нужна, чтобы почтовые серверы, которые будут получать ваши письма, смогли проверить подпись на письме, прочитав DNS-запись вашего домена. Как правило, DNS-запись можно добавить в панели управления вашим доменом, либо в панели управления хостингом. Если не знаете, как добавить запись, обратитесь в поддержку вашего хостинг-провайдера.

Нужно добавить DNS-запись следующего вида:

Имя записи: mail._domainkey.test.ru. (в конце точка «.»)

TTL: 3600 (или какое будет по-умолчанию)

Тип записи: TXT

Значение: v=DKIM1; h=sha256; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ

В имени записи test.ru нужно заменить на имя вашего домена. Слова «ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ» вы заменяете на текст, который вы получили на предыдущем шаге после «Public key», без «——BEGIN PUBLIC KEY——» и «——END PUBLIC KEY——«, только сам ключ. При этом все строчки ключа нужно соединить в одну длинную строку, чтобы переводов строки не было.

Настройка подписи DKIM в PHPMailer и отправка письма

Теперь осталось лишь сделать несколько настроек PHPMailer перед отправкой письма и оно будет подписано. Думаю, на приведенном примере будет всё понятно:

// Подключаем библиотеку
use PHPMailer\PHPMailer\PHPMailer;
require 'PHPMailer/PHPMailer.php';

// Создаем письмо
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->setFrom('[email protected]');
$mail->addAddress('[email protected]');
$mail->Subject = 'Это тест';
$mail->msgHTML('<p>Это тест</p>');

// Настройка DKIM подписи
$mail->DKIM_domain = 'test.ru';
$mail->DKIM_private = 'test-private.pem';
$mail->DKIM_selector = 'mail';

// Отправляем
$mail->send();

Разумеется, test.ru вы должны поменять на имя своего домена, а test-private.pem на полный путь и имя файла приватного ключа, который был создан на этапе генерации ключей.

Теперь, ваши письма, отправляемые через PHPMailer будут подписаны подписью DKIM вашим приватным ключом.

Отправка почты

В зависимости от дистрибутива, который вы используете, может понадобиться установить дополнительные пакеты, такие как mailutils, чтобы команда mail нормально работала.

Пользователи Debian/Ubuntu могут воспользоваться командой apt-get:

# apt-get install mailutils

Пользователи Fedora / CentOS / Red Hat Enterprise Linux (RHEL) могут сделать это с помощью yum:

# yum install mailutils

Теперь команда mail должна быть готова к работе.

Выполните приведенную ниже команду, заменив «[email protected]» на свой адрес электронной почты. Опция s задает тему письма.

$ mail -s "Hello World" [email protected]

Теперь вы можете вводить текст письма. Когда закончите, нажмите «control-D» в начале новой строки.

# mail -s "This is the subject" [email protected]
Cc: 
Hi Silver
How are you doing
Hope its going fine.
Bye

Вы отправили первое письмо из командной строки. Содержимое письма можно вставить из файла.
В некоторых дистрибутивах командная оболочка сначала запросит в интерактивном режиме ввод других полей, таких как «Cc» (Carbon copy). Просто нажимайте «Enter», чтобы пропустить этот этап. Когда вы введете адрес или адреса электронной почты, необходимо нажать «Enter», чтобы перейти на новую строку, к телу письма.
После нажатия Ctrl+D вы возвращаетесь в командную строку без каких либо дополнительных оповещений. Однако ваше письмо было отправлено.
Интересно, что если вы ничего не введете в теле письма и нажмете Ctrl+D, команда mail отреагирует на это:

# mail -s "This is the subject" [email protected]
Cc: 
Null message body; hope that's ok

Если тело письма хранится у нас в отдельном файле, мы можем напрямую использовать его для отправки письма. Это полезно при вызове команды mail из скриптов, или других программ, написанных, например, на perl или php.

$ mail -s "Hello World" [email protected] < /home/user/mailcontent.txt

Или быстрая отправка письма одной строкой:

# echo "This is the message body" | mail -s "This is the subject" [email protected]

Другие полезные параметры команды mail:

Ниже пример использования этих опций:

$ mail -s "Hello World" [email protected] -c [email protected] -b [email protected]

Возможно задавать несколько получателей, перечисляя их адреса через запятую.

$ mail -s "Hello World" [email protected],[email protected]

Указать адрес отправителя тоже несложно, но здесь есть своя хитрость. После отправляемого письма необходимо добавить перед своим адресом следующую последовательность символов:

(двойное тире) (пробел) (одинарное тире) (без пробела) f

Ниже пример:

$ mail -s "Hello World" [email protected] -- -f [email protected]

Однако приведенная выше последовательность может работать в centos, но не в debian или ubuntu. В этих системах используется альтернативный синтаксис:

# echo "This is the message body" | mail -s "This is the subject" [email protected] -aFrom:[email protected]

Опция a в целом добавляет дополнительные заголовки. Чтобы задать с ее помощью отправителя, используется следующий синтаксис:

# echo "This is the message body" | mail -s "This is the subject" [email protected] -aFrom:Blogger\<[email protected]\>

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

Ответ 1

Однажды я написал эту функцию для ksh на Solaris (использует Perl для кодирования base64):

    to          =»$1″

    cc         =»$2″

    subject =»$3″

    body     =»$4″

    filename=»${5:-»}»

    boundary=»_====_blah_====_$(date +%Y%m%d%H%M%S)_====_»

    {

        print — «To: $to»

        print — «Cc: $cc»

        print — «Subject: $subject»

        print — «Content-Type: multipart/mixed; boundary=\»$boundary\»»

        print — «Mime-Version: 1.0»

        print — «»

        print — «This is a multi-part message in MIME format.»

        print — «»

        print — «—$boundary»

        print — «Content-Type: text/plain; charset=utf-8»

        print — «»

        print — «$body»

        print — «»

        if ; then

            print — «—$boundary»

            print — «Content-Transfer-Encoding: base64»

            print — «Content-Type: application/octet-stream; name=$filename»

            print — «Content-Disposition: attachment; filename=$filename»

            print — «»

            print — «$(perl -MMIME::Base64 -e ‘open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))’ $filename)»

            print — «»

        fi

        print — «—${boundary}—«

    } | /usr/lib/sendmail -oi -t

}

Примеры использования командной строки для email-отправки

1. Отправка письма с вложением

Для разных типов дистрибутива Linux команды могут отличаться.

а) для CentOS / Red Hat:

echo ‘Attachment’ | mail -s ‘Subject attachment message’ -a /var/log/maillog [email protected]

б) для Ubuntu:

echo ‘Attachment’ | mail -s ‘Subject attachment message’ -a /var/log/maillog -a /var/log/maillog2 [email protected]

… или:

echo ‘Attachment’ | mail -s ‘Subject attachment message’ -A /var/log/maillog -A /var/log/maillog2 [email protected]

* где /var/log/maillog и /var/log/maillog2 — файлы, которые будут прикреплены к письму

Обратите внимание, что обе команды отличаются по регистру опции a и A — все зависит от версии и сборки Linux (в каких-то нужно использовать маленькую, в каких-то — большую). Также обратите внимание, что в примере для Ubuntu мы отправим 2 файла — для этого просто добавляем к команде еще одну опцию прикрепления файла

2. Несколько получателей

Для отправки письма нескольким получателям, просто перечисляем их через запятую:

echo «Test text» | mail -s «Test title» [email protected],[email protected]

* в данном примере мы отправил письмо на ящики [email protected] и [email protected].

3. Отправка с копией

Отправить копию на адрес [email protected]:

echo «Test copy» | mail -s «Test copy title» [email protected] -c [email protected]

Отправить скрытую копию на адрес [email protected]:

echo «Test hidden copy» | mail -s «Test hidden copy title» [email protected] -b [email protected]

4. Указать отправителя

В CentOS / Red Hat:

echo «Test text» | mail -s «Test title» -r [email protected] [email protected]

В Debian / Ubuntu:

echo «Test text» | mail -s «Test title» [email protected] -aFrom:[email protected]

5. Отправка через другой SMTP сервер

а) Для Ubuntu / Debian:

echo «Test text» | mail -s «Test title» -a «Smtp: smtp.mail.ru:25» -a «From: [email protected]» -a «Return-path: [email protected]» [email protected]

б) Для CentOS / Red Hat:

echo «Test text» | mail -s «Test title» -S smtp=»smtp.mail.ru:25″ [email protected]

Однако, если сторонний почтовый сервер работает по шифрованному каналу и требует аутентификацию, необходимо ввести следующее:

echo «Test text» | mail -v -s «Test title» -S smtp=»smtp.dmosk.ru:587″ -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user=»[email protected]» -S smtp-auth-password=»password» -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S [email protected] [email protected]

* где smtp.dmosk.ru — сервер smtp; 587 — порт для подключения к серверу отправки; smtp-use-starttls указывает на использование шифрования через TLS; smtp-auth=login задает аутентификацию с использованием логина и пароля; smtp-auth-user и smtp-auth-password — соответственно логин и пароль; ssl-verify=ignore отключает проверку подлинности сертификата безопасности; nss-config-dir указывает на каталог с базами nss; from задает поле FROM

5.2 Как настроить Windows-сервер

Вначале необходимо определится, какой SMTP-сервер вы хотите использовать. Это может быть как ваш персональный PC, так и любой другой. Какой бы способ вы не выбрали, вам необходимо установить переменные SMTP, smtp_port, определяющие настройки сервера, отправляющего почту. Также установите переменную sendmail_from, определяющую обратный адрес отправителя.

Дальнейшее инструкции относятся только к тем, кто решил использовать свой персональный PC как сервер исходящей почты.

Проверьте, отвечает ли кто-либо на 25м порту. Это можно сделать, выполнив `telnet localhost 25`. Если вы получили «Connection refused», это означает, что у вас не запущен почтовый агент, и, вероятнее всего, не установлен. В таком случае Вам необходимо посетить один из следующих ресурсов:

  • http://www.argosoft.com/applications/mailserver/
  • http://courierms.narod.ru/
  • http://www.indigostar.com/sendmail.htm

Выберите программу, отвечающую вашим потребностям, и далее следуйте инструкциям по ее установке и применению.

К примеру, приведем инструкцию по настройке первого из них:

  1. Скачать и проинсталлировать ArGoSoft Mail Server
  2. Запустить приложение и выбрать Tools > Options
  3. Выбрать DNS сервер либо предоставить возможность определять его автоматически
  4. В закладке «IP Homes» вести 127.0.0.1
  5. Стартовать сервис ArGoSoft Mail Server и убедиться, что не было сообщений об ошибках
  6. В файле php.ini указать SMTP = localhost
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: