Komut satırı borulaması ile posta gönderme


9

Bir dosyayı çalıştıran bir cron komutu var ve bu yüzden bana e-postalar çıktı kurmaya çalışıyorum. Ben doğrudan dosyaları değiştirmek istemiyorum 3. parti komut dosyaları ile bu yüzden PHP değiştirmek yerine çıktı boru gerekir.

Kullanan mailbir sunucudan kullanan bir sunucuya geçiyorum sendmail. Bir konuyu komut satırı yoluyla sendmail'e nasıl düzgün bir şekilde göndereceğimizi öğrenmek için uğraşıyorum.

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

sendmailsisteminiz tarafından kendisine gönderilen postayı yönlendirmek için kullanılan ikili dosyadır mail. Sendmail , postfix , exim ve benzeri programların bir parçasıdır . Bu nedenle, posta için uygun paketi yüklemeniz gerekir . Bize kullandığınız linux dağıtımını söyleyin.
adamo

UNIX / Linux'un tüm POSIX uyumlu formları, "sendmail" adlı bazı yürütülebilir dosyalar sağlamalı ve sendmail işlevlerinin bir alt kümesiyle uyumlu olan belirli bir seçenek kümesi almalıdır (aşağıdaki günün yanıtında açıklanan -t seçeneği dahil). Exim, Postfix ve qmail bunların hepsini sağlar - bazen / usr / bin veya / usr / sbin yerine / usr / libexec / sendmail altına kurulurlar.
Jim Dennis

Yanıtlar:


3

/ Usr / Sbin / sendmail'i

Bu yanlış.

mailBazı yerlerde komut vermelisin . Bu çağrılabilir mailx. Dizinde olmalıdır /bin/. Standart uygulama olarak, php betikleri asla /sbinveya içinde bir şey çağırmamalıdır /usr/sbin. Sbin programları tipik olarak root içindir.

Ayrıca, php yerleşik bir posta işlevi vardır .


Değilse mailya mailxda olabilir Mail. Ancak bunlar olmasa bile, mutt kurabilir ve mutt -xtaklit eden çalıştırabilirsiniz mailx.
adamo

Bu doğrudur ... yolumu belirlemek için koştum which mailve geri döndü /bin/mail.
Webnet

2
sendmail daha iyi bir yaklaşımdır (Posix standardıdır) ... ancak sendmail -t'yi kullanmak daha iyidir (giriş akışından başlıkları alın). Bu, posta gönderen programın herhangi bir kabuk çağırmadan yalnızca sendmail yardımcı programıyla etkileşime girmesine izin vererek birçok olası kabuk değişkeni enterpolasyon güvenlik açığını önler). Daha fazla ayrıntı için "timday's" yanıtına bakın.
Jim Dennis

13

Debian sistemlerimde ("gerçek" sendmail yerine Exim var, ancak yine de uyumluluk için bir sendmail ikili dosyası var), bir komut dosyasından posta göndermek istediğimde eşdeğer bir şey yapıyorum:

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

This is a test message
EOF

Boş satırın önemli olduğunu unutmayın.


1
Boş satır, bir mesajın başlık kısmını mesaj gövdesinden ayırmak için kullanılır. Neden olmasın sendmail -t <<EOF?
adamo

@adamo: Çünkü orijinal sorudaki desene '|' (ve aslında bunu kendim yaptığım yerler genellikle create_test_message.sh | sendmail -t gibi).
timday

2
Bu, UNIX altında güvenli programlı posta göndermeye yönelik kanonik yaklaşımdır.
Jim Dennis

sonunda sendmail için çalışan bir örnek var! Teşekkür ederim!
insidepower

eğer sendmailbaşarısız olur ve STDERR'a yazarsa, bunu daha sonra komut dosyasında kullanmak için bir değişken olarak nasıl yakalayabilirim?
streetster

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 = E-postanın gövdesi.
sed stuff = E-posta başlıklarını ve gövde ile başlıklar arasındaki önemli çift satırı uygular.
sendmail -t = Bunu doğrudan sendmail yoluyla gönderir.


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

1
Merhaba ve Sunucu Hatası'na hoş geldiniz. Belki cevabınızı biraz ayrıntılandırabilirsiniz?
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.