django-helpdesk/scripts/get_email.py

126 lines
4.1 KiB
Python
Raw Normal View History

import poplib
import imaplib
from datetime import datetime, timedelta
import email, mimetypes, re
from email.Utils import parseaddr
from helpdesk.models import Queue,Ticket
from helpdesk.lib import send_multipart_mail
def process_email():
for q in Queue.objects.filter(email_box_type__isnull=False):
if not q.email_box_last_check: q.email_box_last_check = datetime.now()-timedelta(minutes=30)
if not q.email_box_interval: q.email_box_interval = 0
if (q.email_box_last_check + timedelta(minutes=q.email_box_interval)) > datetime.now():
continue
print "Processing: %s" % q
if q.email_box_type == 'pop3':
server = poplib.POP3(q.email_box_host)
server.getwelcome()
server.user(q.email_box_user)
server.pass_(q.email_box_pass)
messagesInfo = server.list()[1]
for msg in messagesInfo:
msgNum = msg.split(" ")[0]
msgSize = msg.split(" ")[1]
full_message = "\n".join(server.retr(msgNum)[1])
ticket_from_message(message=full_message, queue=q)
server.dele(msgNum)
server.quit()
elif q.email_box_type == 'imap':
if not q.email_box_port: q.email_box_port = 143
server = imaplib.IMAP4(q.email_box_host, q.email_box_port)
server.login(q.email_box_user, q.email_box_pass)
server.select(q.email_box_imap_folder)
status, data = server.search(None, 'ALL')
for num in data[0].split():
status, data = server.fetch(num, '(RFC822)')
ticket_from_message(message=data[0][1], queue=q)
server.store(num, '+FLAGS', '\\Deleted')
server.expunge()
server.close()
server.logout()
q.email_box_last_check = datetime.now()
q.save()
def ticket_from_message(message, queue):
# 'message' must be an RFC822 formatted message.
msg = message
message = email.message_from_string(msg)
subject = message.get('subject', 'Created from e-mail')
subject = subject.replace("Re: ", "").replace("Fw: ", "").strip()
sender = message.get('from', 'Unknown Sender')
sender_email = parseaddr(message.get('from', 'Unknown Sender'))[1]
regex = re.compile("^\[\d+\]")
if regex.match(subject):
# This is a reply or forward.
ticket = re.match(r"^\[(?P<id>\d+)\]", subject).group('id')
else:
ticket = None
counter = 0
files = []
for part in message.walk():
if part.get_main_type() == 'multipart':
continue
name = part.get_param("name")
if part.get_content_maintype() == 'text' and name == None:
body = part.get_payload()
else:
if name == None:
ext = mimetypes.guess_extension(part.get_content_type())
name = "part-%i%s" % (counter, ext)
files.append({'filename': name, 'content': part.get_payload(decode=True), 'type': part.get_content_type()})
counter += 1
now = datetime.now()
if ticket:
try:
t = Ticket.objects.get(id=ticket)
except:
ticket = None
if ticket == None:
t = Ticket(
title=subject,
queue=queue,
submitter_email=sender_email,
created=now,
description=body,
)
t.save()
context = {
'ticket': t,
'queue': queue,
}
if sender_email:
send_multipart_mail('helpdesk/emails/submitter_newticket', context, '%s %s' % (t.ticket, t.title), sender_email, queue.from_address)
print " [%s-%s] %s" % (t.queue.slug, t.id, t.title)
#for file in files:
#data = file['content']
#filename = file['filename'].replace(' ', '_')
#type = file['type']
#a = Attachment(followup=f, filename=filename, mimetype=type, size=len(data))
#a.save()
#print " - %s" % file['filename']
if __name__ == '__main__':
process_email()