2 ноября 2009 г.

Отправка email из командной строки

О том как отправлять сообщения через jabber, я уже написал. А вот сегодня мне захотелось написать утилитку, которая бы делала то же самое и с теми же (примерно) параметрами командной строки, но для электронной почты. Конечно, в линуксе полно консольных почтовых программ (я в курсе, что есть команда mail), но мне не нужны все их возможности, а кроме того, хотелось бы ещё и кроссплатформенности (я в курсе, что в Windows есть утилита blat) и возможности быстро самому что-то дописать. Вот, что получилось.

Не буду тянуть, сразу приведу код скрипта.
#!/usr/bin/env python
import smtplib, ConfigParser, email.mime.text, getopt, os, sys, locale

name = os.path.basename(sys.argv[0])

optlist, args = getopt.getopt(sys.argv[1:], 's:f:')
if len(args) < 2:
print "Send a message via email"
print
print "Syntax:", name, "[-f from] [-s subject] email text"
print "email\trecipient's e-mail address"
print "from\tsender's email"
print "subject\tmessage subject"
print "text\tmessage, use '-' for stdin"
sys.exit(0)

configFile = os.path.join(os.environ['HOME'], '.' + name)
config = ConfigParser.RawConfigParser()
try:
config.read(configFile)
fromEmail = config.get('From', 'E-mail')
smtpServer = config.get('SMTP', 'Server')
smtpLogin = config.get('SMTP', 'Login')
smtpPassword = config.get('SMTP', 'Password')
except:
print "Default configuration was written to", configFile
config.add_section('From')
config.set('From', 'E-mail', 'user@example.com')
config.add_section('SMTP')
config.set('SMTP', 'Server', 'smtp.example.com')
config.set('SMTP', 'Login', 'user')
config.set('SMTP', 'Password', '********')
f = file(configFile, 'w')
config.write(f)
f.close()
sys.exit(0)

toEmail = args[0]
subject = ''
for option, value in optlist:
if option == '-s':
subject = value
elif option == '-f':
fromEmail = value

encoding = locale.getpreferredencoding()
if args[1] == '-':
message = email.mime.text.MIMEText(sys.stdin.read(), 'plain', encoding)
else:
message = email.mime.text.MIMEText(' '.join(args[1:]), 'plain', encoding)

message['Subject'] = subject
message['From'] = fromEmail
message['To'] = toEmail

server = smtplib.SMTP(smtpServer)
server.login(smtpLogin, smtpPassword)
server.sendmail(message['From'], message['To'], message.as_string())
server.quit()
Всё это сохраняем в файл с именем, например, «mailto» и даём права на выполнение:
chmod +x mailto
После первого создаётся файл с настройками подключения. По умолчанию это файл «.mailto» (если скрипт называется «mailto», конечно) в домашнем каталоге. В нём нужно указать адрес отправителя и настройки smtp-сервера.

Параметров у скрипта минимум, только то, что нужно. Есть два опциональных для указания темы сообщения и адреса отправителя (по умолчанию берётся из файла с настройками). Для них используются ключи «-s» и «-f» соответственно (от слов «From» и «Subject»).

Обязательных параметров всего два и они без ключей. Это адрес получателя собственно текст сообщения. Если вместо текста поставить «-», то текст будет браться из стандартного входа, что удобно для отправки результатов вывода какой-то программы.

Использовать программу можно для чего угодно. Например, чтобы отправить список пользователей себе на ящик можно воспользоваться командой:
who | mailto user@example.com -
Я, например, использую этот скрипт, чтобы автоматически в определённое время слать себе СМС с напоминанием о чём-либо через гейт «email—SMS» моего мобильного оператора. Получилось удобно.

1 комментарий: