Назад | Перейти на главную страницу

Отправлять электронные письма из сценария оболочки без локального почтового сервера

Как я могу отправить электронную почту из сценария оболочки (обычно cronjob), не запуская почтовый сервер на том же хосте. Использование smtp-сервера. Запуск Ubuntu.

Я просмотрел различные руководства, но не нашел подходящего подхода (простого и безопасного).

Спасибо

Свен

Если это ubuntu, то у вас есть python и вы можете использовать его модуль smtplib (что означает отсутствие MTA на том же хосте). Ниже приведен небольшой образец, который поможет вам начать работу (вы можете поместить имя пользователя / pass / config в ini-файл, выполнить некоторую проверку ошибок и т. если сервер поддерживает это.). Это дает вам простоту и безопасность. Можно добавить вложения и т. Д. С небольшой дополнительной работой.

Вы бы назвали это так: mailsender.py «Это мое сообщение».

#!/usr/bin/python

import smtplib
import sys

message = sys.argv[1]

server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login('fromuser@gmail.com', 'password')
server.sendmail('fromuser@gmail.com', 'touser@somewhere.com', message)
server.rset()
server.quit()

Вы можете вызвать mailsender.py из своего задания cron или сценариев оболочки.

Вы можете установить postfix или что-то еще в режиме ретрансляции, а затем использовать mail (x) или mutt для отправки почты. Оба могут отправлять почту из командной строки.

Хорошим вариантом в Ubuntu может быть nullmailer в качестве MTA, поскольку он предназначен для работы только с реле.

Была такая же проблема, имея среду Docker и полнофункциональный MTA уже в контейнере, поэтому все типичные порты уже используются и, следовательно, не могут запускать MTA как обычно на хосте Docker, где я хочу отправлять почту каждый раз, когда завершается резервное копирование.

Благодаря @davey я смог расширить его скрипт на Python для отправки действительных писем:

#!/usr/bin/python

# script to send mail via smarthost
# (do NOT name this script "smtplib.py")

# edit settings
debuglevel   = 0
server_host  = 'localhost'
server_port  = 587
server_user  = 'me@myhost.com'
server_pass  = 'MyVerySecretP455W0RD'
address_from = 'me@myhost.com'
address_to   = 'myothermailbox@otherhost.com'
mail_subject = 'backup completed'

# load requirements
import datetime
import smtplib
import sys
# check if message was given, else show usage
try:
    sys.argv[1]
except IndexError:
    print 'No message given! Usage: ' + sys.argv[0] + ' "my test message"'
    quit(1)
else:
    msg_content = sys.argv[1]
# format mailheader
msg_content = sys.argv[1]
msg_from = "From: " + address_from + "\r\n"
msg_to = "To: " + address_to + "\r\n"
msg_subject = "Subject: " + mail_subject + "\r\n"
msg_timestamp = '{:%a, %d %b %Y %H %M:%S %z}'.format(datetime.datetime.now())
msg_date = "Date: " + msg_timestamp + "\r\n"
msg = msg_from + msg_to + msg_subject + msg_date + "\r\n" + msg_content
# connect to smarthost, login, send mail and disconnect
server = smtplib.SMTP(server_host, server_port)
server.ehlo()
server.starttls()
#server.ehlo()
server.login(server_user, server_pass)
server.set_debuglevel(debuglevel)
server.sendmail(address_from, address_to, msg)
server.rset()
server.quit()