कमांड लाइन पाइपिंग के माध्यम से कैसे भेजें


9

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

मैं उस सर्वर से माइग्रेट कर रहा हूं जो उपयोग mailकरने वाले सर्वर का उपयोग करता है sendmail। मैं यह पता लगाने के लिए संघर्ष कर रहा हूं कि कमांड लाइन के माध्यम से भेजने के लिए किसी विषय को ठीक से कैसे भेजा जाए।

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" test@email.com

sendmailवह बाइनरी है जो आपके सिस्टम द्वारा मेल को रूट करने के लिए उपयोग की जाती है जो इसके द्वारा सबमिट की जाती है mail। यह सेंडमेल , पोस्टफिक्स , एक्जिम वगैरह जैसे कार्यक्रमों का एक हिस्सा है । तो आप के लिए उपयुक्त पैकेज स्थापित करने की आवश्यकता मेल । तो हमें लिनक्स वितरण का उपयोग करें जो आप उपयोग कर रहे हैं।
Adamo

UNIX / Linux के सभी POSIX आज्ञाकारी रूपों को "सेंडमेल" नाम से कुछ निष्पादन योग्य प्रदान करना चाहिए और विकल्पों का एक विशिष्ट सेट लेना चाहिए जो सेंडमेल की कार्यक्षमता के सबसेट के साथ संगत हो (जिसमें -t का विकल्प भी शामिल है, जिसे नीचे दिए गए समय में जवाब दिया गया है)। एक्जिम, पोस्टफिक्स और क्यूमेल ये सभी प्रदान करते हैं --- कभी-कभी उन्हें उदाहरण के लिए / usr / libexec / sendmail के बजाय / usr / bin या / usr / sbin के तहत इंस्टॉल किया जाएगा।
जिम डेनिस

जवाबों:


3

/ Usr / sbin / sendmail

यह गलत है।

आपके पास कुछ mailकमांड होनी चाहिए । इसे बुलाया जा सकता है mailx। में होना चाहिए /bin/निर्देशिका। मानक अभ्यास के रूप में, php स्क्रिप्ट कभी नहीं में कुछ भी बुला जाना चाहिए /sbinया /usr/sbin। आमतौर पर sbin प्रोग्राम रूट के लिए होते हैं।

इसके अलावा, php एक में बनाया गया है मेल समारोह


यदि ऐसा नहीं है mailया mailxयह हो सकता है Mail। लेकिन भले ही वे मौजूद न हों, आप म्यूट इंस्टॉल कर सकते हैं और चला सकते हैं mutt -xजो अनुकरण करता है mailx
अडामो

यह सच है ... अपने रास्ते को निर्धारित करने के लिए, मैं भाग गया which mailऔर यह लौट आया /bin/mail
Webnet

2
sendmail बेहतर तरीका है (यह एक Posix मानक है) ... लेकिन sendmail -t (इनपुट लाइन से हेडर लेना) का उपयोग करना बेहतर है। यह कई संभावित शेल वैरिएबल इंटरपोलेशन भेद्यता से बचा जाता है, जिससे प्रोग्राम को मेल भेजने की अनुमति केवल बिना किसी शेल को इनवॉइस किए सेंडमेल उपयोगिता के साथ बातचीत करने के लिए दी जाती है)। बेहतर विवरण के लिए "समय" का उत्तर देखें।
जिम डेनिस

13

मेरे डेबियन सिस्टम पर (जो "वास्तविक" सेंडमेल के बजाय एक्जिम है, लेकिन अभी भी कम्पैटिबिलिटी के लिए सेंडेल बाइनरी है), जब मैं एक स्क्रिप्ट से मेल भेजना चाहता हूं तो मैं इसके बराबर कुछ करता हूं:

cat <<EOF | sendmail -t
To: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

ध्यान दें कि रिक्त रेखा महत्वपूर्ण है।


1
किसी संदेश के शीर्ष लेख भाग को संदेश निकाय से अलग करने के लिए रिक्त पंक्ति का उपयोग किया जाता है। sendmail -t <<EOFहालांकि क्यों नहीं ?
Adamo

@adamo: क्योंकि यह सेंडमेल में पाइप के मूल प्रश्न के पैटर्न के करीब था '| (और वास्तव में जिन जगहों पर मैं खुद ऐसा करता हूं, यह आम तौर पर कुछ ऐसा है जैसे कि generate_test_message.sh | sendmail -t)।
तैमूर

2
यह UNIX के तहत सुरक्षित प्रोग्रामेटिक मेल भेजने के लिए विहित दृष्टिकोण है।
जिम डेनिस

अंत में Sendmail के लिए एक काम करने का उदाहरण मिला! धन्यवाद!
insidepower

यदि sendmailअसफल होने और STDERR को लिखने के लिए, मैं इसे स्क्रिप्ट में बाद में उपयोग करने के लिए एक चर के रूप में कैसे पकड़ सकता था?
स्ट्रीटस्टर

1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = ईमेल का मुख्य भाग।
sed सामान = ईमेल हेडर, और शरीर और हेडर के बीच महत्वपूर्ण डबल लाइन लागू होता है।
sendmail -t = इसे सीधे sendmail के माध्यम से पाइप करता है।


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
हाय और सर्वर दोष करने के लिए स्वागत करते हैं। शायद आप अपने जवाब थोड़ा विस्तार से बता सकता है?
SLM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.