Отправьте почту от контейнера Докера с Постфиксом хоста

Я запускаю Ubuntu 14.04 (Linux) сервер. Я установил и настроил Постфикс и OpenDKIM очень приятно на сервере; я могу послать электронные письма мне с командами такой как echo hi | sendmail root, и postfix/opendkim добавит заголовки такой как Message-Id, Date, и DKIM-Signature, перешлите электронную почту на мой персональный адрес электронной почты, и все работает отлично.

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

Что лучший способ состоит в том, чтобы сделать это?

Есть ли любой способ позволить контейнеру работать sendmail exectuable на хосте?

Я пытался установить связь для Добавления постфикса от контейнера с помощью протокола SMTP на порте 25, но Постфикс, кажется, рассматривает сообщения, полученные таким образом по-другому; я думаю, что это не добавило заголовков, таким образом, сообщение стало прямым отклоненный как спам Gmail (это не было даже достаточно хорошо, чтобы быть помещенным в мою Папку для спама).

Здесь maillog содержание

Sep 28 23:35:52 dantooine postfix/smtpd[4306]: connect from unknown[172.17.0.95]
Sep 28 23:35:52 dantooine postfix/smtpd[4306]: DD457889B: client=unknown[172.17.0.95]
Sep 28 23:35:52 dantooine postfix/cleanup[4309]: DD457889B: message-id=<>
Sep 28 23:35:52 dantooine spamd[3175]: spamd: connection from localhost [::1]:59471 to port 783, fd 6
Sep 28 23:35:52 dantooine spamd[3175]: spamd: handle_user (getpwnam) unable to find user: 'someone'
Sep 28 23:35:52 dantooine spamd[3175]: spamd: still running as root: user not specified with -u, not found, or set to root, falling back to nobody
Sep 28 23:35:52 dantooine spamd[3175]: spamd: processing message (unknown) for someone:65534
Sep 28 23:35:52 dantooine spamd[3175]: spamd: clean message (2.5/5.0) for someone:65534 in 0.0 seconds, 331 bytes.
Sep 28 23:35:52 dantooine spamd[3175]: spamd: result: . 2 - MISSING_DATE,MISSING_FROM,MISSING_MID,UNPARSEABLE_RELAY scantime=0.0,size=331,user=someone,uid=65534,required_score=5.0,rhost=localhost,raddr=::1,rport=59471,mid=(unknown),autolearn=no autolearn_force=no
Sep 28 23:35:52 dantooine opendkim[3179]: DD457889B: can't determine message sender; accepting
Sep 28 23:35:53 dantooine postfix/qmgr[3664]: DD457889B: from=<whoever@example.com>, size=275, nrcpt=1 (queue active)
Sep 28 23:35:53 dantooine postfix/smtpd[4306]: disconnect from unknown[172.17.0.95]
Sep 28 23:35:53 dantooine postfix/smtp[4311]: DD457889B: to=<someone@gmail.com>, relay=gmail-smtp-in.l.google.com[2607:f8b0:4003:c05::1b]:25, delay=0.25, delays=0.12/0.01/0.03/0.09, dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[2607:f8b0:4003:c05::1b] said: 550-5.7.1 [fd17:8b70:893a:44bf:fe73:6c21] Our system has detected that 550-5.7.1 this message is likely unsolicited mail. To reduce the amount of spam 550-5.7.1 sent to Gmail, this message has been blocked. Please visit 550-5.7.1 http://support.google.com/mail/bin/answer.py?hl=en&answer=188131 for 550 5.7.1 more information. su20si7357528oeb.94 - gsmtp (in reply to end of DATA command))
Sep 28 23:35:53 dantooine postfix/cleanup[4309]: 254E688A0: message-id=<20140928233553.254E688A0@myserver.example.com>
Sep 28 23:35:53 dantooine postfix/bounce[4330]: DD457889B: sender non-delivery notification: 254E688A0
Sep 28 23:35:53 dantooine postfix/qmgr[3664]: 254E688A0: from=<>, size=3374, nrcpt=1 (queue active)
Sep 28 23:35:53 dantooine postfix/qmgr[3664]: DD457889B: removed
Sep 28 23:35:53 dantooine postfix/virtual[4331]: 254E688A0: to=<whoever@example.com>, relay=virtual, delay=0.01, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Sep 28 23:35:53 dantooine postfix/qmgr[3664]: 254E688A0: removed
18
задан 29 September 2014 в 16:32
4 ответа

Jeg besluttede, at den måde containeren sender mail på er at skriv det til en fil i en bestemt mappe, som vil være tilgængelig fra både containeren og værten som en Docker "volumen".

Jeg lavede et shell-script kaldet mailsender.sh, der læser mails fra en bestemt mappe, sender dem for at sende mail, og derefter sletter dem:

#!/bin/bash
# Runs on the host system, reading mails files from a directory
# and piping them to sendmail -t and then deleting them.

DIR=$1

if [ \! \( -d "$DIR" -a -w "$DIR" \) ]
then
  echo "Invalid directory given: $DIR"
  exit 1
fi

echo "`date`: Starting mailsender on directory $DIR"

cd $DIR

while :
do
  for file in `find . -maxdepth 1 -type f`
  do
    echo "`date`: Sending $file"
    sendmail -t < $file
    rm $file
  done
  sleep 1
done

Ubuntu bruger upstart, så jeg oprettede en fil ved navn /etc/init/mailsender.conf for at gøre dette script til en dæmon:

description "sends mails from directory"
start on stopped rc RUNLEVEL=[2345]
stop on runlevel[!2345]
respawn
exec start-stop-daemon --start --make-pidfile --pidfile /var/run/mailsender.pid --exec
/path/to/mailsender.sh /var/mailsend

Jeg kan starte tjenesten med start mailsender og stop det med stop mailsender . Jeg kan se på dens logfiler i /var/log/upstart/mailsender.log , og selvfølgelig kan jeg overvåge det ved hjælp af PID-filen.

Du skal oprette / var / mailsend -mappen, og gør den derefter tilgængelig fra Docker-containeren ved at tilføje argumentet -v / var / mailsend: / var / mailsend til din docker-kørsel -kommando.

4
ответ дан 2 December 2019 в 20:24

Toisc go bhfuil réiteach oibre agat, féachfaidh mé anseo le hiompar difriúil a mhíniú nuair a dhéanann tú telnet a phostfix (SMTP) agus nuair a úsáideann tú seol (neamh-SMTP).

FYI, beidh OpenDKIM agairt le postfix le Meicníocht milter . Is féidir leat roinnt faisnéise a fháil faoin gcaoi a gcuirtear an cur i bhfeidhm níos boige i bpostfix tríd an doiciméadacht oifigiúil seo . Anseo tá an léaráid de hook milter i postfix.

             SMTP-only       non-SMTP
             filters         filters
                ^ |            ^ |
                | v            | |
Network ->  smtpd(8)           | |
                       \       | V
Network ->  qmqpd(8)    ->  cleanup(8)  ->  incoming
                       /
            pickup(8)
               :
Local   ->  sendmail(1)

Feiceann tú go bhfuil ordú próiseála difriúil ag bealach seoltaí (neamh-SMTP) agus bealach telnet (SMTP).

  • Próiseálfar an ríomhphost neamh-SMTP trí ghlanadh sula ndéantar é a instealladh a milter. Bhí deamhan glantacháin freagrach as ceanntásca a bhí in easnamh a chur leis: (Resent-) Ó :, Go :, Teachtaireacht-Id :, agus Dáta: . Dá bhrí sin beidh ceanntásc iomlán ag do r-phost nuair a instealladh é chuig milter OpenDKIM fiú amháin go raibh ceanntásc neamhiomlán ar an ríomhphost bunaidh.

  • Instealladh an r-phost SMTP chuig milter OpenDKIM sula ndéanfar aon phróiseáil glantacháin. Dá bhrí sin, má bhí ceanntásc neamhiomlán ag do r-phost bunaidh ansin féadfaidh opendkim diúltú an ríomhphost a shíniú. Bhí an ceanntásc Ó: éigeantach (féach RFC 6376 ) agus mura bhfuil r-phost aige, diúltóidh OpenDKIM an ríomhphost a shíniú agus rabhadh a thabhairt duit

     is féidir '  t Seoltóir na teachtaireachta a chinneadh;  ag glacadh
     

Toisc nach n-úsáideann mé dugaire riamh, ná níl a fhios agam cén teorannú ar sheoladh / piocadh taobh istigh den choimeádán. Sílim go raibh sreabhadh oibre David Grayson sábháilte go leor chun a chinntiú go síneoidh OpenDKIM an teachtaireacht.

8
ответ дан 2 December 2019 в 20:24

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

Ответ от OP (Дэвид Грейсон) звучит для меня как переизобретением почтовой буферизации postdrop, но использование этой почтовой буферизации звучит как многообещающий подход, так что вот к чему я пришел.

Интерфейс совместимости / usr / bin / sendmail, предоставляемый postfix, передает почту в postdrop, что является sgid postdrop, что позволяет ему сохранять почту в очереди maildrop в / var / катушка / постфикс / maildrop. Это должно происходить в контейнере докера. Остальная часть postfix, надеюсь, не должна выполняться в контейнере.

Итак, я размещаю / var / spool / postfix / maildrop и / var / spool / postfix / public. Я могу получать почту, доставляемую в / var / spool / postfix / maildrop в среде хоста, поскольку я смонтировал каталог очереди maildrop. Поскольку я смонтировал / var / spool / postfix / public , maildrop может сигнализировать pickup для сбора почты из очереди. К сожалению, если я не позабочусь об этом, задействованы идентификаторы uid и gid, а это означает, что сборщик в каталоге хоста не может читать файлы спула, и, что еще хуже, установка постфикса нарушает права доступа в каталоге maildrop в среде хоста.

Все еще,похоже, это работает:

$ cat Dockerfile 
FROM debian:jessie
# Ids from parent environment

    RUN groupadd -g 124 postfix && \
        groupadd -g 125 postdrop && \
    useradd -u 116 -g 124 postfix

    RUN apt-get update && \
      DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
        postfix \
        bsd-mailx

    CMD echo test mail | mail myemail@example.com

$ sudo docker build   .
...
Successfully built 16316fcd44b6

$ sudo docker run   -v /var/spool/postfix/maildrop:/var/spool/postfix/maildrop \
  -v /var/spool/postfix/public:/var/spool/postfix/public 16316fcd44b6

Хотя это работает, я не очень доволен жестким кодированием uid и gid. Это означает, что нельзя считать, что один и тот же контейнер работает одинаково везде. Я полагаю, однако, что если вместо монтирования тома с хоста я смонтирую его из контейнера, в котором работает postfix, то он никогда не будет конфликтовать, и мне понадобится только одна установка postfix, чтобы получать почту из многих контейнеров. Я бы установил эти идентификаторы uid и gid в базовом образе, от которого наследуются все мои контейнеры.

Я действительно задаюсь вопросом, действительно ли это хороший подход. С такой простой конфигурацией почты и без использования демона в контейнере для повторной доставки более подходящим может быть более простой локальный MTA, такой как msmtp. Он будет доставляться через TCP на ретранслятор на том же хосте, где происходит буферизация.

Подход msmtp вызывает опасения:

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

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

5
ответ дан 2 December 2019 в 20:24

Вы должны указать inet_interfaces на docker мост ( docker0 ) в конфигурации postfix, расположенный в наборе /etc/postfix/main.cf

inet_interfaces = <docker0_ip>

Более подробная информация о внутренней работе см. отправка-электронной почты от-докера-через-постфикс-установлен-на-хосте

6
ответ дан 2 December 2019 в 20:24

Теги

Похожие вопросы