Получение и отправка писем в python
Как я могу получать и отправлять электронную почту в python? "Почтовый сервер".
Я ищу приложение, которое прослушивает, получает ли он электронное письмо, адресованное [email protected], и отправляет электронное письмо отправителю.
Теперь, могу ли я сделать все это на python, было бы лучше использовать сторонние библиотеки?
Ответы
Ответ 1
Вот очень простой пример:
import smtplib
server = 'mail.server.com'
user = ''
password = ''
recipients = ['[email protected]', '[email protected]']
sender = '[email protected]'
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.
Ответ 2
Я не думаю, что было бы неплохо написать настоящий почтовый сервер в Python. Это, безусловно, возможно (см. Mcrute и Manuel Ceron, чтобы иметь подробные сведения), но это большая работа, когда вы думаете обо всем, что должен обрабатывать настоящий почтовый сервер (очередь, повторная передача, работа со спамом и т.д.).
Вы должны более подробно объяснить, что вам нужно. Если вы просто хотите реагировать на входящую электронную почту, я бы предложил настроить почтовый сервер для вызова программы, когда он получает электронное письмо. Эта программа может делать то, что она хочет (обновляя базу данных, создавая файл, разговаривая с другой программой Python).
Для вызова произвольной программы с почтового сервера у вас есть несколько вариантов:
- Для sendmail и Postfix a
~/.forward
, содержащий "|/path/to/program"
- Если вы используете procmail, действие рецепта
|path/to/program
- И, конечно, многие другие
Ответ 3
Нашел полезный пример для чтения электронных писем, подключив с помощью IMAP:
Пример Python - imaplib IMAP с Gmail
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('[email protected]', '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 the body, which is raw text of the whole email
# including headers and alternate payloads
Ответ 4
Python имеет модуль SMTPD, который будет полезен вам для написания сервера. Вероятно, вы также захотите, чтобы SMTP-модуль выполнил повторную отправку. Оба модуля находятся в стандартной библиотеке, по крайней мере, начиная с версии 2.3.
Ответ 5
poplib и smtplib будут вашими друзьями при разработке вашего приложения.
Ответ 6
Отправляемая часть покрыта, для приема вы можете использовать pop или imap
Ответ 7
Да, вы можете делать почти все со встроенными библиотеками. Сделайте поиск в поиске тегов [python]
и [email]
, и вы увидите, как это делается.
Ответ 8
В зависимости от количества отправляемой почты вы можете захотеть изучить реальный почтовый сервер, такой как postifx или sendmail (* nix systems). Обе эти программы имеют возможность отправлять полученную почту в программу на основе адрес электронной почты.
Ответ 9
Лучший способ сделать это - создать службу Windows на питоне, которая получает электронные письма с помощью imaplib2
Ниже приведен пример python script, чтобы сделать то же самое. Вы можете установить этот script для запуска в качестве службы 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)