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


18

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

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

इसे करने का बेहतरीन तरीका क्या है?

क्या कंटेनर sendmailको मेजबान पर छूटने देने का कोई तरीका है ?

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

यहाँ 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

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

मैं जिस ईमेल को भेजने की कोशिश कर रहा था To, उसमें हेडर, Subjectहेडर और एक-लाइन बॉडी थी। मुझे यकीन नहीं है कि पोस्टफ़िक्स के बाद इसे आतंकियों के माध्यम से चलाने के बाद यह कैसे हो सकता है? यहाँ आउटपुट / var / log / syslog में दिखाया गया है कि यह पोस्टफ़िक्स
डेविड ग्रेसन

जवाबों:


8

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

FYI करें, OpenDKIM, मिल्टर मैकेनिज्म के साथ पोस्टफिक्स द्वारा लागू होगी । आप कुछ जानकारी प्राप्त कर सकते हैं कि इस आधिकारिक दस्तावेज के माध्यम से पोस्टफिक्स में दुग्ध कार्यान्वयन कैसे होता है । यहाँ पोस्टफ़िक्स में मिल्टर हुक का आरेख।

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

आप देख सकते हैं कि सेंडमेल-वे (नॉन-एसएमटीपी) और टेलनेट-वे (एसएमटीपी) में अलग-अलग प्रोसेसिंग ऑर्डर हैं।

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

  • किसी भी क्लीनअप प्रोसेसिंग से पहले SMTP ईमेल को OpenDKIM मिल्क में इंजेक्ट किया जाएगा। इसलिए, यदि आपके मूल ईमेल में अधूरा हेडर था तो opendkim ईमेल पर हस्ताक्षर करने से मना कर सकता है। से: हैडर अनिवार्य था (देखें आरएफसी 6376 ) और एक ईमेल में यह नहीं है, तो, OpenDKIM ईमेल हस्ताक्षर करने से मना और आप एक चेतावनी दे देंगे

    can't determine message sender; accepting
    

जैसा कि मैंने कभी डॉकटर का उपयोग नहीं किया, क्योंकि मुझे नहीं पता कि कंटेनर के अंदर सेंडमेल / पिकअप पर क्या सीमा है। मुझे लगता है कि डेविड ग्रेसन का समाधान यह सुनिश्चित करने के लिए पर्याप्त था कि संदेश पर हस्ताक्षर करना OpenDKIM।


वह ज्ञानवर्धक था; धन्यवाद। दुर्भाग्य से, मुझे अभी भी अपने वर्तमान समाधान (मेरे उत्तर में वर्णित) से बेहतर कोई समाधान दिखाई नहीं देता है।
डेविड ग्रेसन

स्पष्ट कारण From:आपके ईमेल में हेडर जोड़ने के लिए ऐप को ठीक कर रहा था :)
masegaloeh

लेकिन मुझे ऐसे सामान को भी जोड़ना होगा, Message-Idजिसके बारे में मुझे बहुत जानकारी नहीं है और मैं शायद इसे गलत समझूंगा ... साफ-सुथरा डेमॉन का ख्याल रखना आसान है।
डेविड ग्रेसन

दरअसल, RFC 6376 के अनुसार मैसेज-आईडी अनिवार्य नहीं था । डिफ़ॉल्ट रूप से, अनिवार्य हेडर केवल Fromहेडर था । लेकिन, अगर आप अपनी खुद की मैसेज-आईडी जनरेट करना चाहते हैं, तो आप इस IETF ड्राफ्ट
masegaloeh

6

आपको सेट पर स्थित पोस्टफिक्स कॉन्फिग में docker Bridge inet_interfaces( docker0) को इंगित करना होगा/etc/postfix/main.cf

inet_interfaces = <docker0_ip>

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


लिंक के लिए धन्यवाद! मेरे लिए प्रासंगिक भाग की तरह कुछ जोड़ने के लिए था 172.17.0.0/16करने mynetworksमें /etc/postfix/main.cfऔर service postfix restart
5

5

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

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

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

तो, मैं मेजबान / var / स्पूल / पोस्टफिक्स / मेलड्रॉप और / var / स्पूल / पोस्टफिक्स / पब्लिक होस्ट कर रहा हूं। मुझे मेल / होस्टल वातावरण में / var / spool / postfix / maildrop पर डिलीवर करने के लिए मेल मिल सकता है, क्योंकि मैंने मेलग्रुप क्यू डायरेक्टरी को माउंट किया है। क्योंकि मैंने माउंट किया है /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

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

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

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

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

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


4

मैंने तय किया कि जिस तरह से कंटेनर मेल भेजेगा, उसे किसी विशेष निर्देशिका में एक फाइल पर लिखना है, जो कंटेनर और होस्ट दोनों से डॉकटर "वॉल्यूम" के रूप में सुलभ होगा।

मैंने एक मेल स्क्रिप्ट बनाई, जिसे 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=$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

उबंटू ने अपस्टार्ट का उपयोग किया इसलिए मैंने /etc/init/mailsender.confइस स्क्रिप्ट को डेमॉन में बदलने के लिए एक फाइल बनाई।

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

मैं start mailsenderइसके साथ सेवा शुरू कर सकता हूं और रोक सकता हूं stop mailsender। मैं इसके लॉग में देख सकता हूं /var/log/upstart/mailsender.log, और निश्चित रूप से मैं पीआईडी ​​फ़ाइल का उपयोग करके इसकी निगरानी कर सकता हूं।

आपको /var/mailsendनिर्देशिका बनाने की आवश्यकता है और फिर -v /var/mailsend:/var/mailsendअपने docker runआदेश में तर्क जोड़कर डॉकटर कंटेनर से इसे सुलभ बनाएं ।


शायद mini_sendmail की तरह कुछ उपयोगी हो जाएगा? इसका उपयोग कंटेनरों में किया जाता है, जैसे कंटेनर पृथक एप्लिकेशन के बीच एक पुल और कंटेनर होस्ट सिस्टम पर सेंडमेल सर्वर डेमॉन। cyberciti.biz/tips/… acme.com/software/mini_sendmail
मीकल

यदि यह SMTP के माध्यम से ईमेल को पोस्टफिक्स को भेज रहा है, तो मुझे नहीं लगता कि पोस्टफिक्स ईमेल को साफ करेगा। हो सकता है कि यदि आपके पास एक एमटीए था जो अधिक विन्यास योग्य था (या हमने सोचा कि पोस्टफिक्स को बेहतर तरीके से कैसे कॉन्फ़िगर किया जाए) तो यह काम करेगा।
डेविड ग्रेसन 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.