Cara termudah untuk mengirim email satu baris melalui baris perintah menggunakan gmail?

32

Menggunakan Raspbian dan Ubunntu 16.04 LTS jadi perlu solusi Linux generik.

Persyaratannya sederhana:

Saya perlu cara untuk mengirim pesan email satu-baris dari baris perintah.

Saya telah menyiapkan akun gmail hanya untuk Rpi3 ini, dengan alamat [email protected] - tanpa 2FA

Jadi sekarang saya harus dapat mengirim pesan satu baris dari mana saja (termasuk cron) tanpa campur tangan pengguna.


Saya juga ingin dapat mengirim file teks; pada dasarnya, apa pun dari stdin.

SDsolar
sumber
apakah Anda ingin pesan Anda berasal dari alamat khusus ini, [email protected] atau apakah Anda setuju bahwa pesan itu berasal dari your_username @ localhost?
John Smith
Itu memang berasal dari [email protected] jadi saya tahu komputer saya berkomunikasi kepada saya. Saya menggunakannya dalam pekerjaan cron, kebanyakan.
SDsolar

Jawaban:

33

Jawaban paling sederhana untuk mengirim pesan satu-baris melalui gmail adalah menggunakan ssmtp


Instal dengan perintah berikut:

sudo apt-get update
sudo apt-get install ssmtp

Sunting /etc/ssmtp/ssmtp.confagar terlihat seperti ini:

[email protected]
mailhub=smtp.gmail.com:465
FromLineOverride=YES
[email protected]
AuthPass=testing123
UseTLS=YES

Kirim one-liner seperti itu:

echo "Testing...1...2...3" | ssmtp [email protected]

atau

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp [email protected]

Kemudian, sesuai dengan * nix, Anda hanya mendapatkan konfirmasi kembali dalam beberapa detik.

Periksa akun [email protected] Anda, dan voila, ada di sana!


Ini juga berfungsi dengan baik saat mengirim file, karena:

cat program.py | ssmtp [email protected]

Dan program tersebut akan muncul di kotak surat

Jika file tersebut adalah file teks, itu dapat memiliki baris pertama yang mengatakan Subject: xxxxxx

Ini dapat digunakan dengan berbagai pekerjaan cron yang dapat mengirim saya data dengan baris subjek yang menunjukkan konten.


Ini akan bekerja dengan apa pun yang menyiapkan pesan yang disalurkan ke ssmtp via stdin.


Untuk detail lebih lanjut seperti mengamankan file-file ini terhadap pengguna lain dan semacamnya, kunjungi artikel ini:

Kirim Email dari Raspberry Pi Command Line


Pastikan juga melihat ke bawah ke jawaban yang diposting oleh Ruitentang mengunci FROM:alamat yang mungkin diubah dalam file pesan yang diformat, jika perlu.


Sekarang seandainya saya bisa mengetahui cara mengirim SMS dengan cara yang sama.

SDsolar
sumber
1
Saya juga menggunakan ssmtpVM saya, sangat ringan. +1
Rui F Ribeiro
1
Mengapa tidak menggunakan API sendmail dari Python dan mengirimkannya langsung?
Rui F Ribeiro
Untuk mengambil langkah ini lebih jauh, berikut adalah instruksi yang sangat sederhana untuk menyertakan file gambar sebagai lampiran: unix.stackexchange.com/questions/381131/…
SDsolar
Untuk menjawab pertanyaan Rui: sendmailsendirian tidak memiliki MTA - Mail Transport Agent untuk berkomunikasi di luar mesin. Secara default, karena Unixen adalah multi-pengguna dengan desain, sendmailakan mengirim pesan ke pengguna lain dalam kotak yang sama tetapi tidak di luar. ssmtpadalah MTA yang menurut saya paling sederhana untuk dikonfigurasi untuk gmail.
SDsolar
1
dihabiskan selamanya mencoba untuk mengatur postix ini berhasil! satu catatan untuk siapa pun yang membaca ini, conf memiliki kesalahan ketik, parameter root seharusnya gmail.com bukan gmail.
qodeninja
9

ssmtphanyalah salah satu dari banyak pembungkus Sendmail. Semua ini menerima pesan pada input standar, dan secara opsional daftar alamat sebagai argumen baris perintah, dan semuanya menawarkan nama biner sendmailyang mengimplementasikan (setidaknya fitur dasar) API baris-perintah Sendmail tradisional. Namun jika dibicarakan dengan benar, pesan itu harus berupa pesan RFC822 yang baik. Minimal, harus memiliki Subject:header.

ssmtp [email protected] <<<$'Subject: testing 1...2...3'

(Dengan ssmtp, sendmailhanyalah sebuah symlink ke ssmtp. Postfix, Exim, dan saya percaya setiap MTA lain yang Provides: mail-transport-agentmemiliki pengaturan yang sama, kecuali tentu saja di sendmailmana sendmailbiner adalah "hal yang nyata".)

Lebih umum, Anda dapat menyatukan pesan email sederhana dengan dokumen di sini.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: [email protected]

Here we interpolate the shell variable $result
____HERE

( -tOpsi Sendmail mengatakan untuk mengambil daftar penerima dari tajuk pesan yang Anda terima pada input standar. Jalur yang tepat ke Sendmail akan berbeda antar platform.)

Variasi umum lainnya adalah menggabungkan output dari beberapa perintah. Berhati-hatilah untuk memiliki garis kosong ("leher") antara header dan badan pesan.

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail [email protected]

Untuk apa pun di luar pesan teks-saja ASCII yang sangat sederhana, Anda perlu memahami cara membuat pesan MIME yang tepat, pada titik mana biasanya lebih masuk akal untuk menggunakan alat seperti mutt. Beberapa platform memiliki mailatau mailxyang tahu cara mengirim lampiran dan teks non-ASCII, tetapi ini tidak sepenuhnya portabel.

Tantangannya di sini adalah tidak menemukan klien yang dapat mengambil pesan email dan mencoba mengirimnya, itu adalah mengkonfigurasinya untuk spesifikasi Gmail, yang mengharuskan MTA untuk mengetahui nama pengguna dan kata sandi yang digunakan untuk server jarak jauh agar untuk dapat menggunakannya sebagai smarthost keluar.

Di belakang layar, sebagian besar klien suka mutt,, mailxdll biasanya hanya berjalan di sendmailbelakang layar untuk mengeluarkan pesan dari sistem.

tripleee
sumber
Saya tidak memiliki banyak keberuntungan dengan menggunakan sendmail secara langsung; maka beralih ke ssmtp. Suara positif untuk jawaban Anda. Ngomong-ngomong, untuk mengirim gambar sebagai lampiran, saya menemukan cara paling sederhana yang bisa dilakukan. Aku bahkan tidak perlu memikirkan MIME. Saya hanya menggunakan mpack, seperti dijelaskan di sini: unix.stackexchange.com/questions/381131/…
SDsolar
8

Menambahkan ke jawaban OP sendiri:

Saat mengonfigurasi ssmtp, Anda juga dapat melarang atau mengizinkan pengguna menentukan Dari, dan juga mengganti domain; Anda mungkin ingin melakukan itu karena beberapa alasan termasuk pesan yang tidak jatuh di folder Spam.

Anda dapat menambahkan ke /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

Harap dicatat bahwa sementara YES dapat digunakan dalam raspberry rumahan, itu mungkin tidak disarankan dalam sistem multi-pengguna dari sudut pandang keamanan.

Rui F Ribeiro
sumber
Suara positif. Info bagus
SDsolar
5

Apa yang salah dengan "surat"?

gema "Hai di sana" | mail -s "Email penting" [email protected]

"mail" menjadi / etc / alternative link ke / usr / bin / bsd-mailx dari paket bsd-mailx. Saya percaya itu ada di sana secara default. Utilitas hebat untuk mengirim surat dari skrip cron, misalnya.

Berfungsi di Ubuntu dan FreeBSD juga.

Edheldil
sumber
3
mailxhanyalah ujung depan. Ini membutuhkan beberapa MTA untuk dikonfigurasikan untuk benar-benar mendapatkan pesan dari sistem lokal. Ada beberapa versi yang tidak kompatibel yang umum digunakan, meskipun jika platform target Anda hanya Debian, Anda dapat mengandalkan perilaku BSD yang cukup baru.
tripleee
4

Saya sangat tidak suka menggunakan mailxini:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<[email protected]>" -c [email protected] [email protected]
Christopher
sumber
1
Beberapa opsi di sini tidak akan tersedia di banyak sistem non-Debian / non-BSD. The -apilihan pada khususnya akan menjadi indah jika didukung secara universal, tetapi hanya menelusuri mailxpertanyaan di sini untuk melihat bahwa ini cukup tentu tidak terjadi.
tripleee
2

Saya menggunakan sendEmail untuk mengirim email otomatis sederhana melalui server SMTP penyedia eksternal:

sendEmail -q -f "[email protected]" -u "mySubject" -t "[email protected]" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

Saya melewatkan semuanya pada satu baris, jadi melakukan ini pada baris perintah kemungkinan akan menampilkan semua parameter (termasuk kata sandi smtp) kepada semua pengguna, jika mereka menjalankannya ps -efsementara saya menjalankan perintah. Saya menggunakannya dalam skrip shell.

pengguna684790
sumber
1
Ini bukan pemasangan standar, dan ada banyak klien dengan nama ini. Saya kira Anda merujuk ke en.wikipedia.org/wiki/SendEmail . Apakah tersedia sebagai paket Debian?
tripleee
Pemikiran bagus tentang skrip shell, seperti pada sistem multi-pengguna. Saya suka kata sandi saya ada di file jauh di dalam nyali mesin. Saya hanya berharap saya bisa menyimpan kata sandi hash bukannya teks yang jelas.
SDsolar
Saya merujuk pada paket ini: packages.debian.org/search?keywords=sendemail
user684790
1
Saya tidak melihat jawaban ini menunjukkan bahwa ia berfungsi dengan gmail seperti yang ditentukan dalam pertanyaan asli.
SDsolar
Ini bekerja dengan gmail, mis: `-s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack
1

Server saya adalah CEntOS 7, dan memiliki sendmail tetapi tidak mailx dll. Daripada menginstal program baru yang saya uji menggunakan sendmail secara langsung, dan ternyata ini berfungsi:

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

Bagi saya ini sepertinya cara paling sederhana untuk mengirim email pendek, karena tidak memerlukan menjalankan atau mengkonfigurasi server atau daemon, dan dapat dilakukan dalam satu baris perintah.

Idenya adalah bahwa sebuah pesan hanya akan mengingatkan saya bahwa program tertentu melakukan kesalahan, tanpa mengungkapkan informasi yang berpotensi rahasia, dan kemudian saya akan SSH ke server untuk memeriksa log-nya. Dengan cara ini tidak perlu repot dengan komplikasi seperti melampirkan file atau mengenkripsi transpor.

Catatan:

  • -e memberitahu echo untuk menafsirkan '\ n' dan lolos lainnya.
  • -t memberitahu sendmail untuk mendapatkan alamat penerima dari 'To:' di header pesan.
  • Jika surat tidak sampai, gunakan tail /var/log/mailloguntuk melihat pesan kesalahan.
  • Jika mengirim ke alamat gmail Anda, buat filter di gmail untuk menjaga mereka keluar dari folder sampah.
  • Sendmail ini sebenarnya 'sendmail.postfix' (yang mungkin normal); ada halaman manual di sini
j77h
sumber
1
Sistem Anda harus memiliki MTA yang terinstal yang bekerja dengan sendmail - tapi saya tidak melihat jawaban ini menunjukkan bahwa ia bekerja dengan gmail seperti yang ditentukan dalam pertanyaan asli ...
SDsolar
@ SDolar Anda benar. Postfix berjalan di server saya, dan saya tidak tahu. Sepertinya itu standar dengan instalasi Centos; mungkin DigitalOcean mengkonfigurasinya. Itu tidak mendengarkan di port publik. Adapun pengiriman melalui gmail, maksud saya adalah Anda tidak perlu, Anda dapat mengirim langsung dari server Anda sendiri, jika Anda mengirim hanya untuk diri sendiri. (Saya mungkin mengajukan pertanyaan saya sendiri dan memindahkan jawaban ini, jika tidak cocok di sini.)
j77h