django-helpdesk/scripts/get_email.py
Ross Poulton 10158056b6 * Add README and LICENSE files
* Add e-mail templates for submitter-based emails
* Add send_multipart_email() to lib.py - sends HTML/plain emails
* Add 'Take' link to unassigned tickets on ticket detail view
* Add Description to ticket detail view
* When resolving ticket, copy comment into ticket resolution
* Display resolution and 'Accept & Close' link on ticket detail view
* Create scripts/ folder
* Added POP/IMAP details to Queue model
* Added get_email.py; polls POP/IMAP boxes & creates ticket
* Added keyword search functionality
2008-01-07 20:22:13 +00:00

126 lines
4.1 KiB
Python

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()