Легко и непринуждённо: почта и Jabber для пользователей вашего сайта

    Допустим, вы развиваете какой-нибудь сайт в интернете. У вас есть постоянные пользователи, кто-то заходит к вам от случая к случаю. И вы конечно же ищете способы удержания аудитории на вашем сайте, придумывая всякие оригинальные функции и оттачивая до блеска интерфейс. Почему бы тогда не использовать имя вашего сайта в качестве экспортной монеты? Можно ведь предоставить вашим пользователям в качестве дополнительного бонуса почтовый адрес и соответствующий адрес Jabber в вашем домене.

    Конечно, я не предлагаю становится очередным провайдером почты. Это глупо, когда есть такие игроки, как gmail.com и yandex.ru. Кроме того, вы естественно можете использоваться услуги вышеупомянутых Google и Yandex для подключения своего домена к их сервисам. Но тогда вы не получите никакой интеграции с вашей базой пользователей и никакого контроля над доступной функциональностью.

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

    Начнём с описания того, как это будет работать. Если у вас есть сайт, на котором можно регистрироваться, значит у вас конечно же есть БД пользователей с логином, email адресом и паролем для каждого (если вы хоть чуточку цените своих пользователей, то вместо паролей у вас будут необратимые хеши, но для данной статьи это не важно). Кроме того, логины у всех пользователей конечно же различны. Тогда можно настроить почтовый сервер, который почту для user@yourdomain.com будет перенаправлять на основной ящик пользователя из профиля, а так же Jabber сервер, который будет авторизовывать по JID user@yourdomain.com через вашу БД. Таким образом пользователи вашего сайта получат почтовый и Jabber адрес в вашем домене, совмещённые с их профилем. При этом вы не будете предоставлять почтовый ящик, только адрес. Это очень удобно для конечного пользователя, поскольку ящик у него всегда где-то уже есть и обычно нету смысла заводить ещё один. А вот красивый адрес, которым можно похвастаться, никогда не помешает. Единственное, нужно обязательно предусмотреть возможность отключения данной функциональности через профиль пользователя. Иначе такую систему можно будет очень эффективно использовать для рассылки спама.

    Практическая сторона вопроса


    Перейдём от теории к практике. Для поднятия почтового и Jabber сервисов вам потребуется любой Linux-сервер, однако в данной статье описывается Ubuntu Server 10.04. Кроме того, все инструкции будут аналогичны и для более старых версий Ubuntu, а так же для Debain.

    В качестве почтового сервера имеет смысл использовать Postfix, как один из самых надёжных и при этом нетребовательных к ресурсам. В качестве XMPP (он же в просторечии Jabber) сервера — ejabberd. Эти два сервера практически никак не будут связаны между собой, так что начнём с настройки почты.

    Настройка почтовой системы


    Для установки Postfix в Ubuntu достаточно выполнить

    sudo apt-get install postfix

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

    После установки необходимо настроить Postfix так, чтобы при запросе доставки письма на адрес someuser@yourdomain.com, Postfix смотрел бы в вашу БД, узнавал бы, есть ли там искомый пользователь и активирован ли для него почтовый адрес, и, если всё в порядке, — на какой адрес перенаправить письмо. После чего Postifx должен принять письмо и перенаправить его на основной почтовый адрес указанного пользователя.

    Эту задачу можно решить встроенными средствами Postfix, однако заставлять почтовый сервер для каждого нового письма отправлять запрос в основную базу данных — это далеко не лучшая идея, поскольку это создаст лишнюю нагрузку на вашу БД пользователей, благо спама сейчас в интернете гуляет очень и очень много. Гораздо лучше пару раз в сутки выгружать нужную информацию из вашей основной БД в Postfix, благо вся эта информация — это таблица из двух полей: имя пользователя и его основной адрес почты.

    Для перенаправления почты в Postfix служат различные alias_maps. Поскольку описываемая система никак не привязана к системным пользователям сервера, то будем использовать механизм виртуальных доменов и параметр virtual_alias_maps для перенаправления почты на основные адреса пользователей. В этом параметре как раз надо указать таблицу соответствия адреса пользователя адресу, на который нужно перенаправить корреспонденцию. Эта таблица будет создаваться на основании содержимого вашей основной БД пользователей специальным скриптом, о котором чуть ниже.

    Пока же давайте окончательно разберёмся с необходимым опциями Postfix. Вся настройка Postfix осуществляется путём редактирования конфигурационного файла /etc/postfix/main.cf. Итак, для решения поставленной задачи, как я уже говорил, будет использоваться механизм виртуальных доменов, поскольку реальным пользователям почты на сервере не от куда взяться. Поэтому необходимо полностью отключить локальную доставку. Кроме того, пользователи не должны иметь никакого доступа к вашему SMTP серверу, поэтому стоит отключить авторизацию и SSL шифрование.

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

    # See /usr/share/postfix/main.cf.dist for a commented, more complete version
     
    ########################################################
    ## Основные параметры
     
    smtpd_banner = $myhostname ESMTP server
    biff = no
     
    # Максимальный размер письма. По умолчанию всего 10Mb
    message_size_limit = 204800000
     
    # Основные параметры хоста
    myhostname = mail.yourdomain.com
    myorigin = $mydomain
    mynetworks =
     127.0.0.0/8
     
    mailbox_size_limit = 0
    virtual_mailbox_limit = 0
    recipient_delimiter = +
    inet_interfaces = all
    inet_protocols = ipv4 
    append_dot_mydomain = no
    readme_directory = no
     
    ##########################################################
    ## Настройки адресов и доставки
     
    # Используем только виртуальных пользователей, поэтому всё локальное отключаем
    mydestination =
    local_recipient_maps =
    relay_domains =
    relay_recipient_maps =
    transport_maps =
     
    # Настройки виртуальных ящиков
    virtual_mailbox_domains =
     $mydomain
    # Локальных пользователей нет (если нужны - нужно ставить Dovecot)
    # Однако карта обязательно должна существовать (пусть и пустая)
    virtual_mailbox_maps =
     hash:/etc/postfix/mailboxes/local-mailboxes
    # Собственно карты перенаправлений
    virtual_alias_maps =
     hash:/etc/postfix/mailboxes/db-aliases
     hash:/etc/postfix/mailboxes/local-aliases
    # Параметры локальной доставки. Если она нужна, то надо ставить Dovecot
    virtual_mailbox_base = /var/mail
    virtual_uid_maps = static:900
    virtual_gid_maps = static:900
     
    ###########################################################
    ## Авторизация и шифрование - отключены
     
    # SASL авторизация отключена
    smtpd_sasl_auth_enable = no
     
    # TLS отключён
    smtpd_use_tls = no
     
    ###########################################################
    ## Ограничения и запреты
     
    # Запретить ETRN команду
    smtpd_etrn_restrictions = reject
     
    # Запретить VRFY команду
    disable_vrfy_command = yes
     
    # Требовать наличие EHLO (HELO) команды
    smtpd_helo_required = yes
     
    # Всегда отклонять письма для всех неизвестных ящиков
    smtpd_reject_unlisted_recipient = yes
     
    # Ограничения на клиента - принимаем только если есть PTR (не жёсткий запрет)
    smtpd_client_restrictions =
     permit_mynetworks
     reject_unknown_reverse_client_hostname
     permit
     
    # Ограничения на HELO. Отклоняем письма от всех хостов, которые даже представиться не могут
    smtpd_helo_restrictions =
     permit_mynetworks
     reject_invalid_helo_hostname
     reject_non_fqdn_helo_hostname
     reject_unknown_helo_hostname
     permit
     
    # Ограничения на MAIL FROM. Отклоняем все письма, отправитель которых предоставил невалидный адрес
    smtpd_sender_restrictions =
     reject_non_fqdn_sender
     reject_unknown_sender_domain
     permit
     
    # Ограничения на RCPT TO. Принимаем только для известных нам адресов
    smtpd_recipient_restrictions =
     reject_non_fqdn_recipient
     reject_unlisted_recipient
     permit_mynetworks
     reject_unauth_destination
     permit
     
    # Ограничения на данные. Не принимаем в случае некорректной передачи
    smtpd_data_restrictions =
     reject_unauth_pipelining

    Подробней про настройку и различные опции Postfix можно почитать в интернете, для нашей же задачи важны три момента:
    1. Не стоит ставить слишком жёсткие ограничения с целью фильтрации спама. Оставьте эту прерогативу почтовым серверам, которые используют ваши пользователи. Ваша задача — просто переслать почту и отсеять только то, что спамом является 100%. Подробнее про правильную настройку Postfix с целью минимизации потока спама можно почитать в одной из моих прошлых статей. Обратите внимание, для нормальной пересылки вам надо не забыть корректно настроить DNS записи для вашего сервера, об этом также можно почитать в статье по ссылке.
    2. Обязательно укажите пустую карту локальных пользователей в параметре virtual_mailbox_maps, иначе Postfix будет принимать почту для всех адресов в вашем домене и выдавать кучу ошибок о невозможности доставки. В моём случае файл карты называется /etc/postfix/mailboxes/local-mailboxes. Это обычный пустой текстовый файл. После его создания необходимо выполнить команду

      sudo postmap /etc/postfix/mailboxes/local-mailboxes

      иначе Postfix не сможет работать с вашим файлом.
    3. Ну и наконец все правила перенаправления будут задаваться в двух файлах, указанных в параметре virtual_alias_maps. Один будет создаваться автоматически скриптом на основании содержимого вашей базы пользователей, а второй нужен для ручного создания дополнительных вспомогательных адресов. После редактирования файла дополнительных адресов не забудьте выполнить для него команду postmap. Подробней про использование псевдонимов для перенаправления почты в Postfix можно почитать в официальной документации.
    Теперь, собственно, сам скрипт, который создаёт карту псевдонимов на основе содержимого базы пользователей. Приведённый ниже скрипт предназначен для работы с БД движка SMF, вам потребуется модифицировать его под вашу БД:

    #!/usr/bin/perl
    
    # Скрипт выбирает из SMF пользователей из определённой группы,
    # и создаёт на основе выборки карты для postfix. Должен запускаться по
    # cron. Предположительно отсюда  /etc/cron.d/postfix-smf-sync 
    
    use 5.010;
    use DBI;
     
    #############################################################
     
    # Настройки базы данных (MySQL)
    $MYSQL_host = 'bd.yourdomain.com';
    $MYSQL_port = '3306';
    $MYSQL_user = 'postfix';
    $MYSQL_pass = 'PASSW0RD';
    $MYSQL_db = 'my_smf';
    
    # Параметры SMF - группа пользователей с доступом к почте и префикс таблиц
    $SMF_GID = '15';
    $SMF_prefix = 'smf_';
     
    # Обслуживаемый домен
    $domain = "yourdomain.com";
     
    # Файл псевдонимов
    $postfix_file = "/etc/postfix/mailboxes/db-aliases";
     
    #############################################################
     
    $dbh = DBI->connect("DBI:mysql:$MYSQL_db:$MYSQL_host:$MYSQL_port",$MYSQL_user,$MYSQL_pass) or die "Hey guys! We've got a big error here...\n";
     
    # Выполняем запрос
    my $sth = $dbh->prepare("SELECT memberName, realName, emailAddress
    	FROM ${SMF_prefix}members
    	WHERE (ID_GROUP = $SMF_GID OR FIND_IN_SET($SMF_GID, additionalGroups))") or die "Hey guys! We've got  big error here!\n";
    $sth->execute() or die "Hey guys! We've got a big error here...\n";
     
    # Открываем файл псевдонимов для Postfix
    open ALIASES, ">$postfix_file" or die "Can't open $postfix_file\n";
    
    say ALIASES <<INTRO;
    #################################################
    # Карта соответствия адресов yourdomain.com основным #
    # адресам пользователей.                        #
    #                                               #
    # Этот файл создаётся автоматически скриптом    #
    # /etc/postfix/scripts/postfix-sync.pl      #
    # на основе данных из БД SMF. Редактировать     #
    # вручную данный файл бесполезно.               #
    #################################################
    INTRO
    
    # Для проверки адреса на корректность:
    # разрешённые буквы 
    $w = '[a-zA-Z0-9]';
    # разрешённые символы-разделители:
    $s = '[._\-]';
    
    # Анализируем ответ
    while (my $row = $sth->fetchrow_hashref()) {
    	# Делаем lower case, но нужно это только для красоты
    	my $user = lc $row->{realName};
    	# Если имя пользователя содержит неразрешённые символы - пропускаем его
    	# Разрешены любые буквы, цифры и символы ".", "-" и "_"
    	next unless $user =~ /^($w+$s)*$w+$/;
    	# Убеждаемся, что пользователь подумал головой
    	my $email = lc $row->{emailAddress};
    	next if "$user\@$domain" eq $email;
    	# Пишем псевдоним в файл
    	say ALIASES "$user\@$domain\t$row->{emailAddress}";
    }
     
    # Закрываем файл псевдонимов и создаём хеш для postfix'а
    close ALIASES;
    `/usr/sbin/postmap hash:$postfix_file`;
    

    В результате работы скрипта будет создан файл псевдонимов /etc/postfix/mailboxes/db-aliases, в котором будут строчки вида

    someuser@yourdomain.com	usermail@anotherdomain.com

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

    Всё, что осталось сделать, это добавить запуск скрипта в планировщик, например, создать задание cron. Для этого создайте файл /etc/cron.d/postfix-sync с примерно следующим содержанием:

    # Synchronize Postfix with BD
    18 04 * * *      root    /etc/postfix/scripts/postfix-sync.pl
    

    Как видно, у меня скрипт запускает каждый день в 04:18.

    На этом настройка почтовой системы заканчивается.

    Настройка XMPP сервера


    В качестве XMPP сервера будем использовать ejabberd. Для начала его нужно поставить:

    sudo apt-get install ejabberd

    В интернете полно материалов по настройке ejabberd, нам же для интеграции с существующей БД пользователей всего лишь нужно сказать ejabberd использовать внешний механизм авторизации и написать модуль, реализующий авторизацию через нашу базу. Для использования внешней авторизации в конфигурационный файл ejabberd /etc/ejabberd/ejabberd.conf нужно записать всего лишь две строчки:

    {auth_method, external}.
    {extauth_program, "/etc/ejabberd/auth.pl"}.

    Ну и собственно сам модуль авторизации для всё той же БД SMF, который вам потребуется изменить под вашу базу:

    #!/usr/bin/perl
    
    use 5.010;
    use Digest::SHA1 qw(sha1_hex);
    use DBI;
    
    #############################################################
    
    # Настройки базы данных (MySQL)
    $MYSQL_host = 'bd.yourdomain.com';
    $MYSQL_port = '3306';
    $MYSQL_user = 'postfix';
    $MYSQL_pass = 'PASSW0RD';
    $MYSQL_db = 'my_smf';
    
    # Параметры SMF - группа пользователей с доступом к почте и префикс таблиц
    $SMF_GID = '15';
    $SMF_prefix = 'smf_';
    
    # Обслуживаемый домен
    $valid_domain = "yourdomain.com";
    
    #############################################################
    
    # Просто соединяемся с БД
    sub db_connect {
    	my $dbh = DBI->connect("DBI:mysql:$MYSQL_db:$MYSQL_host:$MYSQL_port",$MYSQL_user,$MYSQL_pass);
    	return $dbh;
    }
    
    $dbh = db_connect;
    
    # Это именно то, что вы видите. Бесконечный цикл, ага.
    while(1) {
    	# Получаем запрос от ejabberd
    	my $nread = sysread STDIN, my $buf, 2;
    	unless ($nread == 2) { exit }
    	my $len = unpack "n", $buf;
    	$nread = sysread STDIN, $buf, $len;
        
    	my ($op,$user,$domain,$passwd) = split /:/, $buf;
    
    	# Сложно сказать зачем, но фильтруем символы
    	$passwd =~ s/[\n\r]//g;
        
    	# Домен проверяет ejabberd, но на всякий случай
    	die "о_О" if $valid_domain ne $domain;
        
    	my $result = 0;
    	## Для идентичности поведения с почтовой системой:
    	# если имя пользователя содержит неразрешённые символы - пропускаем его
    	# Разрешены любые буквы, цифры и символы ".", "-" и "_"
    	if ($user =~ /^\w+[\w.\-_]*\w+$/) {
    		# Пытаемся восстановить соединение, если оно сброшено
    		unless ($dbh) { $dbh = db_connect }
    		# Подготавливаем запрос если соединение установлено. При неудаче - сбрасываем соединение
    		my $sth = $dbh->prepare("SELECT memberName, realName, passwd
    				FROM ${SMF_prefix}members
    				WHERE (ID_GROUP = $SMF_GID OR FIND_IN_SET($SMF_GID, additionalGroups)) AND realName = '$user'")
    			or $dbh = undef if $dbh;
    		# Выполняем запрос если соединение установлено. При неудаче - сбрасываем соединение
    		$sth->execute() or $dbh = undef if $dbh;
    	
    		# Если соединение не сброшено
    		if ($dbh) {
    			# Получаем количество найденных строк
    			my $num = $sth->rows();
    			# Получаем ответ если он состоит ровно из одной строки
    			my $row = $sth->fetchrow_hashref() if $num == 1;
    
    			# Проверяем пароль или пользователя
    			if ($op =~ /auth/i and $num == 1) {
    				my $epass = sha1_hex(lc($row->{memberName}) . $passwd);
    	   			$result = $epass eq $row->{passwd} ? 1 : 0;
    	   		} elsif ($op =~ /isuser/i and $num == 1) {
    	   			$result = exists $row->{memberName} ? 1 : 0;
    	   		}
    		}
    	} else {
    		$result = 0;
    	}
        
    	# Отправляем ответ для ejabberd
    	my $out = pack "nn", 2, $result;
    	syswrite STDOUT, $out;
    }
    

    Кроме этого стоит убрать из секции modules конфигурационного файла ejabberd модуль mod_register, поскольку зарегистрироваться на вашем Jabber сервере невозможно.

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

    В качестве резюме


    Предложенное техническое решение позволяет легко предоставить вашим пользователям почтовый и XMPP адреса в вашем домене, при этом от пользователя не требуется никакая дополнительная регистрация и запоминание никаких дополнительных паролей и логинов. Адрес включается и выключается в профиле пользователя одной галочкой (или ещё как-то, в зависимости от реализации).

    При этом пользователь получает полнофункциональный XMPP аккаунт со всеми дополнительными сервисами, которые вы только захотите ему предоставить. И почтовый адрес, который не привязан к какому-то конкретному физическому ящику. Кстати, обращаю внимание: отправлять почту с выданного адреса пользователь сможет без проблем, хоть и не через ваш SMTP сервер. Например, отправка от имени стороннего ящика реализована в Gmail, либо же можно использовать SMTP сервер провайдера.

    С технической стороны выгрузка адресов для Postfix из вашей основной базы сводит на нет опасность сбоя основного сайта из-за проблем с почтой. Проблем с XMPP также не должно возникнуть, поскольку по сути XMPP сервер практически не связан с другими службами. Модуль авторизации просто проверяет присланный по зашифрованному соединению (особенность XMPP) пароль через базу, ничего не изменяя и не добавляя. Так что через него что-то плохое сделать тоже не получится.

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

    Вот так, легко и непринуждённо, можно попытаться догнать и перегнать Вконтакте и Фейсбук. Описанная схема реально работает на нескольких сайтах достаточно продолжительное время. Любые комментарии, вопросы и предложения всячески приветствуются!

    Актуальная версия статьи


    Самая последняя и наиболее актуальная версия этой статьи, разбитая на две части — для почты и Jabber, находится на официальном русскоязычном Wiki-ресурсе документации по Ubuntu. Там вы можете свободно улучшать и дополнять выложенные справочные и обучающие материалы, а также добавлять свои собственные. Если вам есть, что рассказать другим пользователям Ubuntu, то огромная просьба — напишите или отредактируйте соответствующую статью на help.ubuntu.ru. Даже небольшими улучшениями и дополнениями вы поможете тысячам людей, а кто-то из них, в свою очередь, опишет что-нибудь полезное и интересное для вас.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 66

      –24
      Аналог этого мы уже видели в пиджине или я ошибаюсь?
        0
        при чём тут пиджин то вообще?
          +5
          Причём тут пиджин? Пиджин — это клиент, а тут описывается серверное решение интеграции SMTP и XMPP сервера с существующей базой пользователей.
            +6
            ШТО?
            +2
            >Тогда можно настроить почтовый сервер, который почту для user@yourdomain.com будет перенаправлять на основной ящик пользователя из профиля

            Спамеры скажут Вам большое спасибо.
              0
              Отправилось раньше времени.

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

              Нужно предусмотреть не возможность отключения, а возможность включения. Т.е. по дефолту должно быть выключено.
                +3
                Спамерами и не пахло, чесслово. Мой адрес доступен публично в 1000 мест — спама 0. Почему? Gmail же. В общем с точки зрения спама данная схема ничуть не хуже и не лучше обычных ящиков в домене. Но по дефолту да, должно быть выключено, именно это я и имел ввиду, о чём и написал в предпоследнем абзаце.
                  0
                  У Вас папка «Спам» всегда пустует что ли? Что-то слабо верится, особенно учитывая те моменты, когда Gmail помечает как «Спам» письма, совершенно не относящиеся к нему.
                    +2
                    Папка спам не будет пустовать в любом случае, так что это не аргумент. Я не испытываю никаких проблем со спамом — мне этого достаточно.
              +8
              Не, мне нравится. Легко и непринужденно — думал, о классно sudo apt-get install packages и все. Захожу в тему, а тут листинг конфигов на 3-4 экрана :)
                +1
                А Вы как хотели? Мышкой «Сделать мне почту», «Сдеть мне жабир», а настройки — телепатически? :)
                  0
                  <сарказм>Ubuntu, ОС для домохозяек :)</сарказм>
                    +27
                    Читайте в следующем номере «Космополитен»:
                    * Настройка ejabberd в три клика
                    * Postfix: так ли это страшно?
                    * Хозяйке на заметку: 10 полезных флагов GCC
                    * Всё, что вы хотели знать о /etc/init.d/, но стеснялись спросить
                    :)
                      +1
                      по-моему это должен быть Vogue
                        0
                        Нет, что Вы! Vogue — это журнал для гиков, а мы тут в основном о домохозяйках.
                          0
                          домохозяйка-гик… или гик-домохозяйка? ;)
                  +1
                  Но они же очень простые, эти конфиги. Автор прав.
                  0
                  Круто, ещё бы интеграцию ролей сделать, чтобы админов прям с сайта выдавать =)
                  Для друпалистов скрипт авторизации www.drupal.ru/files/drupal_auth.php.txt
                    0
                    Скрипт не мой, так что ответственность и вопросы по коду не задавайть
                    0
                    Google App + Gtalk? И почта, и XMPPб и еще немного плюшек.
                    Лично я бы посоветовал этот вариант. Так как транспортами можно пользоватся любыми сторонними и будет вам полный набор XMPP и почта на хорошем уровне. И самое главное это 24 часа доступности (не отключат в районе свет, не забудешь заплатить за интернет. не будешь бодаться с Дом.ру из-за того что Интернета нету)
                      +1
                      50 юзеров бесплатно, остальные по моему 50$ в год за пользователя.
                        0
                        Хотя да, согласен.
                          0
                          Не совсем верно. Можно запросить расширение, я так до 500 попросил — дали бесплатно.
                          За деньги — там другой уровень гарантий (аптайма к примеру)
                      +2
                      Для полного шоколада осталось стать OpenId-провайдером.
                        0
                        Oauth еще и свой стек вместо TCP/IP! :)
                        –1
                        Вы решительно неправы. Это глупо, когда есть такие игроки, как gmail.com и yandex.ru. Кроме того, вы естественно можете использоваться услуги вышеупомянутых Google и Yandex для подключения своего домена к их сервисам. И разумеется, вы получите всю нужную вам интеграцию с вашей базой пользователей и вполне достаточный контроль над доступной функциональностью.
                          +2
                          Вы решительно правы в случае, когда пользователей <= 50 и решительно неправы в противном случае :)
                            0
                            Хотя насчёт Янедкса не знаю. Но сильно подозреваю, что тоже есть лимит — пусть поправят меня те, кто в курсе.
                              +1
                              не в лимите дело, не в лимите…
                                0
                                А в чём?
                                  0
                                  ответил ниже.
                                0
                                1000.
                                  0
                                  На почте для доменов от Яндекса нет лимитов на количество почтовых ящиков. Изначально дается 1000 ящиков. Если нужно больше, достаточно написать в техподдержку.
                                +9
                                А мужики-то и не знали! Но:
                                а) почта на гугле и на яндексе — это отдельный ящик, накой мне и вообще кому-то ещё один почтовый ящик? Лично у меня их уже 12 штук, я даже пароли от всех не помню.
                                б) XMPP сервера и там и там — это недоразумение какое-то. На гугле даже vCard не поддерживается, muc'а тоже нигде нет и т.д. и т.п.
                                в) Базу паролей вы гуглу просто так отдадите? Ну вперёд.
                                г) Всё ынтырпрайзное у всех платно. И у гугла в том числе.
                                д) Вы вольны контролировать описанную систему как душе угодно. С гуглом и яндексом такое не покатит.
                                Мораль: каждой задаче — своё решение. Моё решение имеет широчайший круг применения и огромный простор для манёвров. Гугл и яндекс предоставляют фиксированные инструменты под конкретные задачи.
                                  –2
                                  а) А Jabber на Вашем домене — не отдельный адрес? Накой Вам вообще кому-то ещё один Jabber ID? Лично у меня их уже штук много, я даже пароли от всех не помню. Нет, конечно в случае Mail.Ru, Yahoo!, Hotmail и т.д., у пользователя может отсутствовать Jabber ID, но если оно так, то значит оно ему и не надо было.
                                  б) MUC есть на Яндекс, vCard тоже присутствует.
                                  в) А что, были случаи, когда пароли утекали у таких монстров, как Yandex и Google?
                                  г) У Яндекса нет платных сервисов
                                  д) Ваш метод прибавляет дополнительную нагрузку на сервер в плане использования Jabber сервера, при этом мало вероятности, что этим будет пользоваться ваша аудитория:
                                  «Похвастаться красивым адресом» — Кому оно надо? Это не номер ICQ, чтобы им хвастаться.
                                  «Jabber» — Кто хотел, тот давно воспользовался. Уже не первый год понятно, что пользователи скептически относятся к непопулярным сервисам, а многие из них даже не знаю что такое «Jabber», поскольку для них он QIP, Gtalk и Я.Онлайн.

                                  Спасибо за пост, Вы проделали много работы, особенно по написанию данной статьи, но всё вышеописанное не имеет никакой перспективы.
                                    +3
                                    а) У вас — да, у меня — тоже, но например JID с кучей сервисов на ubuntu.ru, несмотря на наличие большого количества других JID, мне пришёлся очень в тему. И при наличии некоего сообщества вокруг сайта обязательно найдутся люди, которые захотят адрес на домене сайта, тем более если настроите всякие транспорты и прочие плюшки.
                                    б) Muc? Скажите, как создать комнату?
                                    в) нет конечно. Просто скорее всего нифига у вас не получится синхронизировать пароли из вашей БД с гуглом. Короче — лишние трудности, лишнее звено в цепи безопасности, которое можно выбить, и т.д.
                                    г) Чудно, и что дальше?
                                    д) не будет пользоваться — не будет и нагрузки.

                                    Вообще вы судите с своей колокольни, совершенно не учитывая желания обычных пользователей. При правильной подаче личная почта и личный JID будет очень хорошей плюшкой пусть и далеко не для всех, но для многих посетителей сайта, причём скорее всего для активных посетителей, которые ценнее всего. Даже для меня, например, на ubuntu.ru это было очень хорошей плюшкой по разным причинам.
                                      0
                                      а) У Вас сайт такой тематики, что многие его пользователи уже знаю про существование Jabber, поэтому Ваш метод мало кому будет необходим.
                                      б) Как обычно — пишете название несуществующей комнаты и всё. Создавать комнаты с аккаунтов на другом сервере нельзя.
                                      в) Вы зацикливаетесь на Google. С Яндекс проблем не возникнет.
                                      г) Ничего, просто Ваше высказывание не является верным и дезинформирует читателей.
                                      д) Естественно, но надо ли тогда этим заниматься?

                                      Вообще я сужу с колокольни обычного пользователя и имея таковых среди своих знакомых в количестве 99%, да что там, даже 1% гиков не станет менять привычное себе на что-то иное.
                                      «Даже для меня на ubuntu.ru» — Почему даже? Чем Вы отличаетесь от других? Ах да, Вы же интересуетесь всем этим, живёте им. Представьте себе, что далеко не все активные пользователи Яндекс пользуются Я.Онлайн и это можно отнести ко всем сервисам, которые используют XMPP — Google, LiveJournal и т.д.
                                        0
                                        Конечно, на сайт юных мам-любителей кошек, ставить такую систему абсолютно бесполезно. В остальном всё зависит от того, чего вы хотите добиться. Я всего лишь показал, как можно использовать самый классический способ интернет-связи — почту, и самый мощный и удобный IM протокол — XMPP, в контексте собственного сайта. А дальше уже простор для творчества не ограничен. Передо мной описанная задача встала однажды, я решил её описанным способом. Уверен, что многие, если им предложить такую схему, с радостью её реализуют и будут пиарить как «фишку» своего местячкового форума натуралистов, благо с технической стороны всё элементарно и прозрачно. вам не надо — надо другим, что не так-то? Или лучше сидеть на заднице и пользоваться только тем, что вам в рот на ложечке кладут
                                          0
                                          С удовольствием посмотрю на ресурсы, где это применят.
                                          Дело не в том, что мне не надо, оно вообще по сути мало кому нужно — это видно по сегодняшней ситуации. Даже пользователи платных аккаунтов ЖЖ пропускают мимо такие пункты, как переадресация почты и Jabber, при этом последний присутствует на любом типе аккаунтов. Я уже молчу про те проекты, где почта является одним из основных сервисов.
                                          По мне стоит сидеть на заднице и создавать новые удобные сервисы, а не использовать костыли.
                                            0
                                            Это не костыль — это тривиальная плюшка. Где это лично я применяю, я уже написал — на ubuntu.ru. При выборе решения для создания почты и XMPP в домене @ubuntu.ru описанный способ оказался самым оптимальным, хотя изначально был гугловский акк. Работает всё как часики, я с момента запуска ни одной проблемы не словил. На любом форуме с активной аудиторией такая штука может оказаться весьма кстати. Вообще мне нравится логика, прям как про линукс: пользуются только 1% — значит система отстой и никому не нужна. Я на ЖЖ ни разу не видел упоминания о том, что там доступен, оказывается, XMPP. Равно как и вконтакте и т.д. и т.п. Никто это не рекламирует. А зря. Опять же — всё это словоблудие. Вам не нужно, мне — нужно. Кстати, я применяю подобные схемы достаточно давно в рамках организаций, правда, уже с коннектом к AD или другой внутренней базе. Не вижу ничего плохого в описанной системе, развёртывается она за 20 минут, ресурсов практически не требует — так почему бы и нет?
                                              0
                                              Я уже сказал — любопытно посмотреть на сервисы, которые воспользуются данным методом, а потом сделать вывод, кому же оно нужно.
                                                0
                                                Сходу приходит идея, что это было бы удобно для MMOG. Общаться в игровых чатах из любимого мультипротокольного (или чисто XMPP)IM агента, не заходя в игру. Для совсем уж «домохозяйнутых» — веб интерфейс как обычный чат. Ну и систему личных сообщений также можно прикрутить.
                                    0
                                    в) Если вы храните почту не у себя на сервере, а настроили перенаправление на другие ящики, то, очевидно, вы уже слили пароли от этих ящиков Яндексу, Гуглу, mail.ru или кому-то еще (в зависимости от того, где хранится у вас почта).
                                      0
                                      С чего бы вдруг? От моих ящиков в принципе нет паролей, так что и сливать-то нечего)) Очень удобно и главное максимально безопасно.
                                        0
                                        Это только в том случае, если ваши ящики и письма хранятся на вашем собственном сервере.
                                          0
                                          Да вы что! А если вникнуть в схему? Паролей от почты в такой системе нет в принципе, они не хранятся нигде и ни у кого.
                                            0
                                            Простите, невнимательно прочитал :)
                                            Но в таком случае, вы можете настроить ровно то же на Яндекс.Почте для доменов, просто создав для каждого ящика вида somebox@yourdomain.ru переадресацию на соответствующий ящик пользователя. Таким образом, ни вы ни ваши пользователи никому не доверяете свои пароли, и ваши пользователи получают красивый алиас для своего обычного ящика.
                                            Кстати, пару копеек насчет синхронизации паролей: в Яндекс.Почта для доменов можно синхронизировать пароли от почты с паролями в вашей пользовательской базе, там есть для этого соответствующее API.
                                              0
                                              Я знаю. Только, вот, к примеру, возьмём стандартный движок форума SMF. Он хранит пароли, как и любой уважающий себя движок, в виде необратимой хеш-функции хитрого вида. Синхронизировать с Яндексом в итоге просто нечего. Проще говоря — если делать сайт с 0, то можно сразу заложиться на интеграцию с тем же яндексом. Если же прикручивать что-то к существующей инфраструктуре, то нормально вписаться в яндекс и куда-либо ещё всё равно не получится, и тогда приведённое простейшее решение окажется вполне себе отличным выходом из положения.
                                                0
                                                Но есть ньюансы. Во-первых, Яндекс.Почта для доменов принимает зашифрованные в md5-пароли через API. Для большинства движков это подходит. Хотя, конечно, кто-то использует md5 с солью или более хитрые алгоритмы. Во-вторых, вариант с переадресацией из моего предыдущего сообщения выглядит функционально одинаково с тем, что предлагаете вы. Кстати, переадресации тоже можно установить через API.
                                                  0
                                                  Переадресация не позволит подключить нормально XMPP. И вообще непонятно зачем заморачиваться с яндексом ради переадресации, если честно. В общем Яндекс — это очень вкусная плюшка, но далеко не всегда подходящая под цели и задачи.
                                  +2
                                  я вот только не понял, зачем нужен скрипт для переливания ро крону из mysql в файл, если можно научить postfix лазить за картой непосредственно в базу mysql.

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

                                  так и синхронность между форумом/постфиксом будет гораздо выше, и переливать постоянно базу, если она большая, не придется.
                                    +1
                                    Я написал зачем. Чтобы не нагружать сервер базы данных. Postfix легко справится с ООчень большим потоком писем, но вот если он каждое письмо будет проверять по MySQL базе… В общем, стандартные карты Postfix для этого подходят лучше. Либо отдельный БД сервер с синхронизацией с основным, но это ИМХО слишком жирно)
                                      0
                                      ясно. видимо я не внимательно читал, хотя ответ на этот вопрос пытался найти в тексте дважды. после того как вы обозначили наличие ответа в статье я нашел его с первой попытки :")

                                      хотя вопрос выигрыша в производительности остается спорным. триггер на вставку дублирующий необходимые данные в отдельную таблицу и выборка из нее мне не кажется существенным оверхедом. примерно того же можно достичь правильным раскидыванием индексов и вьюшкой, да и просто грамотно написанный запрос не должен создавать существенных нагрузок даже по таблице с over 9000 (скажем 1M) юзеров. а вот производительность работы с файловыми *_maps при количестве от 100K мне уже кажется сомнительной.

                                      если у вас есть результаты каких либо тестов, отталкиваясь от которых вы приняли решение использовать файловые мапы был бы очень признателен за возможность с ними познакомиться.
                                        0
                                        Я толком не тестировал, видел лишь, что запросы напрямую к БД (а запросы-то идут простейшим SELECT из одной таблицы) таки увеличивают нагрузку на сервер, которая и так далеко у меня была не маленькой. Поэтому и вынес с основного БД сервера. Файловые карты же постфикса проблем не создавали — работают шустро и ничего ни разу не подвешивали. Если делать почтовый сервер с очень большой нагрузкой, то надо конечно вопрос всесторонне оттестировать, скорее всего будет выгодней использовать дополнительный БД сервер, например, который по дефолту является зеркалом для основного. Но на основной выносить — ИМХО не стоит.
                                    +3
                                    Когда наткнулся на код в Перле, пошел перечитывать заголовок поста, вдруг «легко и непринужденно» мне привиделись :)
                                      0
                                      Ну а что? Самый простой язык для решения поставленных задач. Лаконично и даже читабельно. Или мне на баше переписать, чтоб вообще не понятно непосвящённым было, что к чему?)
                                        +1
                                        В идеале «легко и непринужденно» — это без написания скриптов вообще ;)
                                          –1
                                          Ну да, а конфигурацию вашей БД, способ хранения паролей и т.д. система должна телепатически получать?) Скрипты нужно только немного подправить — поменять запрос к БД да параметры подключения. Я ж с 0 не предлагаю писать ;)
                                            +1
                                            Я где-то говорил, что конфигурировать не надо? ;)

                                            Необходимость настраивать базы данных и синхронизацию вручную между системами посредством скриптов — это не «легко и непринужденно» ;)

                                            имхо
                                              0
                                              Когда есть готовые скрипты — то чего сложного-то?))
                                                0
                                                Часто готовые скрипты — те же троянские кони ;)

                                                Тут, в приницпе, скрипты понятные (хотя их и надо приводить в соответствие с текущей базой и т.п.)

                                                Хоцца, чтобы была одна кнопочка «сделать хорошо» :)
                                                  0
                                                  Мне тоже хоцца! Дайте мне кнопочку!!))) Я правда тогда работы лишусь, ну да и ладно, ради такого дела не жалко.
                                                    0
                                                    Специальисты по нажатию кнопочек всегда будут востребованы :) Надо же грамотный ТЗ подвести под это «хорошо» :))
                                      +1
                                      Ваш /etc/cron.d/postfix-sync слишком похож на костиль. Постфикс умеет же самостоятельно с mysql работать.
                                      www.postfix.org/MYSQL_README.html
                                        +1
                                        Ну ё моё! Я ж написал зачем такой костыль — чтобы не грузить базу. Прекрасно знаю, что постфикс умеет работать с MySQL.
                                        0
                                        а можно статейку как добавить во все это еще и voip? a

                                        Only users with full accounts can post comments. Log in, please.