Самый простой способ отправить однострочную почту через командную строку, используя gmail?

32

Использование Raspbian и Ubunntu 16.04 LTS, поэтому нужно общее решение Linux.

Требование простое:

Мне нужен способ отправки однострочных сообщений электронной почты из командной строки.

Я настроил учетную запись Gmail только для этого конкретного Rpi3, с адресом rpi3abc@gmail.com - без 2FA

Поэтому теперь мне нужно иметь возможность отправлять однострочные почтовые сообщения из любого места (включая cron) без вмешательства пользователя.


Я также хотел бы иметь возможность отправлять текстовые файлы; в основном что-нибудь из stdin.

SDsolar
источник
Вы хотите, чтобы ваше сообщение приходило с этого конкретного адреса, rpi3abc@gmail.com, или для вас нормально, что это сообщение от вашего_пользователя @ 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 и вуаля, она есть!


Это также хорошо работает при отправке файла, например:

cat program.py | ssmtp myotherusername@yahoo.com

И программа будет отображаться в почтовом ящике

Если файл представляет собой текстовый файл, он может иметь первую строку, которая говорит Subject: xxxxxx

Это может быть использовано с различными заданиями cron, которые могут отправлять мне данные с темами, указывающими содержимое.


Это будет работать со всем, что готовит сообщение, которое передается в ssmtp через stdin.


Для получения более подробной информации, такой как защита этих файлов от других пользователей, посетите эту статью:

Отправить письмо из командной строки Raspberry Pi


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


Теперь если бы я только мог понять, как отправить SMS таким же образом.

SDsolar
источник
1
Я также использую ssmtpв своих виртуальных машинах, очень легкий. +1
Руи Ф. Рибейро
1
Почему бы не использовать API sendmail из Python и затем отправить его напрямую?
Руи Ф. Рибейро
Чтобы продвинуться дальше, вот очень простые инструкции для включения файла изображения в качестве вложения: unix.stackexchange.com/questions/381131/…
SDsolar
Чтобы ответить на вопрос Руи: в sendmailодиночку нет MTA - Mail Transport Agent для связи вне машины. По умолчанию, поскольку Unixen по своей структуре являются многопользовательскими, они sendmailбудут отправлять сообщения другим пользователям в том же окне, но не снаружи. ssmtpэто MTA, который я думаю, проще всего настроить для Gmail.
SDsolar
1
потратил навсегда, пытаясь настроить postix, это сработало! одна заметка для любого, кто читает это, conf имеет опечатку, корневым параметром должен быть 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 должен знать имя пользователя и пароль для использования на удаленном сервере, чтобы чтобы иметь возможность использовать его в качестве исходящего SmartHost.

За кулисами, как большинство клиентов mutt, mailxи т. Д., Как правило, просто sendmailскрываются, чтобы передать сообщение из системы.

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

Добавление в ОП собственного ответа:

При настройке ssmtpвы также можете запретить или разрешить пользователям определять From, а также переопределять домен; Вы можете сделать это по нескольким причинам, включая сообщение, которое не попадает в папку «Спам».

Вы можете добавить к /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

Обратите внимание, что хотя YES можно использовать в домашней малине, это не рекомендуется в многопользовательской системе с точки зрения безопасности.

Руи Ф Рибейро
источник
Upvote. Отличная информация
SDsolar
5

Что не так с "почтой"?

эхо "Привет!" mail -s "Важная почта" user@example.com

"mail" - это / etc / альтернативная ссылка на / usr / bin / bsd-mailx из пакета bsd-mailx. Я считаю, что это там по умолчанию. Отличная утилита для отправки почты из скриптов cron, например.

Работает также на Ubuntu и FreeBSD.

Edheldil
источник
3
mailxэто просто фронт. Это требует, чтобы некоторые MTA были настроены для фактического получения сообщения от локальной системы. Существует несколько несовместимых версий, но если ваша целевая платформа - только Debian, вы можете полагаться на разумное поведение BSD.
tripleee
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вопросы здесь, чтобы увидеть, что это, безусловно, не так.
tripleee
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пока я выполняю команду. Я использую это в сценарии оболочки.

user684790
источник
1
Это не стандартная установка, и есть несколько клиентов с таким именем. Я полагаю, вы имеете в виду en.wikipedia.org/wiki/SendEmail . Доступен ли он как пакет Debian?
tripleee
Хорошо подумайте о сценарии оболочки, как в многопользовательской системе. Мне нравится, что мой пароль находится в файле глубоко внутри кишки машины. Я только хотел бы сохранить хешированный пароль вместо открытого текста.
SDsolar
Я ссылался на этот пакет: packages.debian.org/search?keywords=sendemail
user684790
1
Я не вижу этот ответ, демонстрирующий, что он работает с Gmail, как указано в исходном вопросе.
SDsolar
Это работает с gmail, например: `-s smtp.gmail.com -o tls = yes -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' (что может быть нормальным); здесь есть страница руководства
j77h
источник
1
В вашей системе должен быть установлен MTA, который работает с sendmail - но я не вижу этого ответа, демонстрирующего, что он работает с gmail, как указано в исходном вопросе ...
SDsolar
@Ssolar Ты прав. Postfix работает на моем сервере, и я не знал. Похоже, это стандартно с установкой Centos; возможно DigitalOcean настроил это. Это не прослушивание в публичном порту. Что касается отправки через gmail, я хочу сказать, что вам не нужно, вы можете отправлять напрямую со своего собственного сервера, если вы отправляете только себе. (Я мог бы задать свой вопрос и переместить этот ответ, если он здесь не подходит.)
j77h