Получать и отправлять электронные письма в Python - PullRequest
37 голосов
/ 08 декабря 2008

Как я могу получать и отправлять электронную почту на python? Почтовый сервер своего рода.

Я пытаюсь создать приложение, которое прослушивает, чтобы узнать, получает ли оно электронное письмо, адресованное по адресу foo@bar.domain.com, и отправляет его отправителю.

Теперь, могу ли я сделать все это на python, лучше ли будет использовать сторонние библиотеки?

Ответы [ 9 ]

23 голосов
/ 08 декабря 2008

Вот очень простой пример:

import smtplib

server = 'mail.server.com'
user = ''
password = ''

recipients = ['user@mail.com', 'other@mail.com']
sender = 'you@mail.com'
message = 'Hello World'

session = smtplib.SMTP(server)
# if your SMTP server doesn't need authentications,
# you don't need the following line:
session.login(user, password)
session.sendmail(sender, recipients, message)

Дополнительные параметры, обработку ошибок и т. Д. См. В документации по smtplib для модуля .

13 голосов
/ 06 ноября 2014

Найден полезный пример для чтения электронных писем при подключении с использованием IMAP:

Python - пример IMAPLIB IMAPLIB с Gmail

import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('myusername@gmail.com', 'mypassword')
mail.list()
# Out: list of "folders" aka labels in gmail.
mail.select("inbox") # connect to inbox.
result, data = mail.search(None, "ALL")

ids = data[0] # data is a list.
id_list = ids.split() # ids is a space separated string
latest_email_id = id_list[-1] # get the latest

# fetch the email body (RFC822) for the given ID
result, data = mail.fetch(latest_email_id, "(RFC822)") 

raw_email = data[0][1] # here's the body, which is raw text of the whole email
# including headers and alternate payloads
12 голосов
/ 08 декабря 2008

Не думаю, что было бы неплохо написать настоящий почтовый сервер на Python. Это, конечно, возможно (подробности см. В сообщениях Макруте и Мануэля Церона), но вам нужно много работы, когда вы думаете обо всем, что должен обрабатывать настоящий почтовый сервер (очереди, повторная передача, обработка спама и т. Д.).

Вы должны объяснить более подробно, что вам нужно. Если вы просто хотите реагировать на входящую электронную почту, я бы предложил настроить почтовый сервер для вызова программы при получении электронной почты. Эта программа может делать то, что она хочет (обновление базы данных, создание файла, общение с другой программой Python).

Чтобы вызвать произвольную программу с почтового сервера, у вас есть несколько вариантов:

  1. Для sendmail и Postfix, ~/.forward содержит "|/path/to/program"
  2. Если вы используете procmail, действие рецепта |path/to/program
  3. И, конечно, многие другие
7 голосов
/ 08 декабря 2008

В Python есть модуль SMTPD, который будет вам полезен при написании сервера. Вы, вероятно, также захотите, чтобы модуль SMTP сделал повторную отправку. Оба модуля находятся в стандартной библиотеке как минимум с версии 2.3.

4 голосов
/ 08 декабря 2008

poplib и smtplib станут вашими друзьями при разработке приложения.

3 голосов
/ 08 декабря 2008

Отправляющая часть покрыта, для получения вы можете использовать pop или imap

2 голосов
/ 08 декабря 2008

В зависимости от количества отправляемой вами почты, вы можете захотеть использовать реальный почтовый сервер, такой как postifx или sendmail (системы * nix). Обе эти программы имеют возможность отправлять полученную почту в программу на основе адрес электронной почты.

2 голосов
/ 08 декабря 2008

Да, вы можете делать практически все с помощью встроенных библиотек. Выполните поиск здесь для поиска тегов [python] и [email], и вы увидите, как это делается.

1 голос
/ 04 июня 2015

Лучший способ сделать это - создать на python службу windows, которая будет получать электронные письма, используя imaplib2

Ниже приведен пример сценария Python для того же. Вы можете установить этот сценарий для запуска в качестве службы Windows, выполнив следующую команду в командной строке "python THENAMEOFYOURSCRIPTFILE.py install".

import win32service
import win32event
import servicemanager
import socket
import imaplib2, time
from threading import *
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import datetime
import email

class Idler(object):
    def __init__(self, conn):
        self.thread = Thread(target=self.idle)
        self.M = conn
        self.event = Event()

    def start(self):
        self.thread.start()

    def stop(self):
        self.event.set()

    def join(self):
        self.thread.join()

    def idle(self):
        while True:
            if self.event.isSet():
                return
            self.needsync = False
            def callback(args):
                if not self.event.isSet():
                    self.needsync = True
                    self.event.set()
            self.M.idle(callback=callback)
            self.event.wait()
            if self.needsync:
                self.event.clear()
                self.dosync()


    def dosync(self):
        #DO SOMETHING HERE WHEN YOU RECEIVE YOUR EMAIL

class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "receiveemail"
    _svc_display_name_ = "receiveemail"


    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        M = imaplib2.IMAP4_SSL("imap.gmail.com", 993)
        M.login("YourID", "password")
        M.select("INBOX")
        idler = Idler(M)
        idler.start()
        while True:
            time.sleep(1*60)
        idler.stop()
        idler.join()
        M.close()
        M.logout()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...