होस्ट के पोस्टफ़िक्स के साथ डॉकर कंटेनर से मेल भेजें

मैं एक उबंटू 14.04 (लिनक्स) सर्वर चला रहा हूं । मैंने स्थापित और कॉन्फ़िगर किया है पोस्टफिक्स और OpenDKIM सर्वर पर बहुत अच्छी तरह से; मैं अपने आप को कमांड के साथ ईमेल भेज सकता हूं जैसे echo hi | sendmail root, और पोस्टफिक्स/ओपनडकिम हेडर जोड़ देगा जैसे Message-Id, Date, और DKIM-Signature, ईमेल को मेरे व्यक्तिगत ईमेल पते पर अग्रेषित करें, और सब कुछ बहुत अच्छा काम करता है ।

अब मैं एक ऐसा एप्लिकेशन बनाना चाहूंगा जो एक में चलता है डॉकर कंटेनर और उसी आसानी से ईमेल भेज सकते हैं । विशेष रूप से, मैं हेडर जोड़ने की चिंता नहीं करना चाहता जैसे Message-Id, और मैं कंटेनर के अंदर बहुत अधिक कॉन्फ़िगरेशन या सॉफ़्टवेयर इंस्टॉलेशन नहीं करना चाहता ।

ऐसा करने का सबसे अच्छा तरीका क्या है?

क्या कंटेनर को चलाने का कोई तरीका है sendmail exectuable पर होस्ट?

मैंने पोर्ट 25 पर एसएमटीपी प्रोटोकॉल का उपयोग करके एक कंटेनर से पोस्टफिक्स से कनेक्शन बनाने की कोशिश की, लेकिन पोस्टफिक्स उस तरह से प्राप्त संदेशों का अलग तरह से इलाज करता है; मुझे लगता है कि इसने कोई हेडर नहीं जोड़ा, इसलिए संदेश जीमेल द्वारा स्पैम के रूप में एकमुश्त खारिज कर दिया गया (यह मेरे स्पैम फ़ोल्डर में रखा जाना भी

यहाँ 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 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) में postfix config में स्थित सेट करें /etc/postfix/main.cf

inet_interfaces = <docker0_ip>

अधिक आंतरिक कार्य विवरण पर भेजना-ईमेल-से-डॉकर-थ्रू-पोस्टफिक्स-इंस्टॉल-ऑन-द-होस्ट

क्योंकि आपके पास एक कामकाजी समाधान है, यहां मैं अलग-अलग व्यवहार की व्याख्या करने की कोशिश करूंगा जब आप पोस्टफिक्स (एसएमटीपी) को टेलनेट करते हैं और जब आप सेंडमेल (गैर-एसएमटीपी) का उपयोग करते हैं ।

एफवाईआई, ओपनडकिम पोस्टफिक्स द्वारा लागू किया जाएगा Milter तंत्र. आप कुछ जानकारी प्राप्त कर सकते हैं कि इसके माध्यम से पोस्टफिक्स में मिल्टर कार्यान्वयन कैसे होता है आधिकारिक दस्तावेज. यहाँ पोस्टफिक्स में मिल्टर हुक का आरेख है ।

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

आप देख सकते हैं कि sendmail-जिस तरह से (गैर-SMTP) और टेलनेट-जिस तरह से (SMTP) ने अलग-अलग प्रसंस्करण के आदेश.

  • गैर-एसएमटीपी ईमेल को मिल्टर में इंजेक्ट करने से पहले क्लीनअप द्वारा संसाधित किया जाएगा । सफाई डेमॉन लापता हेडर जोड़ने के लिए जिम्मेदार था: (नाराजगी-) से:, से:, संदेश-आईडी:, और तारीख:. इसलिए आपके ईमेल में पूरा हेडर होगा जब ओपनडकिम मिल्टर को इंजेक्ट किया जाएगा, यहां तक कि मूल ईमेल में अधूरा हेडर भी था ।

  • किसी भी सफाई प्रसंस्करण से पहले एसएमटीपी ईमेल ओपनडकिम मिल्टर को इंजेक्ट किया जाएगा । इसलिए, यदि आपके मूल ईमेल में अधूरा हेडर था तो ओपनडकिम ईमेल पर हस्ताक्षर करने से इनकार कर सकता है । द से: हैडर अनिवार्य था (देखें आरएफसी 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 कमान।

यह एक आधा-उत्तर है, या कम से कम आधा-परीक्षण वाला है, क्योंकि मैं वर्तमान में उसी समस्या से काम कर रहा हूं । मुझे उम्मीद है कि कोई मुझे जो याद किया है उसे बाहर निकालने में मदद कर सकता है ।

ओपी (डेविड ग्रेसन) का जवाब मुझे पोस्टड्रॉप मेल-स्पूल के पुन: आविष्कार की तरह लगता है, लेकिन उस मेल स्पूल का उपयोग करना एक आशाजनक दृष्टिकोण की तरह लगता है, इसलिए यहां वह जगह है जहां मैंने प्राप्त किया है ।

/Usr/bin/sendmail अनुकूलता इंटरफेस द्वारा ही प्रदान की जाती पोस्टफिक्स गुजरता मेल करने के लिए postdrop है, जो sgid postdrop अनुमति देता है, यह स्टोर करने के लिए मेल में maildrop कतार में /var/spool/पोस्टफिक्स/maildrop. यह डॉकर कंटेनर में होना चाहिए । बाकी पोस्टफिक्स को उम्मीद है कि कंटेनर में नहीं चलना चाहिए ।

तो, मैं कर रहा हूँ मेजबान बढ़ते /var/spool/पोस्टफिक्स/maildrop और /var/spool/पोस्टफिक्स/ । मैं मेजबान वातावरण में /वीएआर/स्पूल/पोस्टफिक्स/मेलड्रॉप को मेल डिलीवर कर सकता हूं, क्योंकि मैंने मेलड्रॉप कतार निर्देशिका को माउंट किया है । क्योंकि मैं घुड़सवार है /var/spool/postfix/public, maildrop संकेत कर सकते हैं pickup कतार से मेल एकत्र करने के लिए । दुर्भाग्य से, यूआईडी और जीआईडी शामिल हैं जब तक कि मैं इसका ध्यान नहीं रखता, जिसका अर्थ है कि होस्ट निर्देशिका में पिकअप स्पूल फ़ाइलों को नहीं पढ़ सकता है, और इससे भी बदतर पोस्टफिक्स इंस्टॉलेशन होस्ट वातावरण में मेलड्रॉप निर्देशिका पर अनुमतियों को गड़बड़ कर देता है ।

फिर भी, यह काम करने लगता है:

$ 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

हालांकि यह काम करता है, मैं यूआईडी और जीआईडी को हार्ड कोडिंग से बहुत खुश नहीं हूं । इसका मतलब है कि एक ही कंटेनर को हर जगह एक ही चलाने के लिए नहीं गिना जा सकता । हालांकि मुझे लगता है कि अगर होस्ट से वॉल्यूम बढ़ाने के बजाय मैं इसे एक कंटेनर से माउंट करता हूं जो पोस्टफिक्स चलाता है, तो यह कभी भी संघर्ष नहीं करेगा, और मुझे कई कंटेनरों से मेल निकालने के लिए केवल एक पोस्टफिक्स इंस्टॉलेशन की आवश्यकता है । मैं उन यूआईडी और जीआईडी को एक आधार छवि में सेट करूंगा जो मेरे सभी कंटेनरों से प्राप्त होते हैं ।

मुझे आश्चर्य है कि अगर यह वास्तव में एक अच्छा दृष्टिकोण है । इस तरह के एक साधारण मेल कॉन्फ़िगरेशन के साथ, और पुन: प्रयास वितरण के लिए कंटेनर पर उपयोग में कोई डेमॉन नहीं है, एमएसएमटीपी जैसा एक सरल स्थानीय एमटीए अधिक उपयुक्त हो सकता है । यह टीसीपी के माध्यम से उसी होस्ट पर रिले में पहुंचाएगा, जहां स्पूलिंग होगी ।

एमएसएमटीपी दृष्टिकोण के साथ चिंताओं में शामिल हैं:

  • यदि एसएमटीपी रिले भेजता है तो मेल खोने की अधिक संभावना उपलब्ध नहीं है । यदि वह एक ही होस्ट पर रिले है, तो नेटवर्क समस्याओं की संभावना कम है, लेकिन मुझे इस बारे में सावधान रहना होगा कि मैंने रिले कंटेनर को कैसे पुनरारंभ किया ।
  • प्रदर्शन?
  • यदि मेल का एक बड़ा फट जाता है, तो क्या मेल गिरना शुरू हो जाता है?

सामान्य तौर पर, साझा पोस्टफ़िक्स स्पूल दृष्टिकोण स्थापित करने के लिए एक नाजुक कॉन्फ़िगरेशन होने की अधिक संभावना है, लेकिन रन टाइम पर विफल होने की संभावना कम है (रिले अनुपलब्ध है, इसलिए मेल गिरा दिया गया) ।

कृपया अपने ईमेल का हेडर पोस्ट करें (वह जो जीमेल द्वारा स्पैम के रूप में गलत है)

मैं जिस ईमेल को भेजने की कोशिश कर रहा था, उसमें सिर्फ एक टू हेडर, सब्जेक्ट हेडर और एक-लाइन बॉडी थी । मुझे यकीन नहीं है कि पोस्टफिक्स के बाद इसे मिल्टर्स के माध्यम से चलाने के बाद यह क्या हेडर था, क्या आप जानते हैं कि कैसे? यहां आउटपुट / वीएआर / लॉग / सिस्लॉग में दिखाया गया है कि इसे पोस्टफिक्स द्वारा कैसे संसाधित किया गया था और जीमेल द्वारा अस्वीकार कर दिया गया था: log.txt · GitHub