-
Работа с файлами mailbox
Чем хорош почтовый клиент Mozilla Thunderbird?
Хотя бы тем, что хранит письма в удобном формате mailbox. Благодрая этому можно рулить почтой программно: считывать содержимое ящика, удалять и добавлять письма.
Зачем это может понадобитсья? Например, каждый день вам на почту приходят реестры платежей, которые нужно выгрузить из аттача, распаковать, и, в зависимости от имени файла, скопировать в определенную директорию. Напрашивается автоматизация процесса.
В составе богатой библиотеки Питона есть модуль mailbox. Небольшой пример:
import os import cgitb cgitb.enable(display=False, logdir=os.path.dirname(__file__)) import mailbox MAILBOX_PATH = "path/to/mailbox.file" # Путь к файлу ящика DATA_PATH = "store/path" # Директория для файлов mbox = mailbox.mbox(MAILBOX_PATH, create=False) for i, message in enumerate(mbox): attachments = message.get_payload() for attachment in attachments: filename = attachment.get_filename() if filename and filename.endswith(".txt"): body = attachment.get_payload(decode=True) filepath = os.path.join(DATA_PATH, filename) with open(filepath, "w") as f: f.write(body) mbox.remove(i) mbox.close()
Основной цикл обходит все письма в ящике. Переменная attachments — это список частей письма. Частью может быть всё — простой текст, HTML-сообщение, файловое вложение и т.д.
get_filename()
возвращает имя части. Для файлов оно будет отлично от None. Нас интересуют только текстовые файлы. Тело файла извлекается методомget_payload()
части.При передаче файла он может быть закодирован методами base64 или uuencode. Чтобы получить исходный файл, передается параметр
decode=True
. Полученный файл пишется на диск.Сообщение удаляется из ящика. По окончании цикла ящик закрывается.
-
Рассылка смс в Питоне
Отправлять короткие сообщения можно с помощью любого из многочисленных сервисов смс-рассылок.
Я остановил свой выбор на LittleSMS. Низкая фиксированная цена, удобные API, подробная документация, готовые решения для многих языков и платформ.
Работа с сервисом осуществляется по протоколу HTTP GET-запросами. При регистрации вы получите API-ключ. Этим ключом подписываются все запросы. Ключ не является паролем к учетной записи. Если ключ где-то засветился, немедленно смените его в личном кабинете сервиса.
Для Питона рекомендую использовать мою библиотеку с Гитхаба.
Пример работы:
import littlesms # Инициализация класса api = littlesms.Api("user", "API_key") # Проверка баланса. print api.balance() >>> {u'status': u'success', u'balance': 0.5} # Отправка сообщения. print api.send(u"Hello, World!", "7xxxxxxxxxx") >>> { u'count': 1, u'status': u'success', u'recipients': [u'7xxxxxxxxxx'], u'price': 0.5, u'parts': 1, u'test': 0, u'balance': 0.5, u'messages_id': [u'xxxxxx'] } # Отправка сообщения нескольким адресатам с подменой поля «отправитель». recipients = ("7xxxxxxxxx1", "7xxxxxxxxx2", "7xxxxxxxxx3") print api.send(u"Hello, World!", recipients, sender="Anonym") >>> { u'count': 1, u'status': u'success', u'recipients': [u'7xxxxxxxxx1', u'7xxxxxxxxx2', u'7xxxxxxxxx3'], u'price': 0.5, u'parts': 1, u'test': 0, u'balance': 0.5, u'messages_id': [u'xxxxxx1', u'xxxxxx2', u'xxxxxx3'] } # Если компьютер расположен за прокси со сложной схемой авторизации. PROXY = { "proxy": "172.27.86.8", "port": 3128, "user": "ivan", "passw": "secret" } opener = littlesms.curl_opener(**PROXY) api = littlesms.Api("user", "API_key", opener=opener) # Пример работы в облачной платформе App Engine. opener = littlesms.gae_opener() api = littlesms.Api("user", "API_key", opener=opener) # Пример обработки исключения. try: print api.send(u"Hello, World!", "7xxxxxxxxxx", sender="TooLongSender!!!111") except littlesms.ApiError, e: print e >>> Error 7: incorrect sender
Библиотека активно используется больше года в проекте личного кабинета Читинской энергосбытовой компании. На текущий момент отправлено около 15000 сообщений.