PDA

Bekijk de volledige versie : Проблемы с почтой: fetchmail & msmtp



BlackCat
03-04-2008, 15:13
Заметил интересную особенность. Может быть это и известно, но для меня это было новостью.
Установил fetchmail, он создал свой скрипт запуска в /opt/etc/init.d/S52fetchmail. Но при загрузке fetchmail упорно не хотел стартовать. Если запускать этот скрипт вручную, то он запросто стартует.
Вскрытие показало, что в тот момент когда при загрузке стартуют скрипты S**** переменная $PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin. А при ручном запуске она уже имеет другое значение (/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
).
Насколько я понял (если не ошибаюсь) она переопределяется в /etc/profile.
Вопрос: в какой момент времени на этапе загрузки применяется этот файл?
Если все написанное мной верно, значит надо иметь ввиду, что стартовые скрипты при загрузке системы должны использовать полные пути к файлам. Иначе возможны недоразумения.
Вот.

Maximus43
18-02-2009, 21:43
Поставил связку fetchmail + xmail + dovecot.
POP3 и IMAP работают через dovecot. XMail выполняет функции локального SMTP сервера и SMTP relay.
Однако XMail требует слишком много памяти для работы, у меня все время часть процессов уходит в своп. Сейчас от XMail в системе висит 13 процессов, хотя параметры запуска такие - -SX 1 -Qn 1 -Yt 1 -Ln 1 -CX 1 -PX 1 -Sl -Ql -Pp 20110 -Sp 20025:


[admin@router mail]$ ps |grep XMail
960 admin 3880 S /opt/bin/XMail
964 admin 3880 S /opt/bin/XMail
965 admin 3880 S /opt/bin/XMail
966 admin 3880 S /opt/bin/XMail
967 admin 3880 S /opt/bin/XMail
968 admin 3880 S /opt/bin/XMail
969 admin 3880 S /opt/bin/XMail
970 admin 3880 S /opt/bin/XMail
971 admin 3880 S /opt/bin/XMail
972 admin 3880 S /opt/bin/XMail
973 admin 3880 S /opt/bin/XMail
974 admin 3880 S /opt/bin/XMail
975 admin 3880 S /opt/bin/XMail
978 admin 1668 S grep XMail
[admin@router mail]$


Вопрос такой - как отключить POP3 в XMail?
Пробовал ставить параметр "PopEnable" "0" в файле userdef.tab, не помогло.
Глобальный вопрос - как сократить использование памяти? Может есть маленькая программа, которая сможет обслуживать Maildir и пересылать почту на внешний SMTP? Смотрел esmtp, но это не то, она не умеет работать с Maildir.

Заранее спасибо!

Maximus43
20-02-2009, 21:42
Неужели никто не устанавливал почтовый сервер на рутер?

GUID
11-11-2009, 09:56
Необходимо организовать получение почты, причем:
1. с gmail.com нужно максимально быстро реагировать на новую почту (т.е. интервалы между забором почты должны быть минимальны)
2. с yandex.ru нужно забирать почту не чаще 1 раза в 5 мин.
Чтобы реализовать п.1 был выбран fetchmail+imap.
Вопрос: как настроить постоянное подключение к почтовому ящику? (ни слова об этом в man fetchmail не нашел)

vectorm
11-11-2009, 10:20
В конфиге

defaults protocol pop3,
timeout 1,
Или

poll example.com proto pop3 interval 1
Не пробовали?

GUID
11-11-2009, 10:29
...[кусь]...Не пробовали?
Нет. Честно говоря не нравится такой подход из-за "постоянного" подключения/отключения... или я не прав?

По изначальной проблеме - нашел в man:


The ‘idle’ option is intended to be used with IMAP servers supporting the RFC2177 IDLE command extension, but does not strictly require it. If it is enabled, and fetchmail detects that IDLE is supported, an IDLE will be issued at the end of each poll. This will tell the IMAP server to hold the connection open and notify the client when new mail is available. If IDLE is not supported, fetchmail will simulate it by periodically issuing NOOP. If you need to poll a link frequently, IDLE can save bandwidth by eliminating TCP/IP connects and LOGIN/LOGOUT sequences. On the other hand, an IDLE connection will eat almost all of your fetchmail’s time, because it will never drop the connection and allow other pools to occur unless the server times out the IDLE. It also doesn’t work with multiple folders; only the first folder will ever be polled.
+ обратил внимание, что русский перевод man достаточно урезан.

хммм.... возникла (почти ожидаемая) проблема, описанная в выше приведенной выдержке из man.
Если поставить опцию idle, то одновременно можно мониторить только один ящик.
Т.е. я не могу с помощью fetchmail получить доступ к другим ящикам (и вторую копию запустить тоже невозможно)
- иными словами: многозадачность закончилась.

Я правильно понимаю, что выходов несколько:
- пересылать почту на "ящик который я мониторю";
- пользоваться чем-то другим вместо fetchmail.

кажется нашелся ответ: Only one daemon process is permitted per user; in daemon mode, fetchmail makes a per-user lockfile to guarantee this.

т.е. запускать от другого пользователя.... хмм... черт, linux - "страна контрастов".

Как запускать fetchmail в режиме демона от имени ограниченного пользователя (user)?
Если использовать "su", то user'у нужен shell, что автоматом понижает безопасность....
Решение видимо все-таки есть, ведь dnsmasq запущен от имени nobody... как?

vectorm
12-11-2009, 11:49
Как запускать fetchmail в режиме демона от имени ограниченного пользователя (user)?

Покопался слегка в поиске, и набрел на мысль - запустить в screen из-под нужных пользаков.
Решение настолько тупое, что обязано работать :)

GUID
12-11-2009, 11:51
запустить в screen
СПАСИБО!
пошел курить man по screen

vectorm
12-11-2009, 11:56
СПАСИБО!
пошел курить man по screen
Можно сделать по аналогии с запуском rtorrent.
http://wl500g.info/showpost.php?p=97629&postcount=177
пункты 5), 7), 8).

GUID
12-11-2009, 12:14
сделать по аналогии с запуском rtorrent
смотрел я этот вариант, НО поскольку(п. 3):
adduser --home /opt/home/p2p p2p
т.о. у p2p - есть шелл...
(что-то пока не наступает просветления по screen)

vectorm
12-11-2009, 12:45
смотрел я этот вариант, НО поскольку(п. 3):
adduser --home /opt/home/p2p p2p
т.о. у p2p - есть шелл...
(что-то пока не наступает просветления по screen)
Ну я думал, что пользователей для запуска, со своими хомами и шеллами, Вы создали ;)

GUID
12-11-2009, 13:51
Ну я думал, что пользователей для запуска, со своими хомами и шеллами, Вы создали ;)
ну слава богу - а то я читая man по screen чувствовал себя совсем тупым....
В конечном счете сделаю следующее:
- дам пользователю shell
- ssh - только по сертификату
.... единственное, чего я так и не понял: почему все так через задницу-то?! (вопрос риторический)

vectorm
12-11-2009, 14:28
ну слава богу - а то я читая man по screen
.... единственное, чего я так и не понял: почему все так через задницу-то?! (вопрос риторический)
Ну rtorrent например тоже не умеет под пользователем запускаться ;)
Издержки мелкоты и заточенности под определенные задачи.

GUID
12-11-2009, 15:55
Ну rtorrent например тоже не умеет под пользователем запускаться ;)
мне казалось, что это (запуск от имени) прежде всего свойство ОС, а не программы....


Издержки мелкоты и заточенности под определенные задачи.
т.е. особенность именно нашего варианта linux?

но, в конечном итоге я его победил:sudo - то, что надо!!!
;)

vectorm
12-11-2009, 16:26
но, в конечном итоге я его победил:sudo - то, что надо!!!
;)
Ну, это тоже вариант :)
В любом случае лишний пакет.

GUID
11-01-2010, 10:39
займусь и почтой.
(чукча не читатель, чукча писатель... это я о себе ;)
Речь идет о mail2sms ? Хм.... а зачем? Достаточно ограниченная система получается. Imho, проще сделать странцу на web-сайте роутера, с которой отправлять смс.

У меня сейчас сделано следующее (уведомление о транзакциях с банковской картой):
1. Висит fetchmail (как демон), который постоянно "подключен" к ящику на gmail.com по imap.
2. Далее письмо попадает в стандартный procmail, который при "валидном" отправителе и теме вызывает скрипт.
3. Скрипт (shell) парсит исходное письмо и отпавляет (при необходимости) смс.
Sms приходит на телефон (МегаФон) через ~1...1.5 минуты, после события.
Если будут вопросы - с удовольствием отвечу.

xz_kostyan
11-01-2010, 14:55
GUID, кстати да. Можно не городить огород и обойтись проверкой почты без питона.
По поводу питона -- ну не нравится мне php, но если общественность будет сильно против, оставлю на php, вырезав лишнее. То что написано у Евгения, конечно хорошо, но довольно большая часть кода -- копипаста, можно же было функции создать и ими пользоваться.
А насчет мусора, который добавляет mail.ru -- от префикса в виде почты никуда не денешься, а вот текст, который идет после, вполне можно дополнить пробелами, да. С вопросами я обращусь чуть позже, сейчас настала пора экзаменов. :)

GUID
11-01-2010, 15:08
ну не нравится мне php
"кому нравится поп, а кому попадья" ;)

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

То что написано у Евгения, конечно хорошо, но довольно большая часть кода -- копипаста, можно же было функции создать и ими пользоваться.
По поводу функций - это тема "дизайна класса" и мне сложно ее обсуждать, ибо я не знаю, для чего он писался.
Я все-таки не понял: чего Вы хотите? Переписать класс Евгения, выкинув оттуда все лишнее? В принципе можно, но Вы думаете, что от этого будет польза?
А что Вы планируете с поддержкой Вашего решения (у Евгения это неплохо получается)?

С вопросами я обращусь чуть позже
постараюсь ответить, хотя мне кажется, что ничем серьезным помочь не смогу.

настала пора экзаменов. :)
УДАЧИ!

GUID
08-02-2010, 17:05
Имеется достаточно примитивный скрип запуска fetchmail.


#!/bin/sh

#-------------------------------------------------------------
PIDFILE="$UHOME/.fetchmail.pid"
#------------------------------------------------------------
start() {
/opt/bin/sudo -H -u vUser /opt/bin/fetchmail -d 1 -f /home/zINI/fetchmail/imap_gmail.conf
}



stop() {
# if running
if [ -f $PIDFILE ]; then
/opt/bin/sudo -H -u vUser /opt/bin/fetchmail --quit
fi
}

restart() {
stop
sleep 1
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $0 (start|stop|restart|usage)"
exit 1
;;
esac

exit 0

fetchmail сконфигурирован, так, что постоянно висит соединение по imap с gmail.com.

При "ручном" выполнении проблем не возникает. Однако, если выполнять этот скрипт при включении роутера (/opt/etc/init.d), то при появлении письма в ящике (и соответственно попытке его доставки) появляется ошибка, сопровождающаяся следующими сообщениями:


2010-01-27 16:40:31 (info|mail|fetchmail) fetchmail[209]: 1 message for mail@gmail.com at imap.gmail.com.
2010-01-27 16:40:32 (info|mail|fetchmail) fetchmail[209]: reading message mail@gmail.com@ey-in-f109.1e100.net:1 of 1 (2794 header octets) (1273 body octets) (log message incomplete)
2010-01-27 16:40:32 (info|mail|fetchmail) fetchmail[209]: error writing message text
2010-01-27 16:40:32 (err|mail|fetchmail) fetchmail[209]: MDA error while fetching from mail@gmail.com@imap.gmail.com
2010-01-27 16:40:32 (info|mail|fetchmail) fetchmail[209]: Query status=6 (IOERR)

или так:


2010-02-06 02:37:38 (err|mail|fetchmail) fetchmail[216]: reading message mail@gmail.com@ew-in-f109.1e100.net:2 of 2 (1426 header octets) (
258 body octets) (log message incomplete)
2010-02-06 02:37:38 (err|mail|fetchmail) fetchmail[216]: Error writing to MDA: Broken pipe
2010-02-06 02:37:38 (info|mail|fetchmail) fetchmail[216]: not flushed

В файле imap_gmail.conf путь к MDA прописан как:


mda '/opt/bin/procmail -d %T'

Есть идеи как лечить?

al37919
08-02-2010, 17:22
запуск вручную отличается от запуска через init скрипты переменными окружения. Попробуйте сравнить переменные в обоих случаях добавив следующую строку:

export > /tmp/vars
Могу предположить, что проблема в том, что при автозапуске

HOME="/"

GUID
08-02-2010, 18:28
Попробуйте сравнить переменные в обоих случаях добавив следующую строку:

Что-то не выходит у меня каменный цветок :(

/home/var_dump.sh


#!/bin/sh
echo "-------" >> /tmp/vars.list
export >> /tmp/vars.list


post-mount.sh


#!/bin/sh

logger "export vars... 01"
/home/var_dump.sh
logger "export vars... 02"
/opt/bin/sudo -H -u vUser /home/var_dump.sh
logger "export vars... 03"

/opt/etc/init.d/rc.unslung start

vsftpd /opt/etc/vsftpd.conf &


В итоге:
/tmp/vars.list


-------
export HOME='/'
export PATH='/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin'
export PWD='/'
export TERM='linux'
export TZ='MST-3MDT,M3.5.0/2,M10.5.0/3'

"sys-log"


Feb 8 18:45:08 root: export vars... 01
Feb 8 18:45:08 root: export vars... 02
Feb 8 18:45:08 sudo: root : TTY=unknown ; PWD=/ ; USER=vUser ; COMMAND=/home/var_dump.sh
Feb 8 18:45:08 root: export vars... 03
Feb 8 18:45:08 rc.unslung: start service /opt/etc/init.d/S01syslog-ng

И что теперь делать.... ?

al37919
08-02-2010, 19:07
ну почему же не выходит --- вполне успешно сохранилось:

export HOME='/'
идея была в том, чтобы сравнить эти переменные при ручном успешном запуске и автоматическом неуспешном


2010-01-27 16:40:32 (info|mail|fetchmail) fetchmail[209]: error writing message text
куда при этом fetchmail пытается писать текст письма? Куда то в HOME?

GUID
08-02-2010, 19:31
ну почему же не выходит
Я видимо ввел Вас в заблуждение... sorry

Если чуть-чуть переделать post-mount (относительно предыдущего поста), то получится:
post-mount.sh


echo "------------ vUser ----------- " > /tmp/vars.list
/opt/bin/sudo -H -u vUser /home/var_dump.sh
echo "------------ root ----------- " >> /tmp/vars.list
/home/var_dump.sh

/tmp/vars.list


------------ vUser -----------.
------------ root -----------.
-------
export HOME='/'
export PATH='/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin'
export PWD='/'
export TERM='linux'
export TZ='MST-3MDT,M3.5.0/2,M10.5.0/3'

Это при том, что выполнение из консоли


/opt/bin/sudo -H -u vUser /home/var_dump.sh
cat /tmp/vars.list

дает:


-------
export HOME='/home/vUHome/vUser'
export LANG='ru_RU.UTF-8'
export LOGNAME='vUser'
export PATH='/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
export PS1='[\u@\h \W]$ '
export PWD='/tmp/local/root'
export SHELL='/bin/sh'
export SUDO_COMMAND='/home/var_dump.sh'
export SUDO_GID='0'
export SUDO_UID='0'
export SUDO_USER='root'
export TERM='xterm'
export USER='vUser'
export USERNAME='vUser'




куда при этом fetchmail пытается писать текст письма? Куда то в HOME?
надеюсь, что через pipe в procmail


mda '/opt/bin/procmail -d %T'

и думаю, что ключевая ошибка все-таки звучит так:


2010-02-06 02:37:38 (err|mail|fetchmail) fetchmail[216]: Error writing to MDA: Broken pipe


Спрошу по другому: а можно ли выполнить исходный скрипт на этапе загрузки с "нормальными" переменными окружения?

al37919
08-02-2010, 19:48
переменную можно объявить в шеловском файле. Например, во многих стандартных стартовых скриптах объявлена переменная PATH (именно по этой причине).

Альтернативно можно задать переменную на одну комманду:


HOME=/home/user command

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

GUID
08-02-2010, 21:22
Нужно пробовать.
Спасибо... буду пробовать/думать...

leniviy
18-07-2010, 18:40
Привет. Какой пакет ставить? На форуме больше ссылок на esmtp, но судя по ману, там только STARTTLS, а мне надо на gmail посылать
А если пробую через starttls, то получаю
Invalid peer certificate (error 20)

leniviy
31-07-2010, 11:47
попробовал msmtp. На gmail можно посылать как через 587, так и через 465 порт.
Если указать получателя в командной строке, то почему-то не создает поле "To: ". Письма приходят, но с пустым получателем.

Если посылать через gmail smtp, то в командной строке нельзя указать получателя в формате:
"B b <bb@foo.org>". Он пишет:

sendmail: recipient address B b <bb@foo.org> not accepted by the server
sendmail: server message: 555 5.5.2 Syntax error.
sendmail: could not send mail

pheople
25-11-2012, 06:18
Роутер WL500gpv2
mutt - текстовой почтовый клиент. Использую её в паре с msmtp.
После загрузки все работает прекрасно:


echo "Any send" | mutt -s "Hello" xxxx@xxx.xx
Нормально посылает сообщение

Но если эту строку вписать в стартовый скрипт post-mount то ничего не выходит.
Я так понял что mutt вроде логи не ведет. В syslog ничего не отловил
Перенаправлял стандартный поток ошибок в файл, и заметил вот такую ошибку:


/sent: Read-only file system (errno = 30)

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

MercuryV
25-11-2012, 08:22
попробуйте запускать с полными путями, часто в этом проблема при запуске из скриптов

pheople
25-11-2012, 13:36
попробуйте запускать с полными путями, часто в этом проблема при запуске из скриптов

Забыл написать в коде что использую полный путь.
Просто не ожидал что не поймете, так как перенаправление вывода работает, то естественно программа корректно вызывается.
конечно в скрипте post-mount вызов выглядит вот так:


echo "Any send" | /opt/bin/mutt -s "Hello" xxxx@xxx.xx

Такую ошибку я бы сразу конечно же заметил. Но все равно спасибо что отписались.
Программа то вызывается нормально. Вот только ошибка:


/sent: Read-only file system (errno = 30)

Выскакивает видимо из за недостатка прав. Я думаю копать нужно в эту сторону. Хотелось бы узнать под какими правами выполняются скрипты из /usr/local/sbin/

pheople
28-11-2012, 10:29
Проблему решил заменой mutt на nail
Не забудьте прописать в /opt/etc/nail.rc


set sendmail="/opt/bin/msmtp"

В принципе в него я больше ничего и не прописывал.
работает также. Пример:


echo "Any Send" | nail -s "Theme" xxxx@xxx.xx


P.S.
А с mutt я так и не понял в чем дело. Причем почта не отправлялась только со скрипта автозагрузки. С моего собственного скрипта MailReport после загрузки роутера отправляется все нормально как с mutt так и c nail