Кросс-запросы между базами данных и серверами в MsSQL

В MsSQL есть прекрасная возможность выполнять кросс-запросы между серверами.

Пример SQL, работающего между серверами:

SELECT DOC_ID, DOC_NO, FIRM_ID, STRQTY 
FROM [192.168.99.68].[WMS_FS].[dbo].[DOC_TITLES_FRM] T
where
			(SYNC_STATE_ID=0) 
            and	(DOC_TYPE_ID=75305) 
            and	(DOC_DATE>=DATEADD(month,-1,GETDATE())) 
            and
			convert(nvarchar(12),DOC_ID) NOT IN 
              (Select DOC_CODE 
              from [dbo].[_get_1C_DOC_ORDERS](DATEADD(month,-1,GETDATE()),GETDATE())
              ) 

			ORDER by FIRM_ID

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

Вот как это делается:

EXEC sp_addlinkedserver
@server = N’192.168.99.68′,
@srvproduct = N»,
@provider = N’SQLNCLI’,
@datasrc = N’192.168.99.68′;
GO

Если нужно удалить связь:

EXEC sp_dropserver @server = N’192.168.99.68′
GO

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

 

Взлом 1С7.7. Почему нужно переходить на новые технологии

Программный продукт 1С получил на наших просторах большую популярность. Многие компании, начав использовать 1С7.7 продолжают с ним работать, хоть давно есть новые версии продукта 1С: Предприятия.

1С7.7 перестала обновляться в 1999 году. Т.е. 21 год назад данный программный продукт не изменялся. В те времена мало задумывались о безопасности систем. Как результат — полное отсутствие механизмов безопасности в данном программном продукте.

Многие компании, которые используют 1С7.7, используют его файловый вариант на базе устаревших на данный момент dbf-файлов. Даже если используется 1С7.7 с MsSQL (что редко бывает), этот вариант взламывается в 2 счета с помощью перехвата пароля и логина администратора базы данных, который пересылается при подключении к базе данных клиент-серверными программами.

В данной статье, не будем рассматривать вопрос взлома 1С7.7 на базе MsSQL, т.к. хоть этот взлом прост, тем не менее, требует некоторых специальных знаний от взломщика.

Взлом же 1С7.7 на базе dbf-файлов может провести даже не квалифицированный пользователь компьютера (не то, что «продвинутый пользователь»).

Взлом 1С7.7 на базе DBF-файлов

Имеем базу данных 1С7.7. Запускаем 1С7.7. В открывшемся окне смотрим путь к базе данных:

При входе в базу данных запрашивается пароль и имя пользователя. Создается впечатление защищенности программы.

Идем в каталог, который посмотрели при входе в программу. Видим ВСЮ БАЗУ ДАННЫХ. Нам никто не помешает скопировать всю базу данных, сделать в ней изменения или удалить её. При этом, сложно будет обнаружить, кто это сделал. И админ даже не увидит, что базу данных «увели».

Если хочется получить административный доступ, переименовываем каталог usrdef, входим под админом — не запросится ВООБЩЕ пароль и логин. Сделав все необходимые изменения — восстанавливаем данный каталог обратно. И админ маловероятно, что заметит, что модифицировали данные. А даже если заметит, ему сложно будет доказать это ))).

Не пользуйтесь старым, «дырявым» программным обеспечением, которое может взломать даже младенц!

Автор: Сергей Рудюк
https://corp2.net

 

Сдается танцевальный зал возле м. Лукьяновская. Ул. Белорусская 30

Размер зала около 25-30 кв. м.
Стоимость аренды: 300 грн/час. При больших объемах возможен торг.

В офисе есть 2 туалета.

Фотографии зала:

По поводу аренды, обращайтесь по телефону/Viber: +38 067 901-63-22

 

Сдается 2 комнаты офиса возле м. Лукьяновская. Адрес г. Киев, ул. Белорусская 30

Сдается 2 комнаты офиса в г. Киев, ул. Белорусская 30.
Общая площадь комнат: 30 кв. м.

В офисе есть 2 туалета.
3 линии интернет.
Wifi.
Автономное отопление.
Вход в офис с улицы Белорусская 30.

Стоимость аренды: 12$/кв. м
Итого за 30 кв. м.: 9720 грн/мес.
Коммунальные платежи включены в стоимость.

Эскиз помещения (Зелёным показаны комнаты, которые сдаются в аренду):Офис в аренду Белорусская 30Фотографии помещения:

По поводу аренды, обращайтесь по телефону/Viber: +38 067 901-63-22

 

 

Введение в интерфейс Мemcached для MySQL InnoDB

В предыдущих статьях серии:

В MySQL 5.6 появилось memcache-совместимое хранилище ключ-значение на базе движка Innodb.

InnoDB Memcache Daemon предоставляет вам стабильность innodb для данных вида ключ-значение, доступ к которым может быть организован через более быстрый и оптимизированный протокол memcached. При использовании данного протокола будут пропущены: парсинг запроса, его оптимизация и остальные части обработки, которые не требуются.

С помощью mysqlnd_memcache, вы можете прозрачно направлять ваши запросы к такому memcache-совместимому интерфейсу.

Установка

Стандартные пакеты MySQL 5.6, которые поставляются Ubuntu (Trusty), не включают в себя плагин memcache. Для использования этого плагина вам потребуется установить его из официальных apt-репозиториев MySQL-я (для Debian 7.x Wheezy, Ubuntu 12.04 Precise и Ubuntu 14.04 Trusty).

После того как вы установили MySQL 5.6 (или выше), необходимо войти в MySQL под суперпользователем и выполнить следующее:

SOURCE /usr/share/mysql/innodb_memcached_config.sql;
INSTALL PLUGIN daemon_memcached SONAME "libmemcached.so";

Скрипт innodb_memcached_config.sql делает несколько вещей, и первое, что он делает — это создаёт базу данных innodb_memcache, которая содержит три таблицы:

  1. cache_policies: в этой таблице хранятся правила, как выполняются команды GET, SET, DELETE и FLUSH.
  2. containers: эта таблица содержит список ваших таблиц, к которым возможен доступ с помощью memcache
  3. config_options — в этой таблице хранятся настройки memcache, а именно — разделитель многоколоночных значений — separator (по умолчанию вертикальная черта “|”) и разделитель обращения к таблицам table_map_delimiter (по умолчанию точка “.”)

Второе, что выполняет скрипт — загружает сам плагин и запускает memcache демона внутри MySQL.

Теперь всё готово, чтобы использовать этот плагин.

Создание memcache хранилища

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

Каждая коллекция имеет название, которое используется для обращения к ней через memcache, а также содержит ряд столбцов:

  • name: название для обращения к коллекции через memcache
  • db_schema: название базы данных
  • db_table: название таблицы
  • key_columns: название столбца, содержащего ключ (пусть вас не смущает множественное число, это один столбец)
  • value_columns: названия столбцов, указанные через запятую, которые содержат значение. В memcache-значении все значения этих столбцов будут разделены вертикальной чертой (как указано в таблице config_options)
  • flags: какие флаги memcache установить
  • cas_column: название столбца для CAS-значения, устанавливаемого memcache-ем
  • expire_time_column: название столбца, в котором хранится время «протухания» (в секундах) или 0 если не «протухает» никогда
  • unique_idx_name_on_key: название индекса, который накладывает ограничение UNIQUE на столбец ключа. Если столбец ключа является первичным ключом, укажите PRIMARY

Для того чтобы организовать наше хранилище, мы создадим новую базу данных kv_data и таблицу kv_store в ней:

CREATE DATABASE kv_data;
USE kv_data;

CREATE TABLE kv_store (
    `key` VARCHAR(255),
    `value` VARCHAR(1024),
    `flags` INT, 
    `cas` BIGINT UNSIGNED, 
    `exp` INT,
    primary key(`key`)
) ENGINE = INNODB;

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

INSERT INTO innodb_memcache.containers(
    name, 
    db_schema, 
    db_table, 
    key_columns, 
    value_columns, 
    flags, 
    cas_column,
    expire_time_column,
    unique_idx_name_on_key
) VALUES (
    'kv_data',
    'kv_data',
    'kv_store',
    'key',
    'value',
    'flags',
    'cas',
    'exp',
    'PRIMARY'
);

После того как вы это сделали, вам нужно немного подождать, чтобы это вступило в силу или перезапустить MySQL.

Использование memcache интерфейса

Теперь, когда у вас запущен и работает memcache интерфейс innodb, вы можете вставлять (insert) данные также как в обычную таблицу БД или, конечно же, посредством протокола memcache, — что можно осуществить с помощью telnet-а.

При использовании протокола memcache — по умолчанию и минимальное — количество операций перед тем, как данные будут сброшены в innodb, является 32, как указано в настройке daemon_memcached_w_batch_size. Это означает, что данные становятся видны в MySQL каждые 32 операции. Такова плата за производительность. Исключением из правил является использование binlog-репликации, в том случае, если она постоянно установлена в 1.

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

SET TRANSACTION ISOLATION TO READ-UNCOMMITTED;

Для использования memcache интерфейса с помощью telnet, используйте его следующим образом:

$ telnet localhost 11211

telnet> set test.key 0 0 11
Hello World
STORED

telnet> get test.key
VALUE test.key 0 11
Hello World
END

Использование нескольких коллекций

По умолчанию данные сохраняются либо в коллекции под названием default или, если она не существует, в первую коллекцию в таблице коллекций.

Для доступа к данным другой коллекции у вас есть два варианта:

Первый наиболее близок к MySQL-евскому оператору USE. Вы просто обращаетесь к самой коллекции и далее любые запросы оперируют с этой коллекцией, пока она не будет изменена на другую.

Перед именем коллекции, для отличия от ключей, ставится префикс — два знака @:

telnet> get @@kv_data
VALUE @@kv_data 0 16
kv_data/kv_store
END

Второй — это использовать полное имя. В этом случае как раз вступает в игру table_map_delimeter, посредством чего мы просто ставим перед коллекцией префикс @@collection и после table_map_delimeter. Таким образом, обращение к test.key становится  @@kv_data.test.key

telnet> get @@kv_data.test.key
VALUE @@kv_data.test.key 0 11
Hello World
END

Я рекомендую всегда использовать такой синтаксис, т. к. вы можете случайно сменить коллекцию в каком-нибудь вызванном участке кода без возврата к предыдущей коллекции.

Использование плагина mysqlnd_memcache

Теперь вы можете просто обращаться к вашим данным через интерфейс memcache, используя PHP расширение memcached или memcache (memcached extension, memcache extension). В том числе, вы можете настроить ваш обработчик сессий использовать этот подход. А также вы можете использовать обычные SQL запросы. Однако, с плагином mysqlnd_memcache вы можете прозрачно перенаправлять SQL запросы на memcache интерфейс, когда это необходимо.

По умолчанию запросы сопоставляются с регулярным выражением, указанном в константе MYSQLND_MEMCACHE_DEFAULT_REGEXP:

/^\s*SELECT\s*(.+?)\s*FROM\s*`?([a-z0-9_]+)`?\s*WHERE\s*`?([a-z0-9_]+)`?\s*=\s*(?(?=["'])["']([^"']*)["']|([0-9e\.]*))\s*$/is

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

Для нашего примера этому условию будет соответствовать вот такой запрос:

SELECT `value` FROM kv_store WHERE `key` = 'test.key';

Однако ни один из таких не будет:

SELECT * FROM kv_store WHERE `key` = 'test.key';
SELECT `value` FROM kv_store WHERE `key` = `test.key` AND value LIKE '%foo%';
SELECT `key` FROM kv_store WHERE value LIKE '%foo%';

Такие запросы могут быть выполнены с помощью механизмов одного из расширений: mysql, mysqli или pdo, и будут перехвачены незаметно для вас.

Плагин mysqlnd_memcache не обрабатывает запросы на запись.

Несмотря на это ограничение, его использование может определённо улучшить ваш код (тем, что вам не требуется реализовывать обращение к memcache/memcached API) и получить большой выигрыш в производительности при незначительных изменениях.

Запись, Репликация и пул Memcache

Memcached известен своей простой настройкой пула memcached-ов для балансировки нагрузки и отказоустойчивости, но как обстоят дела с memcache-интерфейсом для InnoDB? В некотором роде похожий обработчик присутствует в MySQL репликации, тем, что каждый слейв может быть использован как сервер Memcache-а в режиме только-для-чтения, впрочем, те же правила для разделения чтения и записи применимы и при работе с Memcache-ем.

Вы должны убедиться, что вы используете только плагин mysqlnd_memcache для доступа к вашему пулу и связать его с плагином mysqlnd_ms для организации разделения чтения и записи. Однако это означает, что вы упустите возможность воспользоваться высоко производительным иинтерфейсом Memcache-а на запись.

Так как нет способа указать memcache(d) расширению, что сервера используются в режиме только-на-чтение, то невозможно использовать стандартную топологию репликации master+slaves в качестве пула memcached-ов.

Заключение

Memcached интерфейс для InnoDB — это намного более быстрый способ использования MySQL для простых хранилищ ключ-значение, но при этом имеет все преимущества великолепного движка InnoDB.

Хотя он и не является настолько быстрым, как сам memcached, он позволяет вам устранить “ещё один шарнир” в вашей инфраструктуре, при этом являясь простой заменой для memcached.

Кроме того, были некоторые радикальные улучшения производительности memcached движка для innodb в предстоящем релизе MySQL 5.7 в особенности для больших мультиядерных систем.

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

Источник: https://phpprofi.ru/blogs/post/27

Включение Slow Query Log без перезапуска MySQL

Порой при работе приложений, работающих с бд, возникает падение производительности, в качестве одного из вариантов может быть убогий неоптимизированый запрос, выполняемый дольше чем планировалось. Для отслеживания данных запросов придумали Slow Query Log, состоит журнал из SQL выражений, времени начала запроса, общего времени выполнения, времени блокировки и прочей полезной информации.
Включать данный лог можно на ходу, не перезапуская сервер, единственное что необходимо — доступ на запись для процесса от имени которого будет создан лог-файл.

Логинимся...
mysql -u root -p
Устанавливаем месторасположение лог-файла
mysql> SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Определям что считать медленным запросом, по-умлочанию 10 секунд, с версии 5.1.21 можно выставить 0, что позволяет собирать все запросы
mysql> SET GLOBAL long_query_time = 5;
Ну и осталось включить
mysql> SET GLOBAL slow_query_log = 'ON';
Еще можно включить логирование запросов неимеющих индексов
mysql> SET GLOBAL log_queries_not_using_indexes = 'ON';

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

[mysqld]
…
slow_query_log = ON
slow_query_log = /var/log/mysql/slow.log
long_query_time = 5
log_queries_not_using_indexes = ON

Для того что бы узнать текущие значения:

mysql> SHOW GLOBAL VARIABLES LIKE 'slow\_%';
+------------------------------------+-------------------------+
| Variable_name                      | Value                   |
+------------------------------------+-------------------------+
| slow_launch_time                   | 2                       |
| slow_query_log                     | ON                      |
| slow_query_log_file                | /var/log/mysql/slow.log |
| slow_query_log_timestamp_always    | OFF                     |
| slow_query_log_timestamp_precision | second                  |
| slow_query_log_use_global_control  |                         |
+------------------------------------+-------------------------+

mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 5.000000  |
+-----------------+-----------+

mysql> SHOW GLOBAL VARIABLES LIKE 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON    |
+-------------------------------+-------+

Для более детального анализа лучше собирать все запросы, указывая long_query_time = 0, и желательно хотя бы за сутки, а после прогнать их через pt-query-digest из percona-toolkit, который приведет логи к более читаемому виду.

Источник: https://h1d3.org/posts/vkliuchenie-slow-query-log-bez-perezapuska-mysql.html

Как добавить «резиновый» SplashScreen в XE7

Как известно, в XE7 упростили возможность добавления заставки (SplashScreen) для нашего приложения. В этой заметке я расскажу как добавлять «статичную» и «резиновую» заставки. Данная заметка будет интересна тем, кто не умеет читать по-английски или просто не читает справку по студии. По большей части, эта заметка является вольным переводом справочного материала, с некоторыми добавлениями от меня.

Update (14.10.14): Добавил ссылку на архив с примером.
Update (14.10.14): Добавил дополнение к правилу №3 
Update (16.10.14) Добавил информацию о «резиновой» заставке на весь экран (FullScreen)

Общие правила для двух типов заставок.
  1. Картинки добавлять необходимо через меню «Project > Options > Application» вкладка «Artwork». Перед этим, не забудьте выбрать платформу.
  2. Добавляемые картинки должны быть строго определённого разрешения. Это «426×320», «470×320», «640×480», «960×720».
  3. Картинки должны быть в формате «png»
  4. Далее пункты разделяются….

 

Статичная заставка.
Мы можем задать режим отображения картинки (disabled, clamp, repeat, mirror), подробности в Android API
Можем указать «Splash gravity», как отображать картинку, если её размер меньше чем размер экрана.
 
Резиновая заставка.
Данный метод очень хорошо подходит в ситуации, когда вы хотите выводить логотип компании на фоне, цвет которого отличается от чёрного и без растягивания самого логотипа.
 
Чтобы сделать заставку, при которой ваш логотип на картинке будет всегда статичным, а всё остальное будет растягиваться необходимо, создать 9-patch изображения. Данные изображения содержат служебную информацию в четырёх дополнительных пикселях.
 
Изображения содержат информацию о блоках отображения картинки. Это блок масштабирования и блок контента.
  • Блок масштабирования – определяет области изображения, которые будут растягиваться.
  • Блок контента – определяет область изображения, где будет отображаться контент (в нашем случае форма, об этом чуть позже). 

 

Правило №0. Два пикселя (слева и сверху) – говорят о том, какая часть изображения будет растягиваться. Два пикселя (снизу и справа) – определяют область контента.
Правило №1. Всегда готовим картинки с разрешением меньше необходимого на 1 пиксель с каждой стороны. Пример: Нужно добавить 426×320, значит, создаём картинку 424×318.
Правило №2. Пиксели, определяющие блоки, закрашиваются чёрным цветом.
Правило №3. (В нашем случае.) Область контента всегда должна иметь размеры всей картинки. Иначе, в результате неправильной разметки области контента форма будет неправильно отрисовываться. Будьте внимательны с этим правилом, я уже успел попасться на нём.
Дополнение в правилу №3: Если использовать вторую утилиту (об этом ниже), то область контента — это синяя область, а растягиваемая область — это зелёная область.
 
Рассмотрим пример из справки. Картинка в чёрном цвете, но нам сейчас это не важно.
 

Из этого примера следует, что:

  1. Stretchable Area – области изображения, которые будут растягиваться. В данном случае будет растягиваться всё, кроме логотипа (пламени/огня).  
  2. Padding Box – стороны закрашены полностью, а значит область контента равна размеру изображения (Правило №3)

Как это лучше понять, возьмём каждую сторону и мысленно проведём горизонтальные и вертикальные линии от начала и конца каждой чёрной линии. Выглядеть это будет примерно так (белые линии):

Теперь посмотрим утилиты, которые специально разработаны для создания картинок с расширением «.9.png». 
  1. Встроенная утилита «draw9patch», находится тут «C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk\tools\lib». Позволяет открывать png картинки, вручную закрашивать нужные области и сохранять с расширением «.9.png».
  2. Утилита, написанная сторонним разработчиком, пользователем HabraHabr’а. Страничка с описанием утилиты: http://habrahabr.ru/company/alee/blog/136667/. Утилита позволяет разметить области (зелёные (растягиваемые) и синие (контент)), не закрашивая при этом вручную пиксели, всё происходит автоматически. Сохраняет картинки с расширением «.9.png».

 

Я использую вторую утилиту и всем советую её, т.к. очень удобно и быстро.
 
Значит, что мы делаем:
  1. Создаём картинки размерами на 2 пикселя меньше (по ширине и высоте) чем требует студия и сохраняем в png формате
  2. Открываем эти картинки в любой утилите или вообще всё делаем в фотошопе.
  3. Размечаем области и сохраняем с расширением «.9.png»
  4. Добавляем картинки в проект (этот шаг рассмотрен ниже, более подробно)
Добавление «.9.png» картинок в проект:
  1. Заходим в меню «Project > Options > Application»
  2. Выбираем платформу «All configurations – Android platform»
  3. Во вкладке «Artwork», прописываем пути до картинок с расширением «.9.png»
  4. Проверяем галочку «Include splash image», она должна быть установлена
  5. Собираем проект, в «Project Manager» выбираем «Android» и жмём «Build»
  6. Идём в меню «Project > Deployment», выбираем платформу «Debug configuration – Android platform»
  7. Снимаем галочку с файла «splash_image_def.xml»
  8. Далее есть два способа добавления/использования наших новых картинок
Способ №1.
Не забываем снять галочку с файла «splash_image_def.xml».
В «Deployment Manager» находим все наши картинки и меняем имя в столбце «Remote Name», с имени «splash_image.png» на «splash_image_def.9.png» для каждой картинки.
Всё, компилим проект и радуемся.
 
Способ №2.
Этот способ связан с созданием своего файла «splash_image_def.xml».
 
Не забываем снять галочку со стандартного файла «splash_image_def.xml».
Меняем имена картинок в столбце «Remote Name», с имени «splash_image.png» на «splash_image.9.png» для каждой картинки.
Создаём в любом текстовом редакторе (например: Notepad++) файл с именем «splash_image_def.xml» и содержанием:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/splash_image"
android:dither="true"/>
 
Сохраняем в папке с проектом.
Заходим в «Deployment Manager» и добавляем этот файл. В столбце «Remote Name» прописываем имя «splash_image_def.xml» и в столбце «Remote Path» прописываем путь «res\drawable\».
Всё, компилим проект и радуемся.


Update (16.10.14 17:03) Заставка на весь экран (без статус бара)
Выяснилось, что сплешскрин в Delphi XE7 сделан по способу, который я описывал для версии XE5. (XE5: Добавляем Splash Screen в приложение для Android)
Если вы хотите чтобы сплешскрин растягивался на весь экран, т.е. статус бар не было видно, то следующая инструкция для вас:
1) Создаём файл «styles.xml» и прописываем в нём
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowBackground">@drawable/splash_image_def</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>
Сохраняем в папке/подпапке с проектом.
2) Заходим в меню «Project > Deployment», снимаем галочку со стандартного файла «styles.xml».
3) Добавляем (деплоим) наш файл «styles.xml», в столбце «Remote Path» прописываем путь «res\values\»
4) Компилим наш проект и наслаждаемся заставкой на весь экран.


Итог: Теперь вы умеете создавать резиновые заставки.

Исходный код: Скачать с Google Drive
Копия второй утилиты: Скачать с Google Drive


Материал на английском языке:
http://docwiki.embarcadero.com/RADStudio/XE7/en/Application_Options#Splash_Images
 
Источник: https://delphifmandroid.blogspot.com/2014/10/splashscreen-xe7.html
P.S. Оказалось все гораздо проще.
Нужно просто заменить в файле splash_image_def.xml, который находится в Android64/Release строчку:
android:drawable="@android:color/black
на 
android:drawable="@android:color/white

Настройка EXIM4 для отправки почтовых сообщений в Linux

Что это такое?

Exim4 это агент пересылки почтовых сообщений, фактически является простым SMTP-сервером. В нашей статье мы рассмотрим пересылку через SMTP-сервера таких крупных компаний как Google и Yandex. Стоит отметить, что в нашей инструкции предполагается только отправка сообщений, например это удобно для отчетности о работе приложений или событиях.

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

Прежде всего обновите локальный список пакетов с помощью вашего пакетного менеджера, например на Ubuntu и Debian это можно сделать с помощью apt:

apt-get update

Для установки выполните команду:

apt-get install exim4

Примечание: если вам необходимо использовать ACL и другие расширенные функции, то установите exim4-daemon-heavy:

apt-get install exim4-daemon-heavy

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

dpkg-reconfigure exim4-config

Нажмите Ok для начала настройки.

На следующем шаге выберите “mail sent by smarthost; received via SMTP or fetchmail” и нажмите Ok.

Примечание:

  • internet site; mail is sent and received directly using SMTP — этот вариант подходит для автономной системы с полным доступом к Интернету. Демон Exim принимает сообщения на локальные домены и доставляет их. Исходящая почта будет доставлена непосредственно на почтовые серверы домена получателя.
  • mail sent by smarthost; received via SMTP or fetchmail — этот вариант подходит для автономной системы с ограниченным доступом к Интернету. Демон Exim принимает сообщения на локальные домены и доставляет их. Исходящая почта будет доставлена на Smart host, а уже потом на почтовые серверы домена получателя.
  • mail sent by smarthost; no local mail — этот вариант подходит для клиентской системы, все электронные письма отправляются на Smart host без каких-либо локальных доменов.
  • local delivery only; not on a network — этот вариант подходит для серверов не подключенных к сети Интернет. Сообщения принимаются и доставляются только для локальных доменов, т.е. отправка на удаленные (внешние) домены не поддерживается.

Здесь введите имя хоста или ваше доменное имя.

Нажмите Ok.

Введите адрес локальной петли, если exim будет использоваться только локальными сервисами. Оставьте поле пустым, для прослушивания всех интерфейсов, или перечислите нужные через символ “;”.

Следующее поле оставьте пустым при отсутствии локальных доменов.

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

 

 

Источник: https://1cloud.ru/help/linux/nastrojka-exim4

На следующем шаге укажите список доменов, для которых Exim будет ретранслировать сообщения, выполняя роль Smarthost`а. Если сервер не должен быть smarthost для другого хоста, оставьте этот список пустым.

Здесь укажите адрес используемого smtp-сервера:

smtp.yandex.ru::587
smtp.gmail.com::587
mail.example.com::587

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

Нажмите Ok.

В обычном режиме работы Exim выполняет поиск DNS при запуске, а также при получении или доставке сообщений. Этот параметр следует выбрать, если в системе используется Dial-on-Demand. Если сервер всегда имеет доступ к Интернету, этот параметр должен быть отключен.

Выберете место хранения почты: в каталоге /var/mail или в домашней директории для каждого пользователя.

На вопрос о разделении файла конфигурации на маленькие — ответьте Yes. Так будет более удобно конфигурировать exim4 далее.

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

vi /etc/exim4/passwd.client

Добавьте в него строку следующего вида, указав ваш логин и пароль.

Для Gmail

smtp.google.com:username@gmail.com:password

Для Yandex:

smtp.yandex.ru:username@yandex.ru:password

Для вашего SMTP-сервера:

mail.example.com:username@example.com:password

Содержимое файла будет выглядеть следующим образом:

# password file used when the local exim is authenticating to a remote
# host as a client.
#
# see exim4_passwd_client(5) for more documentation
#
# Example:
### target.mail.server.example:login:password
smtp.google.com:cloud@gmail.com:12345

Следующие настройки будут выполнены на примере почтового сервиса gmail.

Далее внесем изменения в файл /etc/exim4/exim4.conf.template. Откройте его на редактирование с помощью текстового редактора:

vi /etc/exim4/exim4.conf.template

Найдите строку со следующим содержимым:

.ifdef DCconfig_smarthost DCconfig_satellite

После нее вставьте следующие строки:

send_via_gmail:
driver = manualroute
domains = ! +local_domains
transport = gmail_smtp
route_list = * smtp.gmail.com

Найдите первую строку со следующим содержимым:

transport/30_exim4-config_remote_smtp_smarthost

После нее вставьте следующие строки:

gmail_smtp:
driver = smtp
port = 587
hosts_require_auth = $host_address
hosts_require_tls = $host_address

Найдите строку со следующим содержимым:

begin authenticators

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

gmail_login:
driver = plaintext
public_name = login
client_send = : user@gmail.com : password

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

login:
  driver = plaintext
  public_name = LOGIN
.ifndef AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS
  # Return empty string if not non-TLS AND looking up $host in passwd-file
  # yields a non-empty string; fail otherwise.
  client_send = "<; ${if and{\
                          {!eq{$tls_out_cipher}{}}\
                          {!eq{PASSWDLINE}{}}\
                         }\
                      {}fail}\
                 ; ${extract{1}{::}{PASSWDLINE}}\
                 ; ${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"
.endif

Сохраните изменения и закройте файл.

Чтобы изменения вступили в силу, перезагрузите почтовый сервис:

sudo /etc/init.d/exim4 restart

Чтобы проверить корректность настроек, отправляем тестовое письмо:

echo «Testing our Exim» | mail -s Test example@example.com

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

Исчточник: https://1cloud.ru/help/linux/nastrojka-exim4

 

Партнерка К2

Рекламируйте интернет-магазин программной продукции https://corp2.net и зарабатывайте 5% от заказов клиентами сайта, которые перешли в течении месяца по Вашей ссылке.

Наша продукция продаётся на самых топовых ресурсах Украины: Розетка, Hotline, F.ua, Prom, Zakupka, Allbiz, Allo и т.п. И если клиенты нашего сайта сделают заказ в течении месяца после того, как зашли по Вашей ссылке на наш сайт, то Вам начислится 5% стоимости сделанных и оплаченных клиентами заказов.

Много ли 5% ? Заказы бывают от 5 тыс. грн до миллиона. Таким образом, на одном заказе Вы можете потенциально зарабатывать 250 — 50000 грн.

Инструкция регистрации в партнерке

Заходите на сайт: https://corp2.net

Нажмите кнопку Регистрация.

Вводите регистрационные данные.



После этого, Вам на почту будет выслано подтверждение.
Авторизируетесь на сайте https://corp2.net.




Переходите в раздел Партнерская программа.




Вы увидите информацию о текущем балансе, а так же о ссылку, которую Вы можете вставить на любой рекламируемой странице. По данной ссылке будет определяться, партнер.

Добавив к любой странице сайта: ?promo_id=<ВашКод> вы получите Вашу персонифицированную ссылку рекламодателя.
Публикуйте подобные ссылки и зарабатывайте вместе с нами!

Запуск приложения в режиме «daemon» в Linux

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

Первый способ

Запустить в сессии программы screen, которая не завершается при выходе пользователя.

screen -d -m команда

использованные параметры:
-d -m — Запустить новый сеанс screen, но не подключаться к нему.

Так же можно использовать параметр:
-S имя — задать имя сессии screen для удобства поиска сессии по имени.

Пример:
screen -d -m -S backgroud_ping ping 127.0.0.1

1 screen -d -m -S backgroud_ping ping 127.0.0.1

Эта команда запустит пинг адреса 127.0.0.1 и присвоит сессии имя backgroud_ping.

Для возврата к приложению и получению управления нужно:

посмотреть список активный сессий screen: screen -ls

1 screen -ls

в выводе консоли мы увидим имя и PID процесса: There is a screen on: 1218.backgroud_ping (13.05.2016 15:43:34) (Detached) 1 Socket in /var/run/screen/S-root.

123 There is a screen on:        1218.backgroud_ping     (13.05.2016 15:43:34)   (Detached)1 Socket in /var/run/screen/S-root.

запущенная сессия будет иметь имя backgroud_ping, и в данном случае, PID будет 1218.

теперь остается подключиться к процессу screen, это делается командой: screen -r номер_PID

1 screen -r номер_PID

в нашем случае это будет: screen -r 1218

1 screen -r 1218

Мы получили обратно управление над приложением.

Второй способ

Использовать утилиту nohup, которая запустит приложение с игнорированием сигналов потери связи (SIGHUP), что позволит продолжить выполнение приложения после выхода пользователя из системы. nohup команда &

1 nohup команда &

вывод будет перенаправлен вместо консоли в файл nohup.out, который будет находиться в папке из которой производился запуск. Посмотреть вывод консоли можно командой: tail -f nohup.out

1 tail -f nohup.out

Пример: nohup ping 127.0.0.1 &

1 nohup ping 127.0.0.1 &

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

Третий способ

Использовать утилиту start-stop-daemon, которая создана для запуска в фоне приложений, которые сами не умеют переходить в фон. start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла

1 start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла

использованные параметры:
-S — запустить;
-b — запустить в фоне;
-x — полный путь и имя исполняемого файла;
-m — создать PID-файл с номером процесса;
-p — путь и имя PID-файла.
Если требуется запустить программу с параметрами, то параметры указываются в конце, после двойного тире (подробнее — в примере).

Пример: start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid — -I eth0 127.0.0.1

1 start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid — -I eth0 127.0.0.1

В данном примере мы запускаем утилиту ping с параметрами (-I eth0 127.0.0.1) и создаем PID-файл (/run/ping.pid).

Для остановки программы использутся другие параметры: start-stop-daemon -K -x путь_и_имя_исполняемого_файла

1 start-stop-daemon -K -x путь_и_имя_исполняемого_файла

или start-stop-daemon -K -p путь_и_имя_pid_файла

1 start-stop-daemon -K -p путь_и_имя_pid_файла

использованные параметры:
-K — остановить;
-x — найти по имени запущенной программы;
-p — найти по PID-файлу .

Пример: start-stop-daemon -K -p /run/ping.pid

1 start-stop-daemon -K -p /run/ping.pid

Находим номер процесса, записанный в файл /run/ping.pid и останавливаем его.

Более правильно всегда использовать PID-файлы, потому что имя запускаемой программы не всегда равно имени запущенного процесса.

Источник: https://blackdiver.net/it/linux/4164