Найпростіший спосіб відправити однорядну пошту через командний рядок за допомогою gmail?


32

Використовуючи Raspbian і Ubunntu 16.04 LTS, так потрібно загальне рішення для Linux.

Вимога проста:

Мені потрібен спосіб надсилання однорядних електронних повідомлень з командного рядка.

Я створив обліковий запис gmail саме для цього конкретного Rpi3, з адресою rpi3abc@gmail.com - без 2FA

Тож тепер мені потрібно мати можливість надсилати однорядкові поштові повідомлення з будь-якого місця (включаючи cron) без втручання користувача.


Я також хотів би, щоб він міг надсилати текстові файли; в основному, що-небудь з stdin.


чи хочете, щоб ваше повідомлення надходило саме з цієї адреси, rpi3abc@gmail.com, чи це нормально для вас, що повідомлення походить від your_username @ localhost?
Джон Сміт

Він походить від rpi3abc@gmail.com, тому я знаю, що мій комп'ютер спілкується зі мною. Я в основному використовую його в роботі з cron.
SDsolar

Відповіді:


33

Найпростіша відповідь на надсилання однорядних повідомлень через gmail - це використання ssmtp


Встановіть його за допомогою наступних команд:

sudo apt-get update
sudo apt-get install ssmtp

Відредагуйте, /etc/ssmtp/ssmtp.confщоб виглядати так:

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

Надішліть однолінійку так:

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

або

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

Тоді, вірно * nix, ви просто повертаєтеся за кілька секунд назад.

Перевірте свій акаунт myusername@gmail.com та voila, він там!


Це також добре працює при надсиланні файлу:

cat program.py | ssmtp myotherusername@yahoo.com

І програма з’явиться в поштовій скриньці

Якщо файл - це текстовий файл, він може мати перший рядок із написаним Subject: xxxxxx

Це може бути використано для різних завдань cron, може надсилати мені дані з предметними рядками із зазначенням вмісту.


Це буде працювати з усім, що готує повідомлення, яке передається в ssmtp через stdin.


Більш детальну інформацію про захист цих файлів від інших користувачів перегляньте в цій статті:

Надіслати електронну пошту з командного рядка Raspberry Pi


Не забудьте також подивитися нижче на відповідь, розміщену Ruiпро блокування FROM:адреси, яку при необхідності можна змінити у форматованих файлах повідомлень.


Тепер, коли б тільки я міг зрозуміти, як відправити SMS таким же чином.


1
Я також використовую ssmtpв своїх вітринах, дуже легкі. +1
Rui F Ribeiro

1
Чому б не використовувати API sendmail з Python і не надсилати його безпосередньо тоді?
Rui F Ribeiro

Щоб зробити цей крок далі, ось дуже прості інструкції щодо включення файлу зображення як вкладення: unix.stackexchange.com/questions/381131/…
SDsolar

Щоб відповісти на запитання Руя: sendmailпоодинці немає MTA - агента поштового транспорту, який би спілкувався поза машиною. За замовчуванням, оскільки Unixen є багатокористувацькою за дизайном, sendmailбуде надсилати повідомлення іншим користувачам у тому ж полі, але не за його межами. ssmtpце MTA, який, на мою думку, найпростіше налаштувати для gmail.
SDsolar

1
витрачено назавжди, намагаючись налаштувати postix, це спрацювало! одна примітка для кожного, хто читає це, у конфіденції є помилка друку, кореневим параметром має бути gmail.com, а не gmail.
qodeninja

9

ssmtp- лише одна з багатьох обгортків Sendmail. Усі вони приймають повідомлення на стандартному введенні та необов'язково список адрес як аргументи командного рядка, і всі вони пропонують двійковий код, sendmailякий реалізує (принаймні основні функції) традиційного API командного рядка Sendmail. Але правильно кажучи, це повідомлення має бути добре сформованим повідомленням RFC822. Як мінімум, він повинен мати Subject:заголовок.

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

ssmtp, sendmailце лише символьне посилання на ssmtp. Postfix, Exim, і я вважаю, що кожен інший MTA, який Provides: mail-transport-agentмає подібне розташування, за винятком, звичайно, sendmailде sendmailдвійковий код "справжній".)

Більш часто ви можете зібрати просте повідомлення електронною поштою з документом тут.

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

Here we interpolate the shell variable $result
____HERE

(Параметр Sendmail -tговорить про те, щоб взяти список одержувачів із заголовків повідомлення, яке ви отримуєте на стандартному вході. Точний шлях до Sendmail буде відрізнятися між платформами.)

Ще одна поширена варіація полягає в об'єднанні виводу декількох команд. Слідкуйте за тим, щоб між заголовками та тілом повідомлення був порожній рядок ("шийка").

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

Для чого-небудь, крім дуже простих текстових повідомлень ASCII, вам потрібно зрозуміти, як скласти правильне MIME-повідомлення, і в цей момент зазвичай має більше сенсу використовувати такий інструмент mutt. Деякі платформи мають mailабо mailxзнають, як надсилати вкладені файли та текст, який не належить до ASCII, але це не повністю портативно.

Завдання тут полягає в тому, щоб не знайти клієнта, який може прийняти повідомлення електронної пошти та спробувати надіслати його, це налаштувати його на специфіку Gmail, яка вимагає від MTA знати ім'я користувача та пароль для віддаленого сервера для того, щоб мати змогу використовувати його як розумний хост.

За лаштунками, як правило , більшість клієнтів тощо mutt, mailxяк правило, просто біжать sendmailза лаштунками, щоб вивести повідомлення з системи.


Мені не вдасться мати велику удачу безпосередньо з використанням sendmail; отже, переходить до ssmtp. Підтвердьте свою відповідь. До речі, для того, щоб надсилати зображення як вкладення, я вважав можливим найпростіший спосіб. Мені навіть не треба думати про MIME. Я просто використовую mpack, як описано тут: unix.stackexchange.com/questions/381131/…
SDsolar

8

Додавання до власної відповіді ОП:

Під час конфігурації ssmtpви також можете заборонити або дозволити користувачам визначати "Від", а також змінювати домен; ви можете зробити це з кількох причин, включаючи те, що повідомлення не потрапляє у папку "Спам".

Ви можете додати до /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

Зверніть увагу, що хоча ТАК можна використовувати в домашній малини, це може бути недоцільним у багатокористувацькій системі з точки зору безпеки.


Оновлення Відмінна інформація.
SDsolar

5

Що не так з "поштою"?

відлуння "Привіт там" | mail -s "Важлива пошта" user@example.com

"mail", який є / etc / альтернативним посиланням на / usr / bin / bsd-mailx з пакета bsd-mailx. Я вважаю, що це за замовчуванням. Наприклад, відмінна утиліта для надсилання пошти із cron-скриптів.

Працює і на Ubuntu, і на FreeBSD.


3
mailxце лише передній кінець. Потрібно налаштувати деяку MTA, щоб фактично відключити повідомлення від локальної системи. Загальне використання є декількома несумісними версіями, хоча якщо ваша цільова платформа лише Debian, ви можете покластися на досить недавню поведінку BSD.
трійчатка

4

Я дійсно частково використовую 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
Деякі варіанти тут будуть недоступні для багатьох систем, які не є Debian / не-BSD. Зокрема, -aваріант був би чудовим, якби він підтримувався повсюдно, але просто перегляньте mailxтут питання, щоб побачити, що це, безумовно, не так.
трійчатка

2

Я використовую sendEmail для надсилання простих автоматизованих електронних листів через SMTP-сервер зовнішнього постачальника:

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"

Я передаю все в одному рядку, тому, виконуючи це в командному рядку, ймовірно, буде показано всі параметри (включаючи smtp-пароль) для всіх користувачів, якщо вони виконують деякий ps -efчас, я виконую команду. Я використовую його в сценарії оболонки.


1
Це не стандартна установка, і є кілька клієнтів з таким ім'ям. Я думаю, ви посилаєтесь на en.wikipedia.org/wiki/SendEmail . Чи доступний він як пакет Debian?
трійчатка

Добре продумує сценарій оболонки, як у багатокористувацькій системі. Мені подобається, що мій пароль знаходиться у файлі глибоко в кишечнику машини. Я б тільки хотів, щоб я міг зберігати хешований пароль замість чіткого тексту.
SDsolar

Я мав у виду цей пакет: packages.debian.org/search?keywords=sendemail
user684790

1
Я не бачу, що ця відповідь демонструє, що вона працює з gmail, як зазначено в оригінальному запитанні.
SDsolar

Це працює з gmail, напр .: `-s smtp.gmail.com -o tls = так -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

Мій сервер CEntOS 7, має sendmail, але не mailx і т. Д. Замість того, щоб встановлювати нову програму, я тестував безпосередньо за допомогою sendmail, і виявив, що це працює:

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

Мені здається, це найпростіший спосіб надіслати короткий електронний лист, оскільки він не вимагає запуску чи налаштування сервера чи демона, і це може бути зроблено в одному командному рядку.

Ідея полягає в тому, що повідомлення просто попередить мене про те, що певна програма видала помилку, не розкриваючи жодної потенційно конфіденційної інформації, і тоді я SSH на сервер перевірять її журнали. Таким чином, не потрібно турбуватися з такими ускладненнями, як прикріплення файлів або шифрування транспорту.

Примітки:

  • -e говорить ехо для інтерпретації '\ n' та інших втеч.
  • -t повідомляє sendmail отримати адреси одержувачів із "To:" у заголовку повідомлення.
  • Якщо пошта не надходить, використовуйте tail /var/log/maillogдля перегляду повідомлень про помилки.
  • Якщо ви надсилаєте на вашу gmail адресу, створіть фільтр на gmail, щоб не залишати їх у папці зі сміттям.
  • Цей sendmail насправді є "sendmail.postfix" (що може бути нормальним); там люди сторінка тут

1
У вашій системі має бути встановлений MTA, з яким працює sendmail - але я не бачу цієї відповіді, яка б засвідчила, що вона працює з gmail, як зазначено в оригінальному запитанні ...
SDsolar

@SDsolar Ти маєш рацію. Postfix працює на моєму сервері, і я не знав. Схоже, це стандарт із встановленням Centos; можливо DigitalOcean це налаштував. Це не прослуховування в публічному порту. Що стосується надсилання через gmail, я мою думку про те, що вам не потрібно, ви можете надсилати безпосередньо з власного сервера, якщо ви надсилаєте лише собі. (Я можу задати власне запитання та перенести цю відповідь, якщо вона не підходить сюди.)
j77h
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.