PDA

Zobacz pełną wersję : Joomla jako portal skrzynek pocztowych



rkubera
03-08-2006, 23:05
Chciałbym ogłosić (może troszkę pochwalić), że da się zintegrować joomlę ze skrzynkami pocztowymi tak, jak robią to duże portale.


Chcę zaznaczyć, że opis ten jest moim zdaniem trudny i raczej ma pokazać problemy pojawiające się podczas integracji niż stanowić kompletny opis tego typu rozwiązań. Podobne rozwiązania można znaleźć w wielu miejscach sieci, ja skupię się raczej na tym, co jest specyficzne dla naszego rozwiązania. Każdy system jest specyficzny i poniższe pliki konfiguracyjne mają jedynie wskazać drogę, a nie mogą być kopiowane 1:1 do Waszych systemów.

Aby przystąpić do tego co tu jest napisane, trzeba mieć uprawnienia admina na serwerze ( nie stronie) oraz wiedzę z administracji systemami linux (BSD). Moja instalacja została przeprowadzona na systemie debian, ale to w zasadzie nie ma większego znaczenia.
Wspomnę tylko, że należy każdą z paczek ściągnąć w najnowszej wersji z oficjalnych stron projektu, skompilować i zainstalować, nie używać do tego funkcji apt-get czy podobnych, ponieważ w przypadku np. debiana, pakiety w dystrybucji były za stare.

Jakie paczki będą nam zatem potrzebne:
- postfix+sasl
- pam mysql
- dovecot

Jak opisy wstępne opisujące tę tematykę mogę polecić:
http://linux.zsp2.edu.pl/

Więc zaczynamy.
Założenia:
Chcemy uruchomić system mailowy, do którego można dostać się przy pomocy klienta pop3/smtp lub IMAP z zewnątrz tak, aby hasło i użytkownik był taki sam jak w portalu. Zmiana hasła w portalu powoduje zmianę hałsa w skrzynce pocztowej. Dodatkowo założenie nowego użytkownika w portalu ma się wiązać z automatycznym założeniem mu skrzynki pocztowej.

Ja zdecydowałem się na rozwiązanie typu:
- serwer pocztowy postfix z autentykacją sasl
- serwer imap/pop3 na serwerze dovecot

Założenia dodatkowe:
Baza kont znajduje się w serwerze MYSQL w bazie joomla. I tu dochodzimy do najważniejszego problemu przy integracji. Otóż wszystkie tego typu systemy zakładają, że hasła użytkowników w systemie przechowywane są w postaci jawnej lub w postaci CRAMD MD5 lub DIGEST MD5. No i tu leży właśnie problem. Baza MYSQL wraz z joomla trzyma hasła w postaci MD5, jednak jest to prezentacja HEX MD5 a nie CRAMD czy DIGEST, które są zanane ogólnie jako bin MD5. Niestety – HEX MD5 i BIN MD5 mają inną prezentację.

Zatem większość rozwiązań opartych o podobnie systemy nie zadziała – ze względu na to, że po prostu system nie zautentykuje użytkownika ze względu na różnicę prezentacji haseł w postaci MD5. W ten sposób dział np. Postfix+sasl w standardowej konfiguracji z MYSQL, czy bardzo popularny i dobry serwer imap/pop3 COURIER.
Jak zatem wybrnąć z tej sytuacji?

Aby tego dokonać trzeba użyć pewnego obejścia – musimy do naszego rozwiązania dodać inny moduł autentykacji – PAM. Otóż w ostatnich wersjach PAM MYSQL umożliwia autentykację przy pomocy HEX MD5. Czyli nasze rozwiązanie ustawiamy w taki sposób, aby autentykował się przez PAM(mówimy tu głównie o sasl). Jako serwer imap/pop3 użyjemy dodatkowo najnowszej wersji serwera DOVECOT która umożliwia autentykację przy pomocy HEX MD5.

Zatem przedstawię tu pokrótce jak powinna wyglądać konfiguracja naszego środowiska.
NA początku do bazy mysql z joomla do tabeli jos_users dokładamy pole typu „mailbox” raz pole typu „domain”.
Pole mailbox ma przyjmować tylko dwie możliwe wartości – 1 gdy użytkownik ma mieć skrzynkę oraz 0 – gdy jej nie ma.
Jeżeli wartość domyślną ustawimy na 1 – wtedy każdy nowy użytkownik będzie miał zakładaną skrzynkę pocztową, gdy 0 – dopiero ręczna modyfikacja tego wpisu stworzy skrzynkę dla tego użytkownika. Domain – wartość domyślna powinna być taka, jak nazwa naszej domeny. Możemy ewentualnie wpisać tu nazwę innej wirtualnej domeny obsługującej nasz system. Ja ten przykład opisuję na podstawie domeny eturystyka.org (którą właśnie uruchomiłem), gdzie rozwiązanie to zostało wdrożone. Zapraszam na http://eturystyka.org gdzie po rejestracji każdy użytkownik dostaje 10 MB darmową skrzynkę pocztową.

Aby połączyć się z serwerem pop3/ smtp: należy podać dane w klienice:
Serwer POP3: etyrystyka.org
Serwer SMTP: turystyka.org

Użytkownik: <jak podczas rejestracji>
Hało: <jak podczas rejestracji>

Dodatkowo: serwer SMTP wymaga autentykacji, użytkownik i hasło takie same.
W przypadku połączenia po IMAP: serwer imap: eturystyka.org

No to do rzeczy:

Oto przykład tabeli:
CREATE TABLE `jos_users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL default '',
`username` varchar(25) NOT NULL default '',
`email` varchar(100) NOT NULL default '',
`password` varchar(100) NOT NULL default '',
`usertype` varchar(25) NOT NULL default '',
`block` tinyint(4) NOT NULL default '0',
`sendEmail` tinyint(4) default '0',
`gid` tinyint(3) unsigned NOT NULL default '1',
`registerDate` datetime NOT NULL default '0000-00-00 00:00:00',
`lastvisitDate` datetime NOT NULL default '0000-00-00 00:00:00',
`activation` varchar(100) NOT NULL default '',
`params` text NOT NULL,
`mailbox` int(11) NOT NULL default '1',
`domain` varchar(20) NOT NULL default 'eturystyka.org',
PRIMARY KEY (`id`),
KEY `usertype` (`usertype`),
KEY `idx_name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=84 ;

Czyli nasze rozwiązanie będzie bazować na dwóch podastawowych polach: ów wspomnianym “mailbox” oraz polu “blocked” – ustawienie 1 ma też z automatu wyłaczać skrzynkę.

Pole domain jest potrzebne w przypadku, gdy chcemy obsługiwać kilka domen ( w mailu) przy pomocy jednego systemu pocztowego.

Oto moja konfiguracje POXSIX:
/etc/postfix/main.cf:

inet_interfaces = all
myhostname = eturystyka.org
mydestination = localhost
mynetworks = <tu Twoje adresy ip>
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
#receive_override_options = no_address_mappings
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/local/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 5d
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual-mailbox-limit-maps.cf
virtual_mailbox_limit = 51200000
# Override the message_size_limit setting
virtual_mailbox_limit_override = yes
# Follow Maildir++ specs
virtual_maildir_extended = yes
# Create the maildirsize file (Vital for Courier-IMAP)
virtual_create_maildirsize = yes
# Bounce rather than defer when over quota
virtual_overquota_bounce = yes
# mailbox_transport = virtual
header_checks = regexp:/etc/postfix/header_checks
message_size_limit=5000000

Oto dodatkowe pliki konfiguracyjne:
/etc/postfix/mysql-virtual_domains.cf:
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_postfix_domains
select_field = 'virtual'
where_field = domain
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_forwardings.cf
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_postfix_forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_mailboxes.cf:
user = <Twój użytkownik do bazy mysql>
password = <Twoje hasło do bazy mysql>
dbname = <Twoja baza joomla>
table = jos_users
select_field = CONCAT(LOWER(username),'/')
where_field = mailbox='1' and block='0' and CONCAT(username,'@',domain)
hosts = 127.0.0.1

rkubera
03-08-2006, 23:06
oto dodatkowe tabele jakie należy stworzyć w systemie:

CREATE TABLE `jos_postfix_domains` (
`domain` varchar(50) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin2;

--
-- Zrzut danych tabeli `jos_postfix_domains`
--

INSERT INTO `jos_postfix_domains` VALUES ('eturystyka.org');

-- --------------------------------------------------------

--
-- Struktura tabeli dla `jos_postfix_forwardings`
--

CREATE TABLE `jos_postfix_forwardings` (
`source` varchar(80) NOT NULL default '',
`destination` text NOT NULL,
PRIMARY KEY (`source`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;

Czyli w tableli jos_postfix_domains przechowywane są obługiwane domeny wirtualne, zaś w tabeli jos_postfix_forwardings dodatkowe alisy pocztowe.

Gdzie:
Source to adres mailowy z naszej puli, np. test@eturystyka.org (admin@eturystyka.org)
A destination to adresy docelowe np. test@aftyka.pl (admin@joomlapl.com)

Czyli nasze maile będą składowane w katalogu:
/home/vmail/%username% i będą w postaci maildir. Dodatkowo dokompilowałem do swojego postfixa kwoty i niektóre wpisy w main.cf mogą dotyczyć właśnie tych opcji. Opisywany przypadek nie uwzględnia kwot.

Więc mamy już obsługę skrzynek pocztowych. System pyta, czy istnieje użytkownik w systemie i potrafi do jego skrzynki pocztowej dostarczyć maila.

Super, to zadanie było w miarę proste, bowiem nigdzie jeszcze nie autentykujemy użytkowników, tylko sprawdzamy, czy istnieje ktoś taki w systemie i dostarczamy.

A teraz konfiguracja sasl:

/etc/postfix/sasl/smtp.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
log_level: 4

w ten sposób ustawiliśmy typ autentykacji sasl przez PAM MYSQL. Dzięki temu obejdziemy nasz pierwszy problem z HEX MD5. Aby to zadziałało musimy odpowiednio skonfigurować PAM MYSQL:

/etc/pam.d/smtp:
auth required pam_mysql.so user=<user> passwd=<password> db=<baza joomla> table=jos_users usercolumn=username passwdcolumn=password crypt=3 [where=mailbox=1 and block=0]
account sufficient pam_mysql.so user=<user> passwd=<password> host=localhost db=<baza joomla> table=jos_users usercolumn=username passwdcolumn=password crypt=3 [where=mailbox=1 and block=0]


Teraz przechodzimy do drugiego zagadnienia, czyli konfiguracji klienta IMAP/ POP3.

Taj jak napisałem, do tego nadaje się serwer Dovecot który chyba jako jedyny dziś obsługuje hasła w postaci HEX MD5.

Oto pliki konfiguracyjne do Dovecot:

Tworzymy plik w /etc/dovecot:

/etc/dovecot/dovecot-sql.conf
driver = mysql

connect = host=localhost dbname=<Twoja baza joomla> user=<Twój użytkownik do bazy> password=<Twoje hasło do bazy>

default_pass_scheme = PLAIN-MD5

password_query = SELECT password FROM jos_users WHERE username = '%u'

user_query = SELECT LOWER(username) AS home,'5000' AS uid, '5000' AS gid FROM jos_users WHERE username = '%u' and mailbox='1' and block='0'



I tu dwie uwagi – BAZA MYSQL NORMALNIE NIE ROZRÓŻNIA MAŁYCH I DUŻYCH LITER chyba że są to pola typu binary. Dlatego trzeba w pytaniu używać lower, inaczej, jak użytkownik zaloguje się do systemu jako np. Test a potem jako test, to system wpuści go do dwóch różnych skrzynek !!!!

Oto ostatni już z plików konfiguracyjnych:
W /etc/dovecot.conf
Musimy dodać wpisy:
passdb sql {
# Path for SQL configuration file, see doc/dovecot-sql.conf for example
args = /etc/dovecot/dovecot-sql.conf
}

W sekcji auth default.

I już !!!
Teraz podłączamy się klientem pocztowym do naszej strony i mamy zintegrowaną skrzynkę pocztową.

Kilka dodatkowych uwag. W moim rozwiązaniu na stronie http://eturystyka.org (http://eturystyka.org/) mam dodatkowo zintegrowanego klienta poczty przez WWW. Posłużyłem się w tym rozwiązaniu zmodyfikowanym klientem Mambo IMAP. Aby to rozwiązanie zadziałało mi prawidłowo, musiałem poza możliwością autentykacji opisanej powyżej dołożyć jeszcze jedną autentykację – plan, tak, aby autentykować użytkownika hasłem MD5 jako PLAIN TEXT. Jeżeli ktoś będzie zainteresowany, proszę o info na prv.

Tak jak napisałem, ten opis ma być tylko wskazówką jak to zrobić.
Niestety ze względu na moje ograniczenia czasowe nie jestem w stanie odpowiadać na wszystkie pytania, mogę raczej wyjaśniać same sprawy integracyjne.

Pozdrawiam.