إرسال البريد من حاوية عامل الميناء مع بوستفيكس المضيف

أنا تشغيل خادم أوبونتو 14.04 (لينكس). لقد قمت بتثبيت وتكوين بوستفيكس و أوبندكيم لطيف جدا على الخادم ؛ يمكنني إرسال رسائل البريد الإلكتروني لنفسي مع أوامر مثل echo hi | sendmail root، وسوف بوستفيكس / أوبيندكيم إضافة رؤوس مثل Message-Id, Date، و DKIM-Signature، أعد توجيه البريد الإلكتروني إلى عنوان بريدي الإلكتروني الشخصي ، وكل شيء يعمل بشكل رائع.

الآن أود إنشاء تطبيق يعمل في عامل الميناء حاوية ويمكن إرسال رسائل البريد الإلكتروني بنفس السهولة. على وجه الخصوص ، لا أريد أن أقلق بشأن إضافة رؤوس مثل Message-Id، وأنا لا أريد أن تفعل الكثير جدا التكوين أو تثبيت البرامج داخل الحاوية نفسها.

ما هي أفضل طريقة للقيام بذلك?

هل هناك أي طريقة للسماح للحاوية بتشغيل sendmail قابل للنزع على المضيف?

حاولت إجراء اتصال بوستفيكس من حاوية باستخدام بروتوكول سمتب على المنفذ 25 ، ولكن يبدو بوستفيكس لعلاج الرسائل الواردة بهذه الطريقة بشكل مختلف ؛ وأعتقد أنه لم يضيف أي رؤوس حتى حصلت على رسالة رفض صريح كما البريد المزعج من قبل غميل (لم يكن حتى جيدة بما فيه الكفاية ليتم وضعها في مجلد البريد المزعج الخاص بي).

هنا محتوى ميلوج

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 6Sep 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 nobodySep 28 23:35:52 dantooine spamd[3175]: spamd: processing message (unknown) for someone:65534Sep 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=noSep 28 23:35:52 dantooine opendkim[3179]: DD457889B: can't determine message sender; acceptingSep 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: 254E688A0Sep 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: removedSep 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

عليك أن تشير inet_interfaces إلى جسر عامل الميناء (docker0) في بوستفيكس التكوين الموجود في مجموعة /etc/postfix/main.cf

inet_interfaces = <docker0_ip>

مزيد من التفاصيل العمل الداخلي في إرسال البريد الإلكتروني من عامل الميناء من خلال بوستفيكس المثبتة على رأس المضيف

لأن لديك حل العمل ، وهنا سأحاول شرح سلوك مختلف عند تلنت إلى بوستفيكس (سمتب) وعند استخدام سيندمايل (غير سمتب).

لمعلوماتك ، سيتم استدعاء أوبيندكيم من قبل بوستفيكس مع آلية ميلتر. يمكنك الحصول على بعض المعلومات عن كيفية تنفيذ ميلتر في بوستفيكس عبر هذا الوثائق الرسمية. هنا رسم تخطيطي لربط ميلتر في بوستفيكس.

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

يمكنك أن ترى أن سيندميل-واي (غير سمتب) و تلنيت-واي (سمتب) لديها ترتيب معالجة مختلفة.

  • سيتم معالجة البريد الإلكتروني غير سمتب عن طريق تنظيف قبل حقنه إلى ميلتر. تنظيف الشيطان كان مسؤولا عن إضافة رؤوس مفقودة: (مستاء -) من: ، إلى: ، معرف الرسالة:, و التاريخ:. لذلك البريد الإلكتروني الخاص بك سوف يكون رأس كامل عند حقنه إلى أوبيندكيم ميلتر حتى البريد الإلكتروني الأصلي كان رأس غير مكتملة.

  • سيتم حقن البريد الإلكتروني سمتب إلى أوبيندكيم ميلتر قبل أي معالجة تنظيف تجري. لذلك ، إذا كان البريد الإلكتروني الأصلي الخاص بك رأس غير مكتملة ثم أوبيندكيم قد ترفض التوقيع على البريد الإلكتروني. ال من عند: كان الرأس إلزاميا (انظر رك 6376) وإذا كان البريد الإلكتروني لا يكون ذلك ، أوبندكيم سوف ترفض التوقيع على البريد الإلكتروني وتعطيك تحذيرا

      can't determine message sender; accepting

كما أنا أبدا استخدام عامل الميناء ، من أنا لا أعرف ما هو الحد على سيندمايل/بيك اب داخل حاوية. أعتقد أن الحل البديل ديفيد غرايسون كان آمنا بما فيه الكفاية لضمان أن أوبيندكيم توقيع الرسالة.

قررت أن الطريقة التي سترسل بها الحاوية البريد هي كتابتها إلى ملف في دليل معين ، والذي يمكن الوصول إليه من كل من الحاوية والمضيف كـ "وحدة تخزين"عامل ميناء.

لقد صنعت نص قذيفة يسمى mailsender.sh يقرأ رسائل البريد من دليل محدد ، ويرسلها إلى سيندمايل، ثم يحذفها:

#!/bin/bash# Runs on the host system, reading mails files from a directory# and piping them to sendmail -t and then deleting them.DIR=$1if [ \! \( -d "$DIR" -a -w "$DIR" \) ]then  echo "Invalid directory given: $DIR"  exit 1fiecho "`date`: Starting mailsender on directory $DIR"cd $DIRwhile :do  for file in `find . -maxdepth 1 -type f`  do    echo "`date`: Sending $file"    sendmail -t < $file    rm $file  done  sleep 1done

يستخدم أوبونتو مغرور لذلك أنا خلقت ملف اسمه /etc/init/mailsender.conf لتحويل هذا البرنامج النصي إلى شيطان:

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

يمكنني بدء الخدمة مع start mailsender ووقف ذلك مع stop mailsender. يمكنني إلقاء نظرة على سجلاتها في /var/log/upstart/mailsender.log، وبالطبع يمكنني مراقبته باستخدام ملف بيد.

تحتاج إلى إنشاء /var/mailsend الدليل ومن ثم جعلها يمكن الوصول إليها من حاوية عامل الميناء عن طريق إضافة الوسيطة -v /var/mailsend:/var/mailsend إلى الخاص بك docker run الأمر.