Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> RoundCube

Roundcube в связке с PostgreSQL

Автор: AlkoGekS.


Решил внести свой скромный вклад, накатать статейку про roundcube. Вроде бы с установкой проблем быть не должно, по крайней мере я так думал, но все же с некоторыми я столкнулся, например  локализация. Но не все сразу, начнем по порядку.
По просьбам трудящихся: Roundcube - это веб интерфес для почты, полнофункциональный, немного напонимает Squirrel mail, но по моему мнению лучше :)
Ставить будем связку roundcube и postgresql, последний выбрал не случайно, хотелось посмотреть что это за зверь.
Итак, первым делом обновляем порты. Я использую portsnap:
Server# portsnap fetch update

Все, теперь переходим к установке postgresql. Я выбрал версию 8.2, 8.3 насколько я знаю еще не совсем стабильна.

Server# cd /usr/ports/databases/postgresql82-server/
Server# make install clean

Вылезает окошко, где я выбрал

                  Options for postgresql-server 8.2.5_2

          [X] NLS                    Use internationalized messages
          [ ] PAM                    Build with PAM support (server only)
          [ ] LDAP                   Build with LDAP authentication support
          [ ] MIT_KRB5               Build with MIT's kerberos support
          [ ] HEIMDAL_KRB5           Builds with Heimdal kerberos support
          [ ] OPTIMIZED_CFLAGS       Builds with compiler optimizations (-O3)
          [X] LIBC_R                 Link w/ libc_r, used by plpython (server)
          [ ] THREADSAFE             make libpq thread safe
          [X] TESTS                  Allows the use of a check target (server)
          [X] DEBUG                  Builds with debugging symbols
          [ ] HIER                   Builds with query hierarchy (server)
          [ ] INTDATE                Builds with 64-bit date/time type (server)

Вроде бы все, нажимаем на OK и устанавливаем.
После установки нужно запустить сервер и настроить, так как postgres на тот момент я не знал вообще, то пришлось ставить оболочку, аналог phpMyAdmin, только называется она phpPgAdmin

Server# cd /usr/ports/databases/phppgadmin/
Server# make install clean

После установки, добавляем следующие строчки в конек конфига апача /usr/local/etc/apache2/httpd.conf

Alias /postgres/ "/usr/local/www/phpPgAdmin/"

<Directory "/usr/local/www/phpPgAdmin/">
        Options none
        AllowOverride Limit
        Order Deny,Allow
        ## Тут можно разрешить коонект с опреденных ip адресах, в примеру
        # Allow from 192.168.0.111
        Allow from all
</Directory>

Итак, phpPgAdmin установлен и готов к работе. Вернемся к нашему postgres.
В /etc/rc.conf вносим следующие строчки:

postgresql_enable="YES"
postgresql_data="/var/db/pgsql/data"
postgresql_flags="-w -s -m fast"
postgresql_initdb_flags="--encoding=utf8 --lc-collate=C"
postgresql_class="default"

В /etc/login.conf тоже теребуется внести некоторые изменения

postgres:\
        :lang=ru_RU.UTF-8:\
        :setenv=LC_COLLATE=C:\
        :tc=default:

Вообще, по дефолту все базы и конфиги будут хранится в /usr/local/pgsql, но меня это не устроило. Поэтому следующие действия я предпринял чтоб изменить этот путь:

Server# mkdir /var/db/pgsql

Server# chown pgsql:pgsql /var/db/pgsql

Server# chmod 0700 /var/db/pgsql

Server# pw usermod pgsql -d /var/db/pgsql

Затем мы инициализируем базы данных и конфиги:

Server# /usr/local/etc/rc.d/postgresql initdb

Идем править конфиг самого postgres. Я изменил всего лишь одну строчку, чтобы можно было конектиться с phpPgAdmin. Итак в /var/db/pgsql/data/postgresql.conf правим строчи, на такие:

listen_addresses = '*' #“*” - коннект со всех хостов,
                       #“localhost” – с самого сервера.
......................................................
#autovacuum = on       # Необходимо закоментировать, у меня с этой строчкой
                       # roundcube вываливался с ошибкой.

Можно еще изменить методы аутентификации в файле /var/db/pgsql/pg_ident.conf, но я оставил все как есть.
Итак, конфиг поправили, можно и поадминить, заходим по адресу http://you_site/postgres/ , указываем в качестве логина и пароля pgsql.

Переходим к следующему этапу, ставим сам roundcube.

Server# cd /usr/ports/mail/roundcube/
Server# make install clean

После установки я изменил виртуал-хосты апача таким образом (веб-интерфейс почты будет досупен по адресу mail.myserv.net)

Server# cat /usr/local/etc/apache2/Includes/vhosts.conf
...................................
 <VirtualHost *:80>
        ServerAdmin     admin@myserv.net
        DocumentRoot    /usr/local/www/roundcube/
        ServerName      mail.myserv.net
</VirtualHost>
...................................
Server# 

В postgres создаем простого пользователя roundcube (ВАЖНО!!! Кодировку выбираем UTF-8) с паролем pass и базу roundcube.
Затем выполняем SQL запрос из примера (Все примеры для различных баз данных находятся в файликах по адресу /usr/local/www/roundcube/SQL)
Нас интересует файл /usr/local/www/roundcube/SQL/postgres.initial.sql
--
-- Sequence "user_ids"
-- Name: user_ids; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE user_ids
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
--
-- Table "users"
-- Name: users; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE users (
    user_id integer DEFAULT nextval('user_ids'::text) PRIMARY KEY,
    username character varying(128) DEFAULT ''::character varying NOT NULL,
    mail_host character varying(128) DEFAULT ''::character varying NOT NULL,
    alias character varying(128) DEFAULT ''::character varying NOT NULL,
    created timestamp with time zone DEFAULT now() NOT NULL,
    last_login timestamp with time zone DEFAULT now() NOT NULL,
    "language" character varying(5) DEFAULT 'en'::character varying NOT NULL,
    preferences text DEFAULT ''::text NOT NULL
);
--
-- Table "session"
-- Name: session; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE "session" (
    sess_id character varying(40) DEFAULT ''::character varying PRIMARY KEY,
    created timestamp with time zone DEFAULT now() NOT NULL,
    changed timestamp with time zone DEFAULT now() NOT NULL,
    ip character varying(16) NOT NULL,
    vars text NOT NULL
);
--
-- Sequence "identity_ids"
-- Name: identity_ids; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE identity_ids
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
--
-- Table "identities"
-- Name: identities; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE identities (
    identity_id integer DEFAULT nextval('identity_ids'::text) PRIMARY KEY,
    user_id integer NOT NULL REFERENCES users (user_id),
    del integer DEFAULT 0 NOT NULL,
    standard integer DEFAULT 0 NOT NULL,
    name character varying(128) NOT NULL,
    organization character varying(128),
    email character varying(128) NOT NULL,
    "reply-to" character varying(128),
    bcc character varying(128),
    signature text,
    html_signature integer DEFAULT 0 NOT NULL
);
--
-- Sequence "contact_ids"
-- Name: contact_ids; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE contact_ids
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
--
-- Table "contacts"
-- Name: contacts; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE contacts (
    contact_id integer DEFAULT nextval('contact_ids'::text) PRIMARY KEY,
    user_id integer NOT NULL REFERENCES users (user_id),
    changed timestamp with time zone DEFAULT now() NOT NULL,
    del integer DEFAULT 0 NOT NULL,
    name character varying(128) DEFAULT ''::character varying NOT NULL,
    email character varying(128) DEFAULT ''::character varying NOT NULL,
    firstname character varying(128) DEFAULT ''::character varying NOT NULL,
    surname character varying(128) DEFAULT ''::character varying NOT NULL,
    vcard text
);
--
-- Sequence "cache_ids"
-- Name: cache_ids; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE cache_ids
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
--
-- Table "cache"
-- Name: cache; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE "cache" (
    cache_id integer DEFAULT nextval('cache_ids'::text) PRIMARY KEY,
    user_id integer NOT NULL REFERENCES users (user_id),
    session_id character varying(40) REFERENCES "session" (sess_id),
    cache_key character varying(128) DEFAULT ''::character varying NOT NULL,
    created timestamp with time zone DEFAULT now() NOT NULL,
    data text NOT NULL
);
--
-- Sequence "message_ids"
-- Name: message_ids; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE message_ids
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
--
-- Table "messages"
-- Name: messages; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE "messages" (
    message_id integer DEFAULT nextval('message_ids'::text) PRIMARY KEY,
    user_id integer NOT NULL REFERENCES users (user_id),
    del integer DEFAULT 0 NOT NULL,
    cache_key character varying(128) DEFAULT ''::character varying NOT NULL,
    created timestamp with time zone DEFAULT now() NOT NULL,
    idx integer DEFAULT 0 NOT NULL,
    uid integer DEFAULT 0 NOT NULL,
    subject character varying(128) DEFAULT ''::character varying NOT NULL,
    "from" character varying(128) DEFAULT ''::character varying NOT NULL,
    "to" character varying(128) DEFAULT ''::character varying NOT NULL,
    cc character varying(128) DEFAULT ''::character varying NOT NULL,
    date timestamp with time zone NOT NULL,
    size integer DEFAULT 0 NOT NULL,
    headers text NOT NULL,
    structure text
);
ALTER TABLE "messages" ADD UNIQUE (user_id, cache_key, uid);

После чего идем редактировать конфиги.
В /usr/local/www/rouncube/configs/db.inc.php добавляем информацию о postgres по примеру:

$rcmail_config['db_dsnw'] = 'pgsql://roundcube:pass@localhost/roundcube';

Остальное я не трогал.

В /usr/local/www/rouncube/configs/main.inc.php меняем следующие строчки:

$rcmail_config['default_host'] = 'хост';
$rcmail_config['mail_domain'] = 'почтовый_домен';
$rcmail_config['smtp_user'] = '%u';
$rcmail_config['smtp_pass'] = '%p';
$rcmail_config['smtp_auth_type'] = 'PLAIN';
$rcmail_config['locale_string'] = 'ru'; #русская локализация

На данном шаге, у меня был полностью русифицированный Roundcube, без всяких проблем с кодировками!
Почта приходит и отправляется великолепно, русские шрифты отображаются хорошо - русские папки создаются, контакты тоже. Пользуйтесь :)
Вот так оно выглядит




размещено: 2007-11-02,
последнее обновление: 2007-11-02,
автор: AlkoGekS


Morty, 2007-11-02 в 12:11:06

Тоже самое делал только на базе MySql
одним словом приятный проэкт

freeman_tnu, 2007-11-02 в 13:37:57

Не обязательно куб ставить из портов, достаточно скачать последнюю русскую сборку от команды http://roundcube.ru/ , где, цитирую "Исправлено большое количество багов и добавлено много усовершенствований", в частности нормально работает проверка орфографии через GoogleSpell. Если уж поставили из портов, в том релизе есть инструкция по обновлению. Инструкции по установке и обновлению на русском языке.

Kolesya, 2007-11-02 в 14:16:17

to freeman_tnu
почти соглашусь, только пара моментов:
 ставиш из портов - обновляеш из портов
 а если сервак не один, а штук 7. как предлагаешь поддерживать все в "чистоте"

to AlkoGekS
молодец, так держать :)

xxx, 2007-11-02 в 14:55:42

"Итак, первым белом обновляем порты."
s/белом/делом/g

Статья в целом хороша, но было бы неплохо вначале написать хотя бы пару строк о чём идёт речь. Только дочитав до конца понял что такое roundcube. =)

AlkoGekS, 2007-11-02 в 15:18:18

Поправил :) Стаья писалась на работе, а тут отвлекают все таки... вот и грамматические ошибки :)

Timer, 2007-11-20 в 16:19:33

Народ, кто скажет почему он письма отправляет от локального пользователя www???  а не от пользователя на чьё имя заведен ящик...

AlkoGekS, 2007-11-22 в 10:48:50

Это уже в настройках почтовика смотри.

AlkoGekS, 2007-11-22 в 12:16:32

Только что проверил. Отправляет действительно от юзера www, но при получении видно нормальное имя отправителя. Так что все нормально.

Timer, 2007-12-01 в 22:39:40

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

BigHarry, 2008-02-12 в 23:29:59

Если в /etc/rc.conf
postgresql_class="default"
то в /etc/login.conf прописывать это:
-------------------------------------
postgres:\
       :lang=ru_RU.UTF-8:\
       :setenv=LC_COLLATE=C:\
       :tc=default:
-------------------------------------
бессмысленно !!!!

Raven2000, 2008-02-19 в 10:56:09

to AlkoGekS
Немного вопросов можно :)
1) Назвние Roundcube в связке с PostgreSQL.
может лучше просто Roundcube тк ему все равно на чем работать. Хотелось бы убрать
postgresql82-server, phppmyadmin.
2) Расскажи лучше как из портов ставится, какие переменные можно выбрать. Есть пару интерестных.
3) Окучил бы /usr/local/www/roundcube/SQL там как раз про базы. Все в одном месте и удобно расказывать.
4) > На данном шаге, у меня был полностью русифицированный Roundcube,
Покажи что можно и в почтовом ящике русифицировать.
5) Как подключить проверку русского яз. если ставигь из портов?
6) А скины есть какие? см. mvision
и как подключать.
7) И желательно дать список литературы на сайты производители, и ссылку на шоты его (что бы эта страница шустрее грузилас)
Вроде все ну и немного описать про куб.

Статья хорошая, но можно довести до суперской :)
P.S. Это не критика, а попытка поднять статью еще на более качественный уровень и тебе будет интересно и народу супер. :))) Если что извиняйте и нижайшее вам с кисточкой.

Serjnyak, 2008-02-19 в 11:42:22

Чтобы RoundCube не слал почту от пользователя WWW, в

/usr/local/www/roundcube/config/main.inc.php

находим
$rcmail_config['smtp_server'] = '';
и пишем туда адрес вашего SMTP сервера.

ash, 2008-03-02 в 23:30:26

Я извняюсь. А есть подобное, но с поддержкой POP3? Ну, что бы и как обычный SMTP/POP3 сервер можно было использовать.

lodErunnEr, 2008-04-27 в 5:01:00

Гы =) А нафига все эти трудности... ???
У RoundCube есть отличный инсталлер.... который все сначала протестирует, а потом сформирует конфиги.... достаточно написать http://roundcubehost/installer

P.S. Абсолютно бесполезная статья ;-Р

lissyara, 2008-04-27 в 13:35:45

C какой версии?

lodErunnEr, 2008-04-27 в 14:10:21

Ну вот вчера скачал roundcubemail-0.1.1.tar.gz. Правда я первый раз настраивал - раньше не было?

lissyara, 2008-04-27 в 14:42:50

mail$ cd /usr/local/www/roundcube/
mail$ ll
total 26
drwxr-xr-x  2 www  www    512  4 янв 12:25 SQL
drwxr-xr-x  2 www  www    512  4 янв 12:25 bin
drwxr-xr-x  2 www  www    512 21 янв 00:24 config
-r--r--r—  1 www  www  11565  4 янв 12:25 index.php
drwxr-xr-x  2 www  www    512  4 янв 12:25 logs
drwxr-xr-x  7 www  www    512  4 янв 12:25 program
drwxr-xr-x  3 www  www    512  4 янв 12:25 skins
drwxr-xr-x  2 www  www    512  4 янв 12:25 temp
mail$ pkg_version -v | grep round
^C
mail$ pkg_info  | grep round
roundcube-0.1.20080104 Fully skinnable XHTML/CSS webmail written in PHP

lodErunnEr, 2008-04-27 в 15:15:17

Наверное не стоило из портов ставить ... это все-таки не приложение =)
http://roundcube.net/downloads

AlkoGekS, 2008-04-28 в 20:29:55

Если статья бесполезна, то зачем ее читать? Я хотел поделиться с народом что я делал и как.
P.S.
Правильно Лис говорит, что "Не нравится, напишите лучше".

risk94, 2008-06-11 в 3:04:13

хороша.уселась слету.

Seltsam, 2008-07-02 в 11:07:40

А прикрутить к существующей таблице юзерей возможно?
Я так понял надо клупаться в ./config/db.inc.php - пральна?
И где roundcube будет иметь почтовые каталоги юзерей, согласно БД или как?
А Лису - Респект за свои труды и довольно внятное описание их на странице!

Сергей, 2008-07-04 в 15:41:22

Добрый вечер.!
Хочу выразить блгодарность!!! Статья эта и многие другие где я сейчас оставлю коменты просто шикарные. Я безболезненно наконец таки разобрался в нюансах Почтовика по этой статье и http://www.lissyara.su/?id=117  . Но на этом моя работа еще не окончена еще много что нужно сдлеать по статьям этого сайта :)  Если кому то требуется помощь и не может разобраться в ошибке пишите и мне может быть я смогу чем нибудь помочь wolf182005@mail.ru только прошу в теме писать что нить не похожее на спам ;) например название сайта и мое имя.

С уваением и респектом. Сергей.

Александр, 2008-09-19 в 10:08:08

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


Цитата
PHP Fatal error: Maximum execution time of 30 seconds exceeded in /usr/local/www/roundcube/program/lib/imap.inc on line 208, referer: http://192.168.1.6/roundcube/

cawok, 2008-10-02 в 12:35:48

Респект и Уважуха!

john, 2008-10-21 в 12:08:03

В /etc/rc.conf вносим следующие строчки:
...
postgresql_class="default"      # !!! ="postgres" иначе зачем писать дальше в login.conf
...
В /etc/login.conf тоже теребуется внести некоторые изменения
postgres:\
       :lang=ru_RU.UTF-8:\
       :setenv=LC_COLLATE=C:\
       :tc=default:

+ Не заыбваем cap_mkdb /etc/login.conf

DjumanJi, 2009-04-02 в 21:53:15

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

anonymous, 2009-05-03 в 5:00:10

...Ставить будем связку roundcube и postgresql, последний выбрал не случайно, хотелось посмотреть что это за зверь...
...Все, теперь переходим к установке postgresql. Я выбрал версию 8.2, 8.3 насколько я знаю еще не совсем стабильна...
Может тогда и не стоило писать все это?

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

Ребята, тут в вас все такие специалисты?

krava13, 2009-06-03 в 18:22:57

Проверил со связкой mysql - работает
можно устанавливать из портов (после обновления подтягивается версия 0.2.1, на сайте же - 0.2.2

luckyredhot, 2009-08-03 в 11:04:40

Авто статьи, очевидно, куда-то спешил. В путях ошибки:
вместо
/usr/local/www/rouncube/configs/main.inc.php
должно быть
/usr/local/www/roundcube/config/main.inc.php.
И выше тоже пропущено 'd'

gyurza2000, 2009-08-03 в 17:14:04

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

booran, 2010-08-16 в 16:32:54

Фича. Если Rcube использовать в конторе - ее адресная книга напрягает. Делаем ее лучше. Тупо берем и назначаем юзера например с user_id = 4 эталоном адресной книги, а всех остальных, сколько бы их там не было синхронизируем с ним скриптом. Скрипт в cron например на раз в сутки или в неделю.

Скрипт при выполнении грохает все записи в адресбуках юзеров и создает заново, так что все добавленное юзером теряется. А што делать :)...

#!/bin/sh
# С какого id будем брать образец книги
j=4

for i in `/usr/local/bin/mysql -uroot -p*** --database=roundcube -e\"select user_id from users order by user_id;\"`; do
       if [ $i != user_id ] && [ $i != $j ]
then
       echo $i
/usr/local/bin/mysql -uroot -pxxxx --database=roundcube -e\"delete from contacts where user_id = $i;\"
/usr/local/bin/mysql -uroot -pxxxx --database=roundcube -e\"delete from contactgroups where user_id = $i;\"
/usr/local/bin/mysql -uroot -pxxxx --database=roundcube -e\"insert into contacts (changed,del,name,email,firstname,surname,cellphone,workphone,vcard,user_id) select changed,del,name,email,firstname,surname,cellphone,workphone,vcard,$i from (select changed,del,name,email,firstname,surname,cellphone,workphone,vcard from contacts where user_id = $j) as typ\"
/usr/local/bin/mysql -uroot -pxxxx --database=roundcube -e\"insert into contactgroups ( user_id, changed, del, name) select $i, changed, del, name from  ( select changed, del, name from contactgroups where user_id = $j) as typ2\"
/usr/local/bin/mysql -uroot -pxxxx --database=roundcube -e\"insert into contactgroupmembers (contactgroup_id,contact_id,created) select d.contactgroup_id, e.contact_id, sysdate() from contactgroups a,contacts b,contactgroupmembers,contactgroups d,contacts e where b.user_id = $j and a.user_id = $j and contactgroupmembers.contactgroup_id = a.contactgroup_id and contactgroupmembers.contact_id = b.contact_id and b.changed=e.changed and a.changed = d.changed and d.user_id = $i and e.user_id = $i\"
      fi
done


Не идеально, но как то так...

booran, 2010-08-16 в 16:52:06

В скрипте заменить в запросах все слеши на скобки! Сайт перевирает...

NIKEBORZOFF, 2010-09-15 в 18:49:48

2booran & ALL

плагин globaladdressbook решает эту проблему



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.058 секунд
Из них PHP: 48%; SQL: 52%; Число SQL-запросов: 78 шт.
Исходный размер: 64266; Сжатая: 14631