Вменяемая инструкция к phpmailer “отправка писем и файлов на почту”

Вход в командную строку

Используя Ubuntu в качестве операционной системы, вы можете перейти к командной строке двумя путями, а именно через консоль или через терминал.
Если вы хотите зайти в командную строку через терминал, то для этого необходимо нажать Ctrl+Alt+F(1-6) – в зависимости от выбранного номера (F1, F2…) вы попадаете в первую, вторую или другую по счету виртуальную консоль (они независимы и запускаются во время загрузки Ubuntu), каждая из которых имеет интерфейс командной строки. Если вы нажмете Ctrl+Alt+F7, то перейдете в седьмую виртуальную консоль, которая имеет графический интерфейс.

Что касается терминала, то это графическая программа, которая эмулирует консоль. Вы можете найти ее в меню, выбрав «Приложения», затем «Стандартные», а затем «Терминал», либо нажав сочетание клавиш Ctrl+Alt+T. Вы сможете выполнять команды, продолжая находиться в графическом интерфейсе.
Также возможен вариант, когда вам необходимо подключиться к серверу, на котором установлена Ubuntu. В этом случае вам нужно воспользоваться специальной программой (например, puTTy): наберите нужный ip-адрес, а затем введите имя пользователя и пароль.

Примечание.
При вводе пароля в командную строку он не высвечивается – вам нужно просто набрать пароль и нажать Enter. Если пароль введен правильно, вы сможете продолжить работу в командной строке.

Проверка доступности почтового сервера программным методом

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

Одним из способов предупреждения появления ошибок является онлайн-проверка доступности почтового сервера с помощью бесплатных инструментов:

  • https://mxtoolbox.com
  • https://www.ultratools.com
  • http://mail2web.com

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

Прочитав эту статью, обратите внимание на то, как настроен ваш почтовый сервер на получение сторонних писем по SMTP-протоколу

Быть может, в данный момент ваш антиспам или локальная политика фильтрации входящих сообщений блокирует получение очень важного и нужного для вас месседжа? Проверьте сами или обратитесь к системному администратору. Если ошибку с SMTP никак не удается решить, то попробуйте обратиться в службу поддержки почтового сервера

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

Поиск и использование регулярных выражений

Для поиска файлов в bash используется команда find. Ее синтаксис следующий: find + нужная директория (путь) + ключ (или несколько) + критерии ключа + (опционально) последующее действие над найденными файлами.

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

find --h

К примеру, следующая команда позволит вам найти все файлы, которые находятся в директории dir1, и имеют название file:

find /home/users/dir1 -name ‘file*’

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

* — обозначает любое количество символов, включая их отсутствие (например, по запросу file* будут найдены все файлы: file, file1, file829, fileabc и т.д.);

? — обозначает один символ (по запросу file? будут найдены файлы с одним символом после слова file: file1, file9, filea и т.д.; по запросу file?? будут найдены файлы с двумя символами: file12, file34, file92 и т.д.);

[] — обозначает подмножество значений, которые может принимать один символ (по запросу file будут найдены файлы: file1, file2, file3 и так далее до file9; по запросу file файлы filea, fileb, filec и filed).

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

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

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

# apt-get install mailutils

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

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

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

$ mail -s «Hello World» user@yourmaildomain.com

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

# mail -s «This is the subject» m00n.silv3r@gmail.com 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» m00n.silv3r@gmail.com Cc: Null message body; hope that’s ok

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

$ mail -s «Hello World» user@yourmaildomain.com < /home/user/mailcontent.txt

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

# echo «This is the message body» | mail -s «This is the subject» m00n.silv3r@gmail.com

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

-s subject (тема письма)

-c -address (CC — отправка копии письма по адресам -address)

-b -address (BCC — отправка скрытой копии письма по адресам -address)

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

$ mail -s «Hello World» user@yourmaildomain.com -c usertocc@yourmaildomain.com -b usertobcc@yourmaildomain.com

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

$ mail -s «Hello World» user1@yourmaildomain.com,user2@yourmaildomain.com

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

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

Ниже пример:

$ mail -s «Hello World» user@yourmaildomain.com — -f from_user@yourmaildomain.com

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

# echo «This is the message body» | mail -s «This is the subject» m00n.silv3r@gmail.com -aFrom:blog@binarytides.com

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

# echo «This is the message body» | mail -s «This is the subject» m00n.silv3r@gmail.com -aFrom:Blogger<blog@binarytides.com>

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

Чтение писем

До сих пор мы рассматривали отправку писем из командной строки. На самом деле также легко можно читать письма из командной строки:

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

Первая строка вывода — это версия программы mail. Вторая строка говорит о том, что имеется два сообщения, оба непрочитанные, и почта хранится в файле /var/spool/mail/hcg. У всех пользователей linux файл с почтой находится в директории /var/spool/mail/. При получении нового письма оно добавляется в конец этого файла. После информации о файле выводится список писем. Настоятельно рекомендуется не редактировать этот файл без использования mail или аналогичной программы. Читать или производить поиск писем лучше всего с помощью grep. Чтобы прочитать первое письмо, просто введите 1 и нажмите enter. При чтении письма, если вам необходимо вернуться к списку писем, просто нажмите «q». Символ > показывает, какое из писем в настоящее время является текущим.

Команда Maildir-utils

«mu» — это набор утилит командной строки для Linux/Unix, который позволяет производить быстрый поиск писем.

Пользователи Debian/Ubuntu могут установить его с помощью apt-get:

# apt-get install maildir-utils

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

# yum install maildir-utils

Ниже пара простых команд из этого пакета:

$ mu find from:william subject:report

для поиска писем от william с темой report.

Чтобы проверить текущие настройки почты, используется опция .

# mu- VERSION=2.99.97 SYSCONFDIR=/etc MAILSPOOLDIR=/var/mail/ SCHEME=mbox LOG_FACILITY=mail …..

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

Установка, удаление и обновление пакетов

Для установки программ в Linux используются менеджеры пакетов. Они разнятся от дистрибутива к дистрибутиву, поэтому команды для управления ими тоже отличаются. Рассмотрим наиболее популярные.

Debian/Ubuntu

  • sudo apt-get install название пакета — устанавливает программу на выбор. Главное знать, как она называется.
  • sudo apt remove название пакета — стирает с жесткого диска имеющийся в системе пакет.
  • sudo apt-get update — обновляет информацию о пакетах, имеющихся в системе, и тех, что хранятся в подключенных репозиториях.
  • sudo apt-upgrade — обновляет установленные пакеты до самых свежих версий, доступных в подключенных репозиториях.

Red Hat Linux/CentOS

  • sudo dnf install название пакета — устанавливает программу на выбор.
  • sudo dnf upgrade — обновляет установленные пакеты до самых свежих версий.
  • sudo dnf remove название пакета — стирает с жесткого диска имеющийся в системе пакет.

Создание, перемещение и удаление

Используйте команду mkdir для создания директории. Не забудьте указать имя:

mkdir dir1

Новая директория будет создана в той директории, где вы находитесь в данный момент, но вы также можете прописать какой-то другой путь для создания новой директории:

mkdir /home/users/dir1

Для создания файла вам нужно ввести команду touch и название будущего файла:

touch file1

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

touch /home/users/dir1/file1

Для перемещения директорий и файлов используется команда mv, после которой вы пишете название директории или файла, который хотите переместить, а затем место, куда хотите переместить:

mv file2 /home/users/dir2

mv dir1 /home/users/dir3

Обратите внимание, что команда mv также используется для переименования, поэтому если при отсутствии директории dir2 вы напишете такую команду:

mv dir1 dir2

то директория dir1 будет переименована в директорию dir2. Этот пример справедлив и для файлов, которым вы можете давать другие названия при помощи команды mv.

Для удаления файлов следует использовать команду rm, а для удаления директорий rmdir. Если вы хотите удалить каталог, используйте команду rm с ключами -rf:

rm -rf /home/users/

Еще одно действие, которое вы можете использовать, — это копирование при помощи команды cp. Синтаксис у этой команды такой же, как и у предыдущих, — вы просто пишете, что и куда хотите скопировать. Для копирования директории обязательно нужно использовать ключ -r, при этом если конечная директория (dir2) не существует, то она будет создана при копировании:

cp -r dir1 dir2

Установка и настройка ssmtp

Устанавливаем SMTP клиент

# apt-get install ssmtp

Файл конфигурации оставляем без изменений.

Создаём новые конфигурационные файлы для каждой почтовой службы

# touch /etc/ssmtp/ssmtp-gmail.conf
# touch /etc/ssmtp/ssmtp-yandex.conf
# touch /etc/ssmtp/ssmtp-mailru.conf

В файл заранее добавляем

batman:batman@gmail.com:smtp.gmail.com:465
tux:tux@linux.com:smtp.yandex.ru:465
joker:joker@anekdot.ru:smtp.mail.ru:465
root:batman@gmail.com:smtp.gmail.com:465
www-data:batman@gmail.com:smtp.gmail.com:465
batman:batman@gmail.com:smtp.gmail.com:465

Почему root и другие пользователи?

Через консоль мы будем отправлять от имени root, а через php от имени системного пользователя (использую mod_ruid).

В тестовом окружении можно позволить себе работать под root’ом. Но если сервер не ваш или дико важный продакшн, тогда вы ССЗБ.

Конфигурационные файлы ssmtp

Файл /etc/ssmtp/ssmtp-gmail.conf

mailhub=smtp.gmail.com:465
AuthUser=batman@gmail.com
AuthPass=BWisthebest
AuthMethod=LOGIN
rewriteDomain=gmail.com
hostname=localhost
UseTLS=Yes
#UseSTARTTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
#Debug=Yes

Файл /etc/ssmtp/ssmtp-yandex.conf

mailhub=smtp.yandex.ru:465
AuthUser=tux@linux.com
AuthPass=nvidiasuxx
AuthMethod=LOGIN
rewriteDomain=linux.com
hostname=localhost
UseTLS=Yes
#UseSTARTTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
#Debug=Yes

Файл /etc/ssmtp/ssmtp-mailru.conf

mailhub=smtp.mail.ru:465
AuthUser=joker@anekdot.ru
AuthPass=waiting1april
AuthMethod=LOGIN
rewriteDomain=anekdot.ru
hostname=localhost
UseTLS=Yes
#UseSTARTTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
#Debug=Yes

Проверка

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

Самый простой через pipe, добавляем здесь ключ для указания на конкретный конфигурационный файл (подробнее в man)

echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-gmail.conf  vvp@kermlin.su
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-yandex.conf vvp@kermlin.su
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-mailru.conf vvp@kermlin.su

Проверка через PHP

<?php
mail('vvp@kermlin.ru', 'Пенсионная реформа', 'Смерть ворогам!');
?>

Наступлю на грабли за вас

1 Для mail.ru и Yandex: перед отравкой почты необходимо зайти в почтовый ящик через веб-интерфейс. В противном случае будет ошибка

ssmtp: 550 Message was not accepted -- invalid mailbox.  You need to complete your registration in order to send your mail.  Please visit http://e.mail.ru/signup?NeedMoreInfo=1

2 Ещё одна ошибка

RCPT TO:<dimon@gov.ru> (501 sender address must match authenticated user)

В добавляем нужных пользователей. В моём случае php-скрипты запускаются от имени системного пользователя, а не от nobody или www-data/httpd, поэтому в revaliases помимо root указаны логины системных пользователей.

3 Неверный From

dx:x:1001:1001:username@gmail.com:/home/dx:/usr/sbin/nologin

4 Если в логе

Creating SSL connection to host
SSL not working: certificate verify failed (20)
Cannot open smtp.gmail.com:587

то добавьте в конфигурационный файл опцию TLS_CA_File

Путь для Ubuntu/Debian /etc/ssl/certs/ca-certificates.crt
Путь для CentOS /etc/pki/tls/certs/ca-bundle.crt

Есть ли журнал/лог у ssmtp?

Да, для этого требуется добавить опцию Debug=YES. После чего в syslog будут записываться содержимое отправленных писем и почтовые заголовки.

Если не в syslog, то куда-нибудь уж точно. Найти поможет команда

# grep -riI ssmtp /var/log

Как указать сайту какой конфиг использовать

Наконец-то самое интересное

Через htaccess нельзя.

Если у каждого сайта свой php.ini, то

sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf"

Либо через конфигурацию виртуального хоста

Для Apache

<VirtualHost 1.3.3.7:80>
 ...
    <Directory /home/user/domain.tld/public_html>
        ...
        php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf"
    </Directory>
</VirtualHost>

Для nginx/php-fpm

fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf";

Автодополнение

Tab – автодополнение (в контексте)

Во многих командных интерпретаторах (и в bash в том числе) используется такая возможность, как автодополнение. Как минимум нужно знать, что по нажатию клавиши дописывается название команды. В bash по умолчанию обычно настроено так, что если имеется только один вариант дополнения, то он дописывается по нажатию (также можно использовать и ). Когда вариантов дополнения много, то по первому нажатию дописывается только общая часть (если она есть). А по второму нажатию отображается список всех доступных вариантов. Дальше можно набрать еще символов – уточнить, какое из дополнений нужно, и снова нажать . То же самое с другими дополнениями: имен файлов, имен переменных.

^^^ Здесь, например, смотрю (нажав дважды ), что есть несколько команд, начинающихся с «if», добавив «c» и нажав , получаю набранной команду «ifconfig».

^^^ В этом примере дополняю аргументы команды (здесь имена файлов). Также видно, что в случае, когда вариантов много и все не умещаются в окне терминала, их список отображается утилитой для постраничного просмотра (также при очень большом списке вариантов выдается запрос вида «Display all 125 possibilities? (y or n)» или, как в этом примере, при малом количестве — «—More—».

Дополнения имен пользователей, переменных

Часто, когда дописываются аргументы команд по , дописываются имена файлов. Но стоит также отметить, что, в зависимости от контекста, по дописываются и имена переменных (аргументы, начинающиеся с символа «$»), имена пользователей (аргументы, начинающиеся с символа «~»),…

^^^ Здесь, чтобы набрать «$HISTFILESIZE», вместо 13 символов набрал 8 символов ( ). Помимо того, что так быстрее, это еще и позволяет допускать меньше ошибок при наборе команд, так как не просто печатаю текст, а выбираю из списка установленных переменных.

^^^ Здесь дописываю имена пользователей (фактически пишу адрес домашней директории).

Также bash может дополнять не потому, что набранный текст начинается с определенного символа, а по определенным комбинациям клавиш.

Список того, что может дополнять bash, можно посмотреть командой:

Так, например, видно, что:

  • – покажет список имен пользователей, начинающихся с набранных символов, а дополнить комбинацией ;

  • – список имен машин (согласно /etc/hosts), начинающихся с набранных символов, а дополнить – ;

  • – список имен переменных, заданных в этой сессии (можно их также посмотреть командой set), а дополнить – ;

  • – список команд (согласно доступных: $PATH, alias, функций, встроенных команд), а дополнить – ;

  • – список имен файлов, а дополнить – .

Alt-* – вставить дополнения, Ctrl-x * – развернуть шаблон

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

В примерах ниже разворачиваю список файлов:

Вариант с :

Вариант с :

– развернет уже написанный в командной строке шаблон, как в примере ниже:

Шаг 1 — Установка Postfix

Postfix включен в репозиторий Ubuntu по умолчанию, так что вы можете установить его с помощью APT.

Для начала обновите локальный кэш пакетов :

Затем установите пакет с помощью следующей команды

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

Процедура установки откроет серию интерактивных диалогов. Для целей данного обучающего модуля введите в диалогах следующие данные:

  • General type of mail configuration?: Для данного параметра выберем пункт Internet Site, соответствующий потребностям нашей инфраструктуры.
  • System mail name: это базовый домен, используемый для построения корректного адреса электронной почты, когда имеется только часть адреса с именем учетной записи. Допустим, имя хоста вашего сервера . Возможно вы захотите задать для системной почты имя . В этом случае для имени пользователя Postfix будет использовать адрес .
  • Root and postmaster mail recipient: это учетная запись Linux, на которую будет перенаправляться почта, адресованная и . Используйте для этой цели свою основную учетную запись. В данном примере это имя пользователя sammy.
  • Other destinations to accept mail for: определение получателей почты, которых будет принимать этот экземпляр Postfix. Если вам потребуется добавить любые другие домены, для которых этот сервер будет получать почту, добавьте их здесь. В противном случае значений по умолчанию будет достаточно.
  • Force synchronous updates on mail queue?: поскольку вы вероятно используете журнальную файловую систему, выберите No.
  • Local networks: это перечень локальных сетей, для которых ваш почтовый сервер настроен как реле пересылки сообщений. Значение по умолчанию подойдет для большинства случаев. Если вы пожелаете изменить его, постарайтесь максимально ограничить диапазон сетей.
  • Mailbox size limit: используется для ограничения размера сообщений. Значение «» отключает любые ограничения размера.
  • Local address extension character: символ, используемый для отделения обычной части адреса от расширения (используется для создания динамических псевдонимов). Для этого обучающего модуля подойдет значение по умолчанию «».
  • Internet protocols to use: укажите, нужно ли ограничивать версии протокола IP, поддерживаемые Postfix. Для целей данного обучающего модуля выберите вариант «all».

Приведем настройки, использованные в этом руководстве:

  • General type of mail configuration?: Internet Site
  • System mail name: (не )
  • Root and postmaster mail recipient: имя пользователя основной учетной записи Linux (в наших примерах sammy)
  • Other destinations to accept mail for:
  • Force synchronous updates on mail queue?: No
  • Local networks:
  • Mailbox size limit:
  • Local address extension character:
  • Internet protocols to use: all

Примечание. Если впоследствии вам потребуется изменить эти настройки, введите команду:

Для параметров будут указаны заданные ранее значения.

После завершения процедуры установки можно внести некоторые изменения в конфигурацию Postfix.

Шаг 3 — Установка почтового клиента и инициализация структуры Maildir

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

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

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

Чтобы добавить переменную в эти файлы, введите:

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

Выполнив этот шаг, установите клиент электронной почты с помощью APT:

Перед запуском клиента необходимо изменить несколько настроек. Откройте файл в своем редакторе:

Добавьте в конец файла следующие опции:

/etc/s-nail.rc

Вот что делают эти строки:

  • : позволяет клиенту открываться даже при пустом почтовом ящике
  • : задает для каталога внутреннюю folder
  • создает файл в формате mbox для хранения отправленной почты в каталоге, заданном в переменной , в данном случае

Сохраните файл и закройте его после завершения. Теперь вы готовы инициализировать структуру Maildir в вашей системе.

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

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

Примечание. Вы можете получить следующий ответ:

Это нормально, и такой ответ может появиться только при отправке первого сообщения.

Для проверки создания каталога выполните поиск каталога :

Вы увидите, что структура каталогов создана, и что новый файл сообщений находится в каталоге :

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

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