QwertoMailer - программа для персональной рассылки почты

Qwertomailer - это Java библиотека и консольная программа, которая служит для отправки электронной почты. Она работает поверх JavaMail API и предоставляет более простой способ для создания и отправки писем.

QwertoMailer аналогичен таким библиотекам, как Simple Java Mail и Apache Commons Email.
В отличии от них QwertoMailer может использоваться как консольная утилита для отправки почты из командной строки.

QwertoMailer предназначен для отправки только персональных писем. Нельзя отправить одно письмо нескольким адресатам, поместив их в поле TO, CC или BCC. В поле TO может оказаться несколько адресатов только при создании сообщения на основе параметров. В этом случае могут быть указаны несколько адресов, как параметры одного сообщения.

QwertoMailer даёт возможность включить в письмо персонифицированные данные. Текст письма можно создавать как шаблон Velocity. Данные в шаблон будут подставлены из файла с параметрами.

QwertoMailer понимает EML файлы. Письмо можно создать в любом почтовом клиенте, который предоставляет возможность сохранить сообщение.



Скачать

http://bitbucket.org/qwertovsky/qwertomailer/downloads

Использование в качестве программы

При вызове программы будет выведена справка по использованию
java -jar qwertomailer.jar
usage: java -jar qwertomailer.jar [-alttext <text> | -alttextFile <file>]
	[-attach <files> | -attachFile <file>]
	-body <message> | -bodyEML <file> | -bodyFile <file>
	[-charset <charset>] [-contentType <type>]
	-emailFrom <email> -emailTo <recipients> | -emailToFile <file>
	[-hostname <hostname>] [-mimeTransport <transport>]
	[-personFrom <person>] [-related] -smtpHost <host>
	[-smtpPassword <password>] [-smtpPort <port>] [-smtpUser <username>]
	-subject <subject> | -subjectFile <file>
	[-trace]
 -alttext <text>              Add alternative plain text
 -alttextFile <file>          Add alternative plain text from file
 -attach <files>              attach files (comma separated)
 -attachFile <file>           file with list of attach file
 -body <message>              message body
 -EMLFile <file>              get content from EML file
 -bodyFile <file>             message body file
 -charset <charset>           specify message encoding (default utf-8)
 -contentType <type>          specify content type (default text/plain)
 -emailFrom <email>           specify sender email
 -emailTo <recipients>        specify recipients (comma separated)
 -emailToFile <file>          specify file with recipients list
 -hostname <hostname>         replace your local machine name
 -mimeTransport <transport>   specify MIME Transport (default 8bit)
 -personFrom <person>         specify sender name
 -related                     Create message with inline images
 -smtpHost <host>             specify SMTP server
 -smtpPassword <password>     specify SMTP password
 -smtpPort <port>             specify SMTP port (default 25)
 -smtpUser <username>         specify SMTP user
 -subject <subject>           subject
 -subjectFile <file>          file with subject line
 -trace                       Set trace log level. Send messages will be
							  saved on disk
 -haltOnFailure               Stop program if exists bad emails or wrong
                              parameters
Обязательные параметры выделены красным. Некоторые из них можно использовать на выбор.

-alttext <text> Задать альтернативный текст для письма в формате HTML. Он будет отображаться у пользователей, чей почтовый клиент не поддерживает HTML письма.

-alttextFile <file> Задать альтернативный текст из файла.

-attach <files> Прикрепить к письму файлы. Несколько файлов разделяются запятой.

-attachFile <file> Пути к файлам указываются в текстовом файле. Каждый файл на отдельной строке.

-body <message> Текст сообщения.
-EMLFile <file> Получить тело сообщения из сохраненного в формате EML письма. Сообщение будет включать и тему, и альтернативный текст, и вложения, имеющиеся в файле.
-bodyFile <file> Текст сообщения взять из файла.
body, bodyFile, bodyEML можно использовать на выбор.

-charset <charset> Указать кодировку сообщения. По умолчанию - utf-8.

-contentType <type> Указать тип текста сообщения (text/plain или text/html).

-emailFrom <email> Адрес отправителя.

-emailTo <recipients> Разделенные запятыми адреса получателей. Например: "Person <address1@host.com>, Person2 <address2@host.com>"
-emailToFile <file> CSV файл с адресами получателей и параметрами. Первая строка файла должна содержать заголовки. Обязательно должна присутствовать колонка с заголовком, который начинается с 'email'. Зарезервированными также являются заголовки 'attach' и 'person'. Из 'attach*' бурутся пути к файлам для вложений. Из 'person' берётся имя адресата. Такая колонка должна быть одна. Поля разделяются запятой. Экранируются двойными кавычками.
emailTo, emailToFile можно использовать на выбор.

-hostname <hostname> Заменить имя компьютера, с которого выполняется рассылка.

-mimeTransport <transport> Указать MIME транспорт. По умолчанию - 8bit.

-personFrom <person> Указать имя отправителя.

-related Создать HTML сообщение с изображениями в тексте. Если в тексте присутствуют теги IMG с ссылками на файлы изображений, то сообщение будет выглядеть, как HTML документ с изображениями в тексте.

-smtpHost <host> Адрес SMTP сервера

-smtpPassword <password> Пароль для SMTP сервера.

-smtpPort <port> Порт SMTP сервера. По умолчанию - 25.

-smtpUser <username> Логин для SMTP сервера.

-subject <subject> Тема сообщения.
-subjectFile <file> Тема сообщения из файла (одна строка).
subject, subjectFile можно использовать на выбор. Тему нельзя указать, если сообщение создаётся из EML файла.

-trace Будет выводится информация по каждому отправляемому письму. Сами отправляемые письма будут сохраняться в папке ./messages в формате EML.

-haltOnFailure Отправка прекратится, если будет ошибка при формировании писем (неправильный адрес, ошибка в параметрах)

Простое HTML сообщение

java -jar qwertomailer.jar \
-smtpHost smtp.company.ru \
-smtpUser mylogin \
-smtpPassword mypassword \
-emailFrom mylogin@company.ru \
-emailToFile clients_emails.csv \
-subject "Письмо" \
-body "<html>Текст письма</html>" \
-contentType text/html

HTML сообщение с изображением в тексте и вложением

java -jar qwertomailer.jar \
-smtpHost smtp.company.ru \
-smtpUser mylogin \
-smtpPassword mypassword \
-emailFrom mylogin@company.ru \
-emailToFile clients_emails.csv \
-subject "Письмо" \
-body "<html><img src="file:///d:/inline_image.png" /><br />Текст письма</html>" \
-contentType text/html \
-related \
-attach "d:/presentation.pdf"

Текстовое сообщение с параметрами

java -jar qwertomailer.jar \
-smtpHost smtp.company.ru \
-smtpUser mylogin \
-smtpPassword mypassword \
-emailFrom mylogin@company.ru \
-emailToFile clients.csv \
-subject "Новый тариф $tarif" \
-bodyFile body.txt 

Содержимое файла clients.csv


email1			,email2					,fio		,tarif			,attach		,organization
abon16545@gmail.com,						,Иван Доу	,Супер 146		,super146.pdf,
abon2111@gmail.com,						,Мистер Икс	,Супер 146		,super146.pdf,
			,"emp1@company.ru, emp2@company.ru",			,Корпоративный 46	,corp46.pdf	,Рога и Ко

Содержимое файла body.txt

Здравствуйте, #if(!($fio=="")) $fio#else $organization#end.
Ваш тарифный план изменён на $tarif.

В результате будет послано 3 сообщения. Одно сообщения на один набор параметров. В текст и в тему сообщения будут подставлены в соответствии с правилами шаблона Velocity параметры из файла. К сообщению будут добавлены вложения. Во вложения добавляются файлы, указанные в полях, имя которых начинается на 'attach'.

Последнее сообщение будет одно. У него будет два адресата, указанные в поле TO: (Кому:). В поле Кому: добавляются адресаты из всех полей с именем, начинающимся с 'email'. Это позволяет отправлять сообщения не только по людям, но и по группам людей.

Кодировка

Кодировка файлов, из которых берутся текст сообщения, тема и параметры, должна совпадать с указанной кодировкой сообщения. В противном случае данные из файлов могут не прочитаться. По умолчанию используется UTF-8.

Инструкция для разработчиков

Простое текстовое сообщение


MessageContent message = new MessageContent(
	"Message text", "text/plain", "Subject", "utf-8");
message.setAddressFrom("Company", "sender@company.com", "utf-8");
Sender sender = new Sender("smtp.company.com", 25, "login", "password", "Company");
List<InternetAddress> emailsTo = new ArrayList<InternetAddress>();
emailsTo.add(new InternetAddress("john.doe@server.com"));
sender.send(message, emailsTo);

Сообщение HTML с альтернативным текстом


MessageContent message = new MessageContent(
	"<html>HTML message</html>", "text/html", "Subject", "utf-8");
message.setAlternativeText("Text message", "utf-8");
message.setAddressFrom("Company", "sender@company.com", "utf-8");

Сообщение с вложениями


MessageContent message = new MessageContent(
	"<html>HTML message</html>", "text/html", "Subject", "utf-8");
message.setAddressFrom("Company", "sender@company.com", "utf-8");
List<File> attachFiles = new ArrayList<File>();
attachFiles.add(new File("file.pdf"));
message.addAttachments(attachFiles);
message.addAttachment(new File("another_file.zip"));

Сообщение с изображением в тексте


MessageContent message = new MessageContent(
	"<html><img src="file:///d:/inline_image.png" /><br />Текст письма</html>"
	, "text/html", "Subject", "utf-8");
message.setAddressFrom("Company", "sender@company.com", "utf-8");
message.setRelated();

Сообщение из EML файла


MessageContent message = new MessageContent(new File("message.eml"));
message.setAddressFrom("Company", "sender@company.com", "utf-8");
Из файла будут взяты тело сообщения с вложениями и тема письма.

Сообщение с параметрами

Текст сообщения:

Здравствуйте, #if(!($fio=="")) $fio#else $organization#end.
Ваш тарифный план изменён на $tarif.


MessageContent message = new MessageContent(new File("message.eml"));
message.setAddressFrom("Company", "sender@company.com", "utf-8");
message.setSubject("Новый тариф $tarif");
String[] parametersHeaders = new String[]
	{"email1", "fio", "tarif", "attach", "organization"};

List<String[]> parameters = new ArrayList<String[]>();
parameters.add(new String[]{"abon16545@gmail.com", "Иван Доу", "Супер 146", "super146.pdf", ""});
parameters.add(new String[]{"abon2111@gmail.com", "Мистер Икс", "Супер 146", "super146.pdf", ""});
parameters.add(new String[]{"emp1@company.ru, emp2@company.ru", "", "Корпоративный 46", "corp46.pdf", "Рога и Ко"});
Sender sender = new Sender("smtp.company.com", 25, "login", "password", "Company");
sender.send(message, parametersHeaders, parameters);
Будет отправлено три письма. Одно письмо на основе последнего набора параметров уйдет сразу двум адресатам в поле Кому: (метод TO).

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

Текст сообщения:

Здравствуйте, $fio.
Вводится в действие новый тарифный план $tarif.


MessageContent message = new MessageContent(new File("message.eml"));
message.setAddressFrom("Company", "sender@company.com", "utf-8");
message.setSubject("Новый тариф $tarif");
String[] parametersHeaders = new String[]{"tarif"};
String[] parameters = new String[]{"Супер 146"};
message.setParameters(parametersHeaders, parameters);
message.addAttachment(new File("super146.pdf"));

parametersHeaders = new String[]
	{"email1", "fio"};
List<String[]> personParameters = new ArrayList<String[]>();
personParameters.add(new String[]{"abon16545@gmail.com", "Иван Доу"});
personParameters.add(new String[]{"abon2111@gmail.com", "Мистер Икс"});
Sender sender = new Sender("smtp.company.com", 25, "login", "password", "Company");
sender.send(message, parametersHeaders, personParameters);
В данном случае были проставлены общие параметры для всех. Затем в каждое письмо добавлены персонифицированные данные.

Дополнительные возможности можно посмотреть в Javadoc.

Зависимости

  • JavaMail API
  • SLF4j API
  • Apache Velocity
  • Apache Commons Сollections - для Velocity
  • Apache Commons Lang - для Velocity
  • Apache Commons CLI - для запуска консольной программы
  • OpenCSV - для запуска консольной программы
  • SLF4j-log4j - для запуска консольной программы
  • Log4J - для запуска консольной программы
  • JUnit - для тестов
  • SubethaSMTP - для тестов

Лицензия

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

Разрешается использовать в коммерческих приложениях бесплатно.

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

Разработчик данной библиотеки не несёт денежной ответственности за возможный ущерб, возникший из-за использования данной библиотеки.