Tek satırlık postaları komut satırından gmail kullanarak göndermek için en basit yol?


32

Raspbian ve Ubunntu 16.04 LTS kullanarak, genel bir Linux çözümüne ihtiyaç duyar.

Gereksinim basit:

Komut satırından bir satır e-posta mesajları göndermek için bir yol gerekir.

Sadece bu belirli Rpi3 için, rpi3abc@gmail.com adresiyle - 2FA olmayan bir gmail hesabı oluşturdum.

Bu yüzden şimdi kullanıcı müdahalesi olmadan herhangi bir yerden (cron dahil) herhangi bir yerden tek satırlık posta mesajları gönderebilmem gerekiyor.


Ayrıca metin dosyaları gönderebilmeyi de istiyorum; temel olarak, herhangi bir şey stdin.


mesajınızın bu özel adresten mi gelmesini istiyorsunuz, rpi3abc@gmail.com veya bu mesaj sizin adınızdaki @ localhost adresinden mi geliyor?
John Smith,

Bu rpi3abc@gmail.com geliyor, bu yüzden bilgisayarımın benimle iletişim kurduğunu biliyorum. Çoğunlukla cron işlerinde kullanıyorum.
SDsolar

Yanıtlar:


33

Tek satırlı mesajları gmail ile göndermenin en kolay cevabı ssmtp kullanmaktır.


Aşağıdaki komutlarla yükleyin:

sudo apt-get update
sudo apt-get install ssmtp

Bunun /etc/ssmtp/ssmtp.confgibi görünmek için düzenleyin:

root=rpi3abc@gmail.com
mailhub=smtp.gmail.com:465
FromLineOverride=YES
AuthUser=rpi3abc@gmail.com
AuthPass=testing123
UseTLS=YES

Öyle bir liner gönder:

echo "Testing...1...2...3" | ssmtp myusername@gmail.com

veya

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp myusername@gmail.com

Daha sonra, * nix'e göre, istemi birkaç saniye içinde geri alırsınız.

Myusername@gmail.com hesabınızı kontrol edin ve işte orada!


Bu aynı zamanda bir dosya gönderirken de iyi çalışır:

cat program.py | ssmtp myotherusername@yahoo.com

Ve program posta kutusunda görünecek

Dosya bir metin dosyasıysa, yazan bir ilk satır olabilir. Subject: xxxxxx

Bu çeşitli cron işlerinde kullanılabilir, bana içeriği belirten konu satırlarıyla veri gönderebilir.


Bu, ssmtp'ye stdin aracılığıyla aktarılan bir mesaj hazırlayan herhangi bir şey ile çalışacaktır.


Bu dosyaları diğer kullanıcılara karşı güvenceye almak ve bu gibi diğer ayrıntılar için bu makaleyi ziyaret edin:

Ahududu Pi Komut Satırından E-posta Gönder


Gerekirse, biçimlendirilmiş mesaj dosyalarında değiştirilebilecek adresin Ruikilitlenmesiyle ilgili olarak verilen cevaba aşağıya da baktığınızdan emin olun FROM:.


Şimdi, nasıl SMS gönderileceğini aynı şekilde öğrenebilseydim.


1
Ben de kullanmak ssmtpbenim VM, çok hafif de. +1
Rui F Ribeiro

1
Neden sendmail API'yi Python'dan kullanıp doğrudan göndermiyorsunuz?
Rui F Ribeiro

Bunu bir adım öteye götürmek için, bir görüntü dosyasını ek olarak eklemek
SDsolar

Rui'nin sorusuna cevap vermek için: sendmailyalnız makine dışında iletişim kuracak MTA - Posta Taşıma Ajanına sahip değil. Varsayılan olarak, Unixen tasarım sendmailgereği çok kullanıcılı olduğundan, aynı kutudaki diğer kullanıcılara mesaj gönderir ancak dışarıda olmaz. ssmtpgmail için yapılandırmanın en basit olduğunu düşündüğüm MTA.
SDsolar

1
sonsuza dek harcadım postix'i kurmaya çalışıyorum! Bunu okuyan herkese bir not, conf yazım hatası vardır, root parametresi gmail.com değil gmail.com olmalıdır.
qodeninja

9

ssmtpSendmail paketleyicilerinin yalnızca bir tanesi. Bunların tümü standart girdi hakkında bir mesaj ve isteğe bağlı olarak komut satırı argümanları olarak bir adres listesi kabul eder ve hepsi sendmailgeleneksel Sendmail komut satırı API'sini uygulayan (en azından temel özellikleri) adlı bir ikili dosya sunar . Ancak doğru konuşursak, bu mesajın iyi biçimlendirilmiş RFC822 mesajı olması gerekir. En azından bir Subject:başlığa sahip olmalı .

ssmtp address@example.com <<<$'Subject: testing 1...2...3'

(İle ssmtp, sendmailsadece bir sembolik bağlantıdır ssmtp. Postfix, Exim ve Provides: mail-transport-agentbenzer bir düzenlemeye sahip olan diğer tüm MTA'ların , tabii ki "gerçek şeyin" sendmailolduğu yerler dışında olduğuna inanıyorum sendmail.)

Daha yaygın olarak, basit bir e-posta iletisini burada bir belge ile birleştirebilirsiniz.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: recipient@example.net

Here we interpolate the shell variable $result
____HERE

(Sendmail -tseçeneği, alıcı listesini standart girişte aldığınız mesajın başlıklarından almayı söylüyor. Sendmail'e giden kesin yol, platformlar arasında farklılık gösterecektir.)

Yaygın olarak kullanılan bir diğer varyasyon, birkaç komutun çıktısını birleştirmektir. Başlıklar ile mesaj gövdesi arasında boş bir çizgi ("boyun") olmasına dikkat edin.

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail elsewhere@example.org

Çok basit ASCII metin mesajlarının ötesindeki herhangi bir şey için, uygun bir MIME mesajının nasıl oluşturulacağını anlamanız gerekir; bu noktada böyle bir aracı kullanmak genellikle daha mantıklı olur mutt. Bazı platformlar bir var mailya mailxhangi ekleri ve ASCII olmayan metin göndermek bilen, ancak bu tamamen taşınabilir değildir.

Buradaki zorluk, bir e-posta mesajı alabilen ve göndermeyi deneyebilecek bir müşteri bulmak değil, MTA'nın uzak sunucu için kullanılacak kullanıcı adını ve şifreyi bilmesini gerektiren Gmail'in özelliklerine göre yapılandırmaktır. Giden smarthost olarak kullanabilmek.

Sahnelerin arkasında, çoğu müşteri gibi mutt, mailxvb. Genellikle sendmailsistemden mesajı almak için sadece perde arkasından koşar .


Sendmail'i doğrudan kullanma konusunda çok fazla şans istemiyorum; dolayısıyla ssmtp'ye dönüyoruz. Cevabınız için oy verin. Bu arada, görüntüleri ek olarak göndermek için mümkün olan en basit yolu buldum. MIME hakkında düşünmek zorunda bile değilim. Burada açıklandığı gibi sadece mpack kullanıyorum: unix.stackexchange.com/questions/381131/…
SDsolar

8

OP'nin kendi cevabına ekleme:

Yapılandırırken ssmtp, kullanıcıların Kimden'i tanımlamasını da yasaklayabilir veya bunlara izin verebilir ve ayrıca etki alanını geçersiz kılabilirsiniz; Spam klasörüne düşmeyen mesaj da dahil olmak üzere çeşitli nedenlerle yapmak isteyebilirsiniz.

Ekleyebilirsiniz /etc/ssmtp/ssmtp.conf:

# Where will the mail seem to come from?
rewriteDomain=my_internet_domain.uk

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

EVET ahududu içinde kullanılabilse de, çok kullanıcılı bir sistemde güvenlik açısından tavsiye edilmeyebileceğini lütfen unutmayın.


Oyla. Mükemmel bilgi
SDsolar

5

"Posta" nın nesi var?

echo "Merhabalar" | posta -s "Önemli posta" user@example.com

"mail", / etc / alternatif / bsd-mailx paketinden / usr / bin / bsd-mailx 'e bir link. Varsayılan olarak orada olduğuna inanıyorum. Örneğin, cron betiklerinden posta göndermek için harika bir yardımcı programdır.

Ubuntu ve FreeBSD'de de çalışır.


3
mailxsadece bir ön uç. MTA'nın yerel sistemden mesajı almak için yapılandırılması gerekiyor. Ortak kullanımda birden fazla uyumsuz sürüm vardır, ancak hedef platformunuz yalnızca Debian ise, makul derecede yakın zamanda yapılan BSD davranışına güvenebilirsiniz.
32'de üçlü

4

Bunun için kullanmak gerçekten kısmi mailx:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<sender@email.com>" -c recipient2@email.com recipient1@email.com

1
Buradaki seçeneklerin birçoğu Debian olmayan / BSD olmayan sistemlerde kullanılamayacak. Özellikle -aseçenek evrensel olarak desteklendiyse harika olurdu, ama mailxbunun kesinlikle böyle olmadığını görmek için buradaki sorulara göz atın .
üçlü

2

Harici bir tedarikçinin SMTP sunucusu üzerinden basit otomatik e-postalar göndermek için sendEmail kullanıyorum:

sendEmail -q -f "me@mail.com" -u "mySubject" -t "someone@mail.org" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

Her şeyi tek bir satırda iletiyorum, bu yüzden komut satırında bunu yapmak, büyük olasılıkla bir ps -efsüre çalıştırdığımda tüm parametreleri (smtp şifresi dahil) tüm kullanıcılara gösterecektir . Bir kabuk betiği içinde kullanıyorum.


1
Bu standart bir kurulum değil ve bu isimde birden fazla müşteri var. Sanırım en.wikipedia.org/wiki/SendEmail adresine atıfta bulunuyorsunuz . Debian paketi olarak mevcut mu?
üçlü

Çok kullanıcılı bir sistemde olduğu gibi kabuk senaryosu hakkında iyi düşünmek. Şifrem, makinenin derinliklerinde bir dosyada olmasını seviyorum. Keşke açık metin yerine şifreli şifreyi saklayabilseydim.
SDsolar


1
Orijinal soruda belirtildiği gibi gmail ile çalıştığını gösteren bu cevabı görmüyorum.
SDsolar

Bu, gmail ile işe yarıyor, ör: -s smtp.gmail.com -o tls = evet -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

Sunucum CEntOS 7, sendmail ancak mailx değil.

echo -e "From: you@whatever\nTo: you@gmail.com\nSubject: this is the subject\n\nThis is the body,\nwith multiple lines." | sendmail -t

Benim için bu, bir sunucu veya arka plan programı çalıştırmayı veya yapılandırmayı gerektirmediğinden ve tek bir komut satırında yapılabildiğinden kısa bir e-posta göndermenin en basit yolu gibi görünüyor.

Fikir, bir mesajın, herhangi bir potansiyel gizli bilgiyi açığa vurmadan, belirli bir programın hata attığını ve ardından günlüklerini denetlemek için sunucuya SSH göndereceğim. Bu sayede dosya ekleme veya aktarımı şifreleme gibi komplikasyonlarla uğraşmanıza gerek kalmaz.

Notlar:

  • -e yankayı '\ n' ve diğer kaçışları yorumlamasını söyler.
  • -t sendmail'e, mesaj adresindeki 'Kime:' adresinden alıcı adreslerini almasını söyler.
  • Posta gelmezse, tail /var/log/mailloghata mesajlarını görmek için kullanın .
  • Gmail adresinize gönderiyorsanız, onları önemsiz klasörden uzak tutmak için gmail'de bir filtre yapın.
  • Bu sendmail aslında 'sendmail.postfix' (normal olabilir); burada bir adam sayfası var

1
Sisteminizde çalışan bir MTA yüklü olmalıdır sendmail - ancak orijinal soruda belirtildiği şekilde gmail ile çalıştığını gösteren bu cevabı görmüyorum ...
SDsolar

@SDsolar Haklısın. Postfix sunucumda çalışıyor ve bilmiyordum. Centos kurulumu ile standart gibi görünüyor; belki DigitalOcean yapılandırdı. Halka açık bir limanda dinlemiyor. Gmail ile gönderme konusunda, amacım gerek yok, yalnızca kendinize gönderiyorsanız, kendi sunucunuzdan doğrudan gönderebilirsiniz. (Ben kendi soru sorabiliriz ve burada uymuyorsa, üzerinde bu cevabı taşıyın.)
j77h
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.