implemented first version of outlook.py for MailCrawling
added configuration management for ui using agent.config folder mails is a proposal how to store mails (contains some samples) git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1887 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
740aeca367
commit
874d96c94b
21 changed files with 1070 additions and 115 deletions
232
agent/.loops.agent.cfg
Normal file
232
agent/.loops.agent.cfg
Normal file
|
@ -0,0 +1,232 @@
|
|||
crawl[0].content_format = 'text'
|
||||
crawl[0].filter_criteria = 'sender'
|
||||
crawl[0].filter_pattern = 'MAIL1'
|
||||
crawl[0].folder = 'Inbox'
|
||||
crawl[0].getsubfolder = 'No'
|
||||
crawl[0].include_attachements = 'Yes'
|
||||
crawl[0].interval = 'oneTime'
|
||||
crawl[0].jobid = 'outlook0'
|
||||
crawl[0].latest = ''
|
||||
crawl[0].state = 'completed'
|
||||
crawl[0].type = 'OutlookMail'
|
||||
crawl[10].content_format = 'text'
|
||||
crawl[10].filter_criteria = 'sender'
|
||||
crawl[10].filter_pattern = ''
|
||||
crawl[10].folder = 'Inbox'
|
||||
crawl[10].getsubfolder = 'Yes'
|
||||
crawl[10].include_attachements = 'Yes'
|
||||
crawl[10].interval = 'oneTime'
|
||||
crawl[10].jobid = 'outlook10'
|
||||
crawl[10].latest = ''
|
||||
crawl[10].state = 'completed'
|
||||
crawl[10].type = 'OutlookMail'
|
||||
crawl[11].content_format = 'text'
|
||||
crawl[11].filter_criteria = 'sender'
|
||||
crawl[11].filter_pattern = ''
|
||||
crawl[11].folder = 'Inbox'
|
||||
crawl[11].getsubfolder = 'Yes'
|
||||
crawl[11].include_attachements = 'Yes'
|
||||
crawl[11].interval = 'oneTime'
|
||||
crawl[11].jobid = 'outlook11'
|
||||
crawl[11].latest = ''
|
||||
crawl[11].state = 'completed'
|
||||
crawl[11].type = 'OutlookMail'
|
||||
crawl[12].content_format = 'text'
|
||||
crawl[12].filter_criteria = 'sender'
|
||||
crawl[12].filter_pattern = ''
|
||||
crawl[12].folder = 'Inbox'
|
||||
crawl[12].getsubfolder = 'Yes'
|
||||
crawl[12].include_attachements = 'Yes'
|
||||
crawl[12].interval = 'oneTime'
|
||||
crawl[12].jobid = 'outlook12'
|
||||
crawl[12].latest = ''
|
||||
crawl[12].state = 'completed'
|
||||
crawl[12].type = 'OutlookMail'
|
||||
crawl[13].content_format = 'text'
|
||||
crawl[13].filter_criteria = 'sender'
|
||||
crawl[13].filter_pattern = ''
|
||||
crawl[13].folder = 'Inbox'
|
||||
crawl[13].getsubfolder = 'Yes'
|
||||
crawl[13].include_attachements = 'Yes'
|
||||
crawl[13].interval = 'oneTime'
|
||||
crawl[13].jobid = 'outlook13'
|
||||
crawl[13].latest = ''
|
||||
crawl[13].state = 'completed'
|
||||
crawl[13].type = 'OutlookMail'
|
||||
crawl[14].content_format = 'text'
|
||||
crawl[14].filter_criteria = 'sender'
|
||||
crawl[14].filter_pattern = ''
|
||||
crawl[14].folder = 'Inbox'
|
||||
crawl[14].getsubfolder = 'Yes'
|
||||
crawl[14].include_attachements = 'Yes'
|
||||
crawl[14].interval = 'oneTime'
|
||||
crawl[14].jobid = 'outlook14'
|
||||
crawl[14].latest = ''
|
||||
crawl[14].state = 'completed'
|
||||
crawl[14].type = 'OutlookMail'
|
||||
crawl[15].content_format = 'text'
|
||||
crawl[15].filter_criteria = 'sender'
|
||||
crawl[15].filter_pattern = ''
|
||||
crawl[15].folder = 'Inbox'
|
||||
crawl[15].getsubfolder = 'Yes'
|
||||
crawl[15].include_attachements = 'Yes'
|
||||
crawl[15].interval = 'oneTime'
|
||||
crawl[15].jobid = 'outlook15'
|
||||
crawl[15].latest = ''
|
||||
crawl[15].state = 'completed'
|
||||
crawl[15].type = 'OutlookMail'
|
||||
crawl[16].content_format = 'text'
|
||||
crawl[16].filter_criteria = 'sender'
|
||||
crawl[16].filter_pattern = ''
|
||||
crawl[16].folder = 'Inbox'
|
||||
crawl[16].getsubfolder = 'Yes'
|
||||
crawl[16].include_attachements = 'Yes'
|
||||
crawl[16].interval = 'oneTime'
|
||||
crawl[16].jobid = 'outlook16'
|
||||
crawl[16].latest = ''
|
||||
crawl[16].state = 'completed'
|
||||
crawl[16].type = 'OutlookMail'
|
||||
crawl[17].content_format = 'text'
|
||||
crawl[17].filter_criteria = 'sender'
|
||||
crawl[17].filter_pattern = ''
|
||||
crawl[17].folder = 'Inbox'
|
||||
crawl[17].getsubfolder = 'Yes'
|
||||
crawl[17].include_attachements = 'Yes'
|
||||
crawl[17].interval = 'oneTime'
|
||||
crawl[17].jobid = 'outlook17'
|
||||
crawl[17].latest = ''
|
||||
crawl[17].state = 'completed'
|
||||
crawl[17].type = 'OutlookMail'
|
||||
crawl[18].content_format = 'text'
|
||||
crawl[18].filter_criteria = 'sender'
|
||||
crawl[18].filter_pattern = ''
|
||||
crawl[18].folder = 'Inbox'
|
||||
crawl[18].getsubfolder = 'Yes'
|
||||
crawl[18].include_attachements = 'Yes'
|
||||
crawl[18].interval = 'oneTime'
|
||||
crawl[18].jobid = 'outlook18'
|
||||
crawl[18].latest = ''
|
||||
crawl[18].state = 'completed'
|
||||
crawl[18].type = 'OutlookMail'
|
||||
crawl[19].content_format = 'text'
|
||||
crawl[19].filter_criteria = 'sender'
|
||||
crawl[19].filter_pattern = ''
|
||||
crawl[19].folder = 'Inbox'
|
||||
crawl[19].getsubfolder = 'Yes'
|
||||
crawl[19].include_attachements = 'Yes'
|
||||
crawl[19].interval = 'oneTime'
|
||||
crawl[19].jobid = 'outlook19'
|
||||
crawl[19].latest = ''
|
||||
crawl[19].state = 'completed'
|
||||
crawl[19].type = 'OutlookMail'
|
||||
crawl[1].content_format = 'text'
|
||||
crawl[1].filter_criteria = 'subject'
|
||||
crawl[1].filter_pattern = 'MAIL2'
|
||||
crawl[1].folder = 'Inbox'
|
||||
crawl[1].getsubfolder = 'No'
|
||||
crawl[1].include_attachements = 'Yes'
|
||||
crawl[1].interval = 'oneTime'
|
||||
crawl[1].jobid = 'outlook1'
|
||||
crawl[1].latest = ''
|
||||
crawl[1].state = 'completed'
|
||||
crawl[1].type = 'OutlookMail'
|
||||
crawl[20].content_format = 'text'
|
||||
crawl[20].filter_criteria = 'sender'
|
||||
crawl[20].filter_pattern = ''
|
||||
crawl[20].folder = 'Inbox'
|
||||
crawl[20].getsubfolder = 'Yes'
|
||||
crawl[20].include_attachements = 'Yes'
|
||||
crawl[20].interval = 'oneTime'
|
||||
crawl[20].jobid = 'outlook20'
|
||||
crawl[20].latest = ''
|
||||
crawl[20].state = 'completed'
|
||||
crawl[20].type = 'OutlookMail'
|
||||
crawl[2].content_format = 'text'
|
||||
crawl[2].filter_criteria = 'receiver'
|
||||
crawl[2].filter_pattern = 'Project'
|
||||
crawl[2].folder = 'Inbox'
|
||||
crawl[2].getsubfolder = 'No'
|
||||
crawl[2].include_attachements = 'Yes'
|
||||
crawl[2].interval = 'oneTime'
|
||||
crawl[2].jobid = 'outlook2'
|
||||
crawl[2].latest = ''
|
||||
crawl[2].state = 'completed'
|
||||
crawl[2].type = 'OutlookMail'
|
||||
crawl[3].content_format = 'text'
|
||||
crawl[3].filter_criteria = 'sender'
|
||||
crawl[3].filter_pattern = 'Test'
|
||||
crawl[3].folder = 'Inbox'
|
||||
crawl[3].getsubfolder = 'Yes'
|
||||
crawl[3].include_attachements = 'Yes'
|
||||
crawl[3].interval = 'oneTime'
|
||||
crawl[3].jobid = 'outlook3'
|
||||
crawl[3].latest = ''
|
||||
crawl[3].state = 'completed'
|
||||
crawl[3].type = 'OutlookMail'
|
||||
crawl[4].content_format = 'text'
|
||||
crawl[4].filter_criteria = 'subject'
|
||||
crawl[4].filter_pattern = 'savetoFile'
|
||||
crawl[4].folder = 'Inbox'
|
||||
crawl[4].getsubfolder = 'No'
|
||||
crawl[4].include_attachements = 'Yes'
|
||||
crawl[4].interval = 'oneTime'
|
||||
crawl[4].jobid = 'outlook4'
|
||||
crawl[4].latest = ''
|
||||
crawl[4].state = 'completed'
|
||||
crawl[4].type = 'OutlookMail'
|
||||
crawl[5].content_format = 'text'
|
||||
crawl[5].filter_criteria = 'subject'
|
||||
crawl[5].filter_pattern = 'savetoFile'
|
||||
crawl[5].folder = 'Inbox'
|
||||
crawl[5].getsubfolder = 'No'
|
||||
crawl[5].include_attachements = 'Yes'
|
||||
crawl[5].interval = 'oneTime'
|
||||
crawl[5].jobid = 'outlook5'
|
||||
crawl[5].latest = ''
|
||||
crawl[5].state = 'completed'
|
||||
crawl[5].type = 'OutlookMail'
|
||||
crawl[6].content_format = 'text'
|
||||
crawl[6].filter_criteria = 'subject'
|
||||
crawl[6].filter_pattern = ''
|
||||
crawl[6].folder = 'Inbox'
|
||||
crawl[6].getsubfolder = 'No'
|
||||
crawl[6].include_attachements = 'Yes'
|
||||
crawl[6].interval = 'oneTime'
|
||||
crawl[6].jobid = 'outlook6'
|
||||
crawl[6].latest = ''
|
||||
crawl[6].state = 'completed'
|
||||
crawl[6].type = 'OutlookMail'
|
||||
crawl[7].content_format = 'text'
|
||||
crawl[7].filter_criteria = 'sender'
|
||||
crawl[7].filter_pattern = ''
|
||||
crawl[7].folder = 'Inbox'
|
||||
crawl[7].getsubfolder = 'No'
|
||||
crawl[7].include_attachements = 'Yes'
|
||||
crawl[7].interval = 'oneTime'
|
||||
crawl[7].jobid = 'outlook7'
|
||||
crawl[7].latest = ''
|
||||
crawl[7].state = 'completed'
|
||||
crawl[7].type = 'OutlookMail'
|
||||
crawl[8].content_format = 'text'
|
||||
crawl[8].filter_criteria = 'sender'
|
||||
crawl[8].filter_pattern = ''
|
||||
crawl[8].folder = 'Inbox'
|
||||
crawl[8].getsubfolder = 'Yes'
|
||||
crawl[8].include_attachements = 'Yes'
|
||||
crawl[8].interval = 'oneTime'
|
||||
crawl[8].jobid = 'outlook8'
|
||||
crawl[8].latest = ''
|
||||
crawl[8].state = 'completed'
|
||||
crawl[8].type = 'OutlookMail'
|
||||
crawl[9].content_format = 'text'
|
||||
crawl[9].filter_criteria = 'subject'
|
||||
crawl[9].filter_pattern = 'MailCrawler'
|
||||
crawl[9].folder = 'Inbox'
|
||||
crawl[9].getsubfolder = 'Yes'
|
||||
crawl[9].include_attachements = 'Yes'
|
||||
crawl[9].interval = 'oneTime'
|
||||
crawl[9].jobid = 'outlook9'
|
||||
crawl[9].latest = ''
|
||||
crawl[9].state = 'completed'
|
||||
crawl[9].type = 'OutlookMail'
|
||||
ui.web.usermode = 'Simple'
|
|
@ -12,7 +12,7 @@ import win32com.client
|
|||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
# DEBUG FLAGS
|
||||
DEBUG = 1
|
||||
DEBUG = 0
|
||||
DEBUG_WRITELINE = 1
|
||||
|
||||
# some constants
|
||||
|
@ -77,7 +77,7 @@ class MSOutlook:
|
|||
msg['Subject'] = record['Subject'].encode('utf-8')
|
||||
|
||||
# sender
|
||||
sender = str(record['SenderEmailAddress'].encode('utf-8'))
|
||||
sender = str(record['SenderName'].encode('utf-8')) #SenderEmailAddress
|
||||
msg['From'] = sender
|
||||
|
||||
#recipients
|
||||
|
@ -135,7 +135,7 @@ class MSOutlook:
|
|||
msg['Subject'] = record['Subject'].encode('utf-8')
|
||||
|
||||
# sender
|
||||
sender == record['SenderEmailAddress'].encode('utf-8')
|
||||
sender == record['SenderName'].encode('utf-8') #SenderEmailAddress
|
||||
msg['From'] = sender
|
||||
|
||||
# recipients
|
||||
|
@ -157,7 +157,7 @@ class MSOutlook:
|
|||
# get Count-Attribute of _Folders class
|
||||
iInboxSubfoldersCount = getattr(lInboxSubfolders, 'Count')
|
||||
# the Item-Method of the _Folders class returns a MAPIFolder object
|
||||
oFolder = lInboxSubfolders.Item(1)
|
||||
oFolder = lInboxSubfolders.Item(0) #1
|
||||
|
||||
print 'Count of Inbox-SubFolders:', iInboxSubfoldersCount
|
||||
print 'Inbox sub folders (Folder/Mails):'
|
||||
|
@ -183,15 +183,16 @@ if __name__ == '__main__':
|
|||
sys.exit(1)
|
||||
|
||||
fieldsMail = ['Body',
|
||||
'BodyFormat',
|
||||
'HTMLBody',
|
||||
'CC',
|
||||
'SenderEmailAddress',
|
||||
'SenderName',
|
||||
'Recipients',
|
||||
'To',
|
||||
'Attachments',
|
||||
'Subject'
|
||||
]
|
||||
# 'BodyFormat', removed BodyFormat temporarily because it is not available in Outlook.9 (Office2000)
|
||||
# 'SenderEmailAddress', replaced by SenderName
|
||||
|
||||
if DEBUG:
|
||||
import time
|
||||
|
@ -199,10 +200,13 @@ if __name__ == '__main__':
|
|||
startTime = time.time()
|
||||
|
||||
mails = oOutlook.loadInbox(fieldsMail)
|
||||
|
||||
for elem in mails:
|
||||
print str(elem)
|
||||
|
||||
if DEBUG_WRITELINE:
|
||||
print '***Back in main() with some emails in a list....***'
|
||||
print 'Mails fetched from MSOutlook inbox folder:', mails.__len__()
|
||||
|
||||
if DEBUG:
|
||||
print 'loading took %f seconds' % (time.time() - startTime)
|
||||
print 'loading took %f seconds' % (time.time() - startTime)
|
||||
|
|
79
agent/mails/Mail0
Normal file
79
agent/mails/Mail0
Normal file
|
@ -0,0 +1,79 @@
|
|||
From nobody Wed Aug 08 17:38:02 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1611091771=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Willkommen bei Microsoft Outlook 2000!
|
||||
From: Microsoft Outlook 2000
|
||||
To:
|
||||
|
||||
<http://outlook/outlook9/specs/welcomemsg/icons.gif>
|
||||
<http://outlook/outlook9/specs/welcomemsg/yellowbg.gif>
|
||||
<http://outlook/outlook9/specs/welcomemsg/olicon.GIF>
|
||||
Willkommen bei
|
||||
Microsoft Outlook 2000
|
||||
Das Fenster zu Ihrer Informationswelt
|
||||
Microsoft(R) Outlook(R) 2000 <http://www.microsoft.com/germany/office/outlook>ist die führende Clientsoftware für Kommunikation und Zusammenarbeit, mit der Sie Ihre Arbeitsabläufe optimieren können. Outlook kombiniert auf führendem Leistungsniveau
|
||||
E-Mail-Funktionen (Internet- und Microsoft Exchange Server-Standards) mit integrierten Managementfunktionen für Aufgaben, Kontakte und den Kalender.
|
||||
In Outlook werden Informationen in Ordnern organisiert. Beim Starten von Outlook wird der Ordner “Posteingang” geöffnet. Verwenden Sie den Posteingang, um E-Mail-Nachrichten sowie Besprechungs- und Aufgabenanfragen zu lesen und zu senden.
|
||||
|
||||
Um eine neue Nachricht zu erstellen, zeigen Sie im Menü "Datei" auf "Neu", und klicken Sie dann auf "Nachricht". Tragen Sie in den Feldern "An" und "Cc" die Namen der Empfänger ein, im Feld "Betreff" das Thema der Nachricht, und verfassen Sie die Nachricht anschließend im Textfeld. Wenn Sie die Nachricht zum Senden fertig gestellt haben, klicken Sie auf "Senden".
|
||||
|
||||
Um schnell zu einer anderen Outlook-Komponente zu wechseln, klicken Sie auf die entsprechende Verknüpfung auf der Outlook-Leiste, die sich links neben dem Posteingang befindet. Klicken Sie z.B. auf Kalender, um den Kalenderordner zu öffnen. Die Ordnerleiste (die horizontale Leiste oberhalb des Informationsbereichs) zeigt den Namen des geöffneten Ordners an. Um eine vollständige Liste mit allen Ordnern anzuzeigen, klicken Sie in der Ordnerleiste auf den Ordnernamen.
|
||||
|
||||
Hier sind einige der neuen Funktionen in Outlook 2000:
|
||||
|
||||
Outlook(R) Heute stellt Ihre E-Mail-, Kalender- und Aufgaben-Information in einem Fenster übersichtlich dar. Outlook Heute kann mit einem Klick auf das entsprechende Symbol auf der Outlook-Leiste gestartet werden. Sie können Outlook Heute auch als Ihr Standardfenster beim Starten von Outlook einstellen, damit Sie die Prioritäten für Ihren Arbeitstag mit einem Blick festlegen können.
|
||||
|
||||
In der Outlook-Leiste können Sie Verknüpfungen zu Dateien, Ordnern oder Webseiten erstellen. Sie können auf der Outlook-Leiste auf eine Verknüpfung zu einer Webseite klicken, und diese Seite dann im Outlook-Fenster auf der rechten Seite ansehen.
|
||||
|
||||
Senden und empfangen Sie Ihre E-Mail im HTML-Format, um Ihre Nachrichten so eindrucksvoll zu gestalten wie Webinhalt.
|
||||
|
||||
Nutzen Sie die Vorteile, die sich aus der Internet-Protokollunterstützung von Outlook 2000 für POP3/SMTP, IMAP4, LDAP, NNTP, S/MIME, HTML Mail, vCard, vCalendar und iCalendar ergeben.
|
||||
|
||||
Das innovative Suchprogramm verwendet eine Suche im Webstil: Sie geben die Information ein, nach der gesucht wird. Auf diese Weise finden Sie schnell Nachrichten, Termine und Aufgaben.
|
||||
|
||||
Gestalten Sie Ihre Arbeit übersichtlicher, indem Sie die Schaltfläche "Organisieren" auf der Symbolleiste verwenden, um auf einfache Weise den Inhalt eines Ordners zu organisieren, Regeln zu erstellen und Junk-E-Mail herauszufiltern.
|
||||
|
||||
Mit einem einzigen Befehl können Sie nun Ihren persönlichen oder den Team-Kalender als Webseite veröffentlichen.
|
||||
|
||||
Erstellen und speichern Sie Ihre persönlichen Verteilerlisten zusammen mit Ihren Kontakten im Kontakteordner.
|
||||
|
||||
Mit der Serienbrieffunktion für E-Mail-, Fax- oder Briefversand können Sie Ihre Massenpost verwalten, wobei Sie selber entscheiden können, welche Kontakte und Kontaktfelder für die Serienbrieferstellung verwendet werden sollen.
|
||||
|
||||
Verwenden Sie die Registerkarte "Aktivitäten" eines Kontaktelements, um unter anderem die Nachrichten, Termine und Aufgaben eines bestimmten Kontakts dynamisch zu verfolgen und anzuzeigen.
|
||||
|
||||
Für weitere Informationen:
|
||||
|
||||
Besuchen Sie die Office Update-Website unter http://officeupdate.microsoft.com/germany/outlook <http://officeupdate.microsoft.com/office/redirect/fromOffice9/OutlookWelcome.htm?HelpLCID=1031>. Hier lernen Sie, wie Sie das Beste aus Microsoft(R) Outlook(R) 2000 herausholen können.
|
||||
|
||||
Erweitern Sie die Nützlichkeit von Outlook 2000 mit neuen Add-Ins, Dienstprogrammen und anderen Downloads.
|
||||
|
||||
|
||||
|
||||
Vereinfachen Sie die Verwendung von Outlook 2000 noch weiter mithilfe von zeitsparenden Tipps und Ratschlägen zur Problemlösung.
|
||||
|
||||
|
||||
|
||||
Feedback, Antworten auf häufig gestellte Fragen (FAQs) und Tipps finden Sie in unseren öffentlichen Newsgroups für Outlook 2000.
|
||||
|
||||
|
||||
|
||||
Lernen Sie, wie Sie mit Spezialangeboten und einer Vielzahl von Add-On-Produkten von Drittanbietern die Funktionalität von Outlook 2000 erweitern.
|
||||
|
||||
|
||||
|
||||
Beschaffen Sie sich eine Liste der häufigsten Support-Fragen zu Outlook 2000.
|
||||
|
||||
|
||||
|
||||
Hier finden Sie auch die aktuellsten Softwareupdates für Outlook 2000.
|
||||
|
||||
Wir hoffen, dass Ihnen die Arbeit mit Microsoft Outlook, einem der vollständigsten, zurzeit
|
||||
erhältlichen E-Mail-Programme, Vergnügen bereiten wird!
|
||||
|
||||
- Ihr Microsoft Outlook-Team
|
||||
|
||||
|
||||
Microsoft Internet Explorer <http://www.microsoft.com/windows/ie_intl/de/> Microsoft Office <http://www.microsoft.com/germany/office/> Microsoft Exchange Server <http://www.microsoft.com/germany/backoffice/exchange/> Microsoft NetMeeting <http://www.microsoft.com/windows/ie_intl/de/netmeeting/> Microsoft Windows Media Technologies <http://www.microsoft.com/windows/windowsmedia>
|
||||
--===============1611091771==
|
||||
|
||||
--===============1611091771==--
|
79
agent/mails/Mail1
Normal file
79
agent/mails/Mail1
Normal file
|
@ -0,0 +1,79 @@
|
|||
From nobody Wed Aug 08 17:38:39 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1084757079=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Willkommen bei Microsoft Outlook 2000!
|
||||
From: Microsoft Outlook 2000
|
||||
To:
|
||||
|
||||
<http://outlook/outlook9/specs/welcomemsg/icons.gif>
|
||||
<http://outlook/outlook9/specs/welcomemsg/yellowbg.gif>
|
||||
<http://outlook/outlook9/specs/welcomemsg/olicon.GIF>
|
||||
Willkommen bei
|
||||
Microsoft Outlook 2000
|
||||
Das Fenster zu Ihrer Informationswelt
|
||||
Microsoft(R) Outlook(R) 2000 <http://www.microsoft.com/germany/office/outlook>ist die führende Clientsoftware für Kommunikation und Zusammenarbeit, mit der Sie Ihre Arbeitsabläufe optimieren können. Outlook kombiniert auf führendem Leistungsniveau
|
||||
E-Mail-Funktionen (Internet- und Microsoft Exchange Server-Standards) mit integrierten Managementfunktionen für Aufgaben, Kontakte und den Kalender.
|
||||
In Outlook werden Informationen in Ordnern organisiert. Beim Starten von Outlook wird der Ordner “Posteingang” geöffnet. Verwenden Sie den Posteingang, um E-Mail-Nachrichten sowie Besprechungs- und Aufgabenanfragen zu lesen und zu senden.
|
||||
|
||||
Um eine neue Nachricht zu erstellen, zeigen Sie im Menü "Datei" auf "Neu", und klicken Sie dann auf "Nachricht". Tragen Sie in den Feldern "An" und "Cc" die Namen der Empfänger ein, im Feld "Betreff" das Thema der Nachricht, und verfassen Sie die Nachricht anschließend im Textfeld. Wenn Sie die Nachricht zum Senden fertig gestellt haben, klicken Sie auf "Senden".
|
||||
|
||||
Um schnell zu einer anderen Outlook-Komponente zu wechseln, klicken Sie auf die entsprechende Verknüpfung auf der Outlook-Leiste, die sich links neben dem Posteingang befindet. Klicken Sie z.B. auf Kalender, um den Kalenderordner zu öffnen. Die Ordnerleiste (die horizontale Leiste oberhalb des Informationsbereichs) zeigt den Namen des geöffneten Ordners an. Um eine vollständige Liste mit allen Ordnern anzuzeigen, klicken Sie in der Ordnerleiste auf den Ordnernamen.
|
||||
|
||||
Hier sind einige der neuen Funktionen in Outlook 2000:
|
||||
|
||||
Outlook(R) Heute stellt Ihre E-Mail-, Kalender- und Aufgaben-Information in einem Fenster übersichtlich dar. Outlook Heute kann mit einem Klick auf das entsprechende Symbol auf der Outlook-Leiste gestartet werden. Sie können Outlook Heute auch als Ihr Standardfenster beim Starten von Outlook einstellen, damit Sie die Prioritäten für Ihren Arbeitstag mit einem Blick festlegen können.
|
||||
|
||||
In der Outlook-Leiste können Sie Verknüpfungen zu Dateien, Ordnern oder Webseiten erstellen. Sie können auf der Outlook-Leiste auf eine Verknüpfung zu einer Webseite klicken, und diese Seite dann im Outlook-Fenster auf der rechten Seite ansehen.
|
||||
|
||||
Senden und empfangen Sie Ihre E-Mail im HTML-Format, um Ihre Nachrichten so eindrucksvoll zu gestalten wie Webinhalt.
|
||||
|
||||
Nutzen Sie die Vorteile, die sich aus der Internet-Protokollunterstützung von Outlook 2000 für POP3/SMTP, IMAP4, LDAP, NNTP, S/MIME, HTML Mail, vCard, vCalendar und iCalendar ergeben.
|
||||
|
||||
Das innovative Suchprogramm verwendet eine Suche im Webstil: Sie geben die Information ein, nach der gesucht wird. Auf diese Weise finden Sie schnell Nachrichten, Termine und Aufgaben.
|
||||
|
||||
Gestalten Sie Ihre Arbeit übersichtlicher, indem Sie die Schaltfläche "Organisieren" auf der Symbolleiste verwenden, um auf einfache Weise den Inhalt eines Ordners zu organisieren, Regeln zu erstellen und Junk-E-Mail herauszufiltern.
|
||||
|
||||
Mit einem einzigen Befehl können Sie nun Ihren persönlichen oder den Team-Kalender als Webseite veröffentlichen.
|
||||
|
||||
Erstellen und speichern Sie Ihre persönlichen Verteilerlisten zusammen mit Ihren Kontakten im Kontakteordner.
|
||||
|
||||
Mit der Serienbrieffunktion für E-Mail-, Fax- oder Briefversand können Sie Ihre Massenpost verwalten, wobei Sie selber entscheiden können, welche Kontakte und Kontaktfelder für die Serienbrieferstellung verwendet werden sollen.
|
||||
|
||||
Verwenden Sie die Registerkarte "Aktivitäten" eines Kontaktelements, um unter anderem die Nachrichten, Termine und Aufgaben eines bestimmten Kontakts dynamisch zu verfolgen und anzuzeigen.
|
||||
|
||||
Für weitere Informationen:
|
||||
|
||||
Besuchen Sie die Office Update-Website unter http://officeupdate.microsoft.com/germany/outlook <http://officeupdate.microsoft.com/office/redirect/fromOffice9/OutlookWelcome.htm?HelpLCID=1031>. Hier lernen Sie, wie Sie das Beste aus Microsoft(R) Outlook(R) 2000 herausholen können.
|
||||
|
||||
Erweitern Sie die Nützlichkeit von Outlook 2000 mit neuen Add-Ins, Dienstprogrammen und anderen Downloads.
|
||||
|
||||
|
||||
|
||||
Vereinfachen Sie die Verwendung von Outlook 2000 noch weiter mithilfe von zeitsparenden Tipps und Ratschlägen zur Problemlösung.
|
||||
|
||||
|
||||
|
||||
Feedback, Antworten auf häufig gestellte Fragen (FAQs) und Tipps finden Sie in unseren öffentlichen Newsgroups für Outlook 2000.
|
||||
|
||||
|
||||
|
||||
Lernen Sie, wie Sie mit Spezialangeboten und einer Vielzahl von Add-On-Produkten von Drittanbietern die Funktionalität von Outlook 2000 erweitern.
|
||||
|
||||
|
||||
|
||||
Beschaffen Sie sich eine Liste der häufigsten Support-Fragen zu Outlook 2000.
|
||||
|
||||
|
||||
|
||||
Hier finden Sie auch die aktuellsten Softwareupdates für Outlook 2000.
|
||||
|
||||
Wir hoffen, dass Ihnen die Arbeit mit Microsoft Outlook, einem der vollständigsten, zurzeit
|
||||
erhältlichen E-Mail-Programme, Vergnügen bereiten wird!
|
||||
|
||||
- Ihr Microsoft Outlook-Team
|
||||
|
||||
|
||||
Microsoft Internet Explorer <http://www.microsoft.com/windows/ie_intl/de/> Microsoft Office <http://www.microsoft.com/germany/office/> Microsoft Exchange Server <http://www.microsoft.com/germany/backoffice/exchange/> Microsoft NetMeeting <http://www.microsoft.com/windows/ie_intl/de/netmeeting/> Microsoft Windows Media Technologies <http://www.microsoft.com/windows/windowsmedia>
|
||||
--===============1084757079==
|
||||
|
||||
--===============1084757079==--
|
13
agent/mails/Mail10
Normal file
13
agent/mails/Mail10
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:33:53 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0462019246=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0462019246==
|
||||
|
||||
--===============0462019246==--
|
13
agent/mails/Mail11
Normal file
13
agent/mails/Mail11
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:37:00 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0845798496=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0845798496==
|
||||
|
||||
--===============0845798496==--
|
13
agent/mails/Mail12
Normal file
13
agent/mails/Mail12
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:41:41 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0256854354=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0256854354==
|
||||
|
||||
--===============0256854354==--
|
13
agent/mails/Mail13
Normal file
13
agent/mails/Mail13
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:43:21 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0997011639=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0997011639==
|
||||
|
||||
--===============0997011639==--
|
13
agent/mails/Mail14
Normal file
13
agent/mails/Mail14
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:44:50 2007
|
||||
Content-Type: multipart/mixed; boundary="===============2082887985=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============2082887985==
|
||||
|
||||
--===============2082887985==--
|
13
agent/mails/Mail2
Normal file
13
agent/mails/Mail2
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 18:54:16 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0880114339=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0880114339==
|
||||
|
||||
--===============0880114339==--
|
13
agent/mails/Mail3
Normal file
13
agent/mails/Mail3
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:05:34 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1328191004=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============1328191004==
|
||||
|
||||
--===============1328191004==--
|
13
agent/mails/Mail4
Normal file
13
agent/mails/Mail4
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:24:11 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1905543225=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============1905543225==
|
||||
|
||||
--===============1905543225==--
|
13
agent/mails/Mail5
Normal file
13
agent/mails/Mail5
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:25:53 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1877812021=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============1877812021==
|
||||
|
||||
--===============1877812021==--
|
13
agent/mails/Mail6
Normal file
13
agent/mails/Mail6
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:26:37 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1606767652=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============1606767652==
|
||||
|
||||
--===============1606767652==--
|
13
agent/mails/Mail7
Normal file
13
agent/mails/Mail7
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:30:38 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0772292689=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0772292689==
|
||||
|
||||
--===============0772292689==--
|
13
agent/mails/Mail8
Normal file
13
agent/mails/Mail8
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:31:07 2007
|
||||
Content-Type: multipart/mixed; boundary="===============0682061220=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============0682061220==
|
||||
|
||||
--===============0682061220==--
|
13
agent/mails/Mail9
Normal file
13
agent/mails/Mail9
Normal file
|
@ -0,0 +1,13 @@
|
|||
From nobody Wed Aug 08 19:32:06 2007
|
||||
Content-Type: multipart/mixed; boundary="===============1096091158=="
|
||||
MIME-Version: 1.0
|
||||
Subject: Just a test for subfolder mails
|
||||
From:
|
||||
To: ,
|
||||
|
||||
This mail is a plain simple text mail, stored in the subfolder.
|
||||
|
||||
Greetings, the programmer
|
||||
--===============1096091158==
|
||||
|
||||
--===============1096091158==--
|
|
@ -47,14 +47,35 @@
|
|||
<div class="section">
|
||||
<h3><a id="form-overview" name="form-overview">Overview</a></h3>
|
||||
<ul class="simple">
|
||||
<li><b>Mail Collection</b><div nevow:render="data" nevow:data="displayViewForm"/></li>
|
||||
<li><b>Mail Collection</b><div nevow:render="data" nevow:data="displayViewForm"/></li>
|
||||
</ul>
|
||||
<div nevow:render="systemMessage"/>
|
||||
<div align="center">
|
||||
<table border="0" cellpadding="10">
|
||||
<p nevow:render="displayOutlookMails">
|
||||
<tr nevow:pattern="OutlookMails" nevow:render="data"/>
|
||||
</p>
|
||||
</table>
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
From
|
||||
</th>
|
||||
<th>
|
||||
CC
|
||||
</th>
|
||||
<th>
|
||||
Subject
|
||||
</th>
|
||||
<th>
|
||||
Date
|
||||
</th>
|
||||
<th>
|
||||
Source Folder
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<p nevow:render="displayOutlookMails">
|
||||
</p>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
190
agent/ui/templates/mailcrawl.html
Normal file
190
agent/ui/templates/mailcrawl.html
Normal file
|
@ -0,0 +1,190 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<!--<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> //-->
|
||||
<html xmlns:nevow="http://nevow.com/ns/nevow/0.1">
|
||||
|
||||
<!-- Outlook Mails Page for loops.agent UI Version: 0.1 //-->
|
||||
|
||||
<nevow:invisible nevow:render="header_fragment" />
|
||||
|
||||
<body>
|
||||
<div class="body">
|
||||
<div nevow:render="top_fragment">
|
||||
</div>
|
||||
|
||||
<div id="menu">
|
||||
|
||||
<div nevow:render="navigation_fragment">
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="box">
|
||||
<h4>User Mode</h4>
|
||||
<div class="body">
|
||||
<b>Current Mode: </b><p nevow:render="getActiveUserMode"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
<div></div>
|
||||
<div></div>
|
||||
|
||||
<div class="content-1" id="2.body" ondblclick="">
|
||||
<div class="line-block">
|
||||
<div class="line"><br /></div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<h3><a id="agent-ui-startpage" name="agent-ui-startpage">Agent: Create Mail Crawl Job</a></h3>
|
||||
|
||||
<ul class="simple">
|
||||
<li>Configuration page for Outlook Mail Crawler jobs.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section">
|
||||
<h3><a id="form-overview" name="form-overview">Overview</a></h3>
|
||||
<ul class="simple">
|
||||
<li><b>Mail Collection</b><div nevow:render="data" nevow:data="displayViewForm"/></li>
|
||||
</ul>
|
||||
<div align="center">
|
||||
<table border="0" cellpadding="10">
|
||||
<p nevow:render="displayOutlookMails">
|
||||
<tr nevow:pattern="OutlookMails" nevow:render="data"/>
|
||||
</p>
|
||||
</table>
|
||||
<form name="OutlookCrawlForm" action="submitOutlookCrawlJob" method="POST">
|
||||
<fieldset>
|
||||
<legend>
|
||||
Mail Crawl Settings
|
||||
</legend>
|
||||
<fieldset>
|
||||
<legend>Folders to crawl</legend>
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblsearchFolder">Folder to search: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input id="lblsearchFolder" name="searchFolder" type="text"
|
||||
size="12" maxlength="20"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblselectSubfolder">Include subfolder: </label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="lblselectSubfolder" name="selectSubfolder">
|
||||
<option>Yes</option>
|
||||
<option>No</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>
|
||||
Filter criteria patterns
|
||||
</legend>
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblselectFilterCriteria">Filter criteria: </label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="lblselectFilterCriteria" name="selectFilterCriteria">
|
||||
<option>sender</option>
|
||||
<option>receiver</option>
|
||||
<option>subject</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblfilterPattern">Pattern: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input id="lblfilterPattern" name="filterPattern"
|
||||
type="text" size="12" maxlength="20" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>
|
||||
Message parts to be stored
|
||||
</legend>
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblselectContentFormat">Transfer HTML or Plain Text: </label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="lblselectContentFormat" name="selectContentFormat">
|
||||
<option>text</option>
|
||||
<option>html</option>
|
||||
<option>both</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblselectAttachements">Include attachements: </label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="lblselectAttachements" name="selectAttachements">
|
||||
<option>Yes</option>
|
||||
<option>No</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>
|
||||
Job Interval
|
||||
</legend>
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblmailCrawlIntervaloneTime">One Time: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" id="lblmailCrawlIntervaloneTime" name="mailCrawlInterval"
|
||||
value="oneTime" checked="checked" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="lblmailCrawlIntervalScheduler">Use Scheduler: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="radio" id="lblmailCrawlIntervalScheduler" name="mailCrawlInterval"
|
||||
value="Scheduler" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<input type="submit" name="startCrawlJob" value="Save and Start" />
|
||||
</fieldset>
|
||||
</form>
|
||||
<div nevow:render="systemMessage"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="sub-section" define-macro="sub-section">
|
||||
</div>
|
||||
|
||||
<div nevow:render="footer_fragment">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -20,6 +20,12 @@
|
|||
</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/viewOutlookMails" class="">
|
||||
view Outlook Mails
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/addjob" class="">
|
||||
add job</a>
|
||||
|
|
379
agent/ui/web.py
379
agent/ui/web.py
|
@ -10,23 +10,37 @@ from nevow import loaders, rend, static, url, inevow, tags
|
|||
from nevow.inevow import IRequest
|
||||
from twisted.internet import defer
|
||||
|
||||
"""
|
||||
Import could look like this:
|
||||
from loops.agent.crawl.MailCrawler import MailCrawler
|
||||
"""
|
||||
|
||||
# ---- global definitions ---------------------------------
|
||||
# THIS SECTION IS USED FOR PROJECT INTERNAL DEBUG ONLY
|
||||
INIFILE = "usermode.ini"
|
||||
JOBFILE = "joblist.txt"
|
||||
#----------------------------------------------------------
|
||||
from loops.agent.crawl.outlook import MSOutlook
|
||||
from loops.agent import core
|
||||
|
||||
# ---- global definitions and settings ---------------------------------
|
||||
os.environ['HOME'] = os.path.dirname(core.__file__)
|
||||
OUTLOOK2000 = 1
|
||||
JOBCONFIGS = os.path.join(os.path.expanduser('~'),'jobconf.txt')
|
||||
MAIL_DIR = os.path.join(os.path.expanduser('~'),'mails')
|
||||
agent = core.Agent()
|
||||
config = agent.config
|
||||
resourcesDirectory = 'resources'
|
||||
templatesDirectory = 'templates'
|
||||
#----------------------------------------------------------
|
||||
|
||||
|
||||
def template(fn):
|
||||
return loaders.xmlfile(os.path.join(templatesDirectory, fn))
|
||||
|
||||
def getConfigIndex(index_name, default_value, fn=None):
|
||||
iterator = 0
|
||||
index_used = True
|
||||
#check what crawling jobs exist to create a valid job index
|
||||
while index_used == True:
|
||||
if config.crawl[iterator].setdefault(index_name,default_value) == default_value:
|
||||
index_used = False
|
||||
else:
|
||||
index_used = True
|
||||
iterator = iterator + 1
|
||||
return iterator
|
||||
|
||||
|
||||
# AgentHome
|
||||
# root page of the Agent UI
|
||||
|
||||
|
@ -35,57 +49,52 @@ class AgentHome(rend.Page):
|
|||
"""Main class that builds the root ressource for the loops agent ui.
|
||||
|
||||
Instance variables:
|
||||
ini_dict -- stores the initialization parameters
|
||||
ini_file -- path to the initialization file
|
||||
usermode -- can be 'Simple' or 'Advanced'
|
||||
|
||||
Class methods:
|
||||
At the moment all methods of this class except the __init__ although public,
|
||||
are intended to be called directly or stand-alone.
|
||||
|
||||
__init__ -- Load the initial start-up settings from an ini file.
|
||||
__init__ -- Load the initial start-up settings from config
|
||||
|
||||
"""
|
||||
|
||||
child_resources = static.File(resourcesDirectory)
|
||||
docFactory = template('agent.html')
|
||||
|
||||
def __init__(self,ini_dict={}):
|
||||
def __init__(self,first_start=1):
|
||||
""" Initialize the AgentHome object.
|
||||
|
||||
If an empty dictionary is passed into the __init__ method it will
|
||||
load the settings from the path with points to the ini-file.
|
||||
If first_start = 1 then the initalization procedure is run, which mainly
|
||||
loads the stored settings from the agent ini-file into instance variables of the class.
|
||||
|
||||
Keyword arguments:
|
||||
ini_dict -- the dictionary containing the ini-settings. Defaults to {}
|
||||
|
||||
"""
|
||||
#TODO: implement automatic reading of default ini file, or one passed via constructor
|
||||
#-------- ini settings ------------------------
|
||||
# THIS SECTION IS USED FOR PROJECT INTERNAL DEBUG ONLY
|
||||
self.ini_file = INIFILE
|
||||
self.ini_dict = ini_dict
|
||||
#-----------------------------------------------
|
||||
#-------- get ini settings from file --------
|
||||
if self.ini_dict == {}:
|
||||
|
||||
file_pointer = open(self.ini_file,"r")
|
||||
ini_settings = file_pointer.readlines()
|
||||
for ini_line in ini_settings:
|
||||
elem = ini_line.split(":")
|
||||
self.ini_dict[elem[0]] = elem[1]
|
||||
file_pointer.close()
|
||||
print "[AgentHome] self.UserMode: ", self.ini_dict["UserMode"]
|
||||
first_start -- defaults to 1
|
||||
|
||||
"""
|
||||
print "[PAGECLASS] AgentHome"
|
||||
if first_start == 1:
|
||||
self.usermode = config.ui.web.setdefault('usermode','Simple')
|
||||
print "[AgentHome] setting self.usermode: ", config.ui.web.usermode
|
||||
|
||||
"""
|
||||
def locateChild(self, ctx, segments):
|
||||
return self, ()
|
||||
"""
|
||||
|
||||
# child pages
|
||||
# calls to child pages
|
||||
|
||||
def child_joboverview(self,context):
|
||||
""" User requested page from menue: 'job overview' """
|
||||
return JobOverView(self.ini_dict)
|
||||
return JobOverView()
|
||||
|
||||
def child_collectOutlookMails(self,context):
|
||||
"""Display page for starting Outlook Crawler"""
|
||||
return AgentOutlookMailCrawl()
|
||||
|
||||
def child_viewOutlookMails(self,context):
|
||||
"""Display page that shows all currently collected Outlook Mails."""
|
||||
return AgentOutlookMailView()
|
||||
|
||||
# "Startpage" methods (class AgentHome)
|
||||
|
||||
|
@ -96,40 +105,19 @@ class AgentHome(rend.Page):
|
|||
change UserMode from Simple <-> Professional
|
||||
|
||||
"""
|
||||
print "[child_changeUserMode] UserMode: ", self.ini_dict["UserMode"]
|
||||
print "[child_changeUserMode] UserMode: ", config.ui.web.usermode
|
||||
print "[child_changeUserMode] ----retrieving form values----"
|
||||
form = IRequest(context).args
|
||||
if form != {}:
|
||||
for elem in form:
|
||||
print "[child_changeUserMode] ", form[elem]
|
||||
if self.ini_dict["UserMode"] == "Simple":
|
||||
self.ini_dict["UserMode"] = "Advanced"
|
||||
if config.ui.web.usermode == "Simple":
|
||||
config.ui.web.usermode = "Advanced"
|
||||
else:
|
||||
self.ini_dict["UserMode"] = "Simple"
|
||||
print "[child_changeUserMode] : ", self.ini_dict["UserMode"]
|
||||
return AgentHome(self.ini_dict)
|
||||
|
||||
def child_collectOutlookMails(self,context):
|
||||
"""Display page for starting Outlook Crawler
|
||||
|
||||
Returns a page object that offers possibility to start async crawling job.
|
||||
|
||||
"""
|
||||
"""
|
||||
deferred = MailCrawler.getOutlookMails()
|
||||
deferred.addCallback(self.defMailCrawl,context)
|
||||
deferred.addErrback(self.defMailCrawlError,context)
|
||||
return deferred
|
||||
"""
|
||||
return AgentOutlookMailView(self.ini_dict)
|
||||
|
||||
def defMailCrawl(self,mail_collection,context):
|
||||
"""Forward the mail collection to a page view."""
|
||||
return AgentOutlookMailView(self.ini_dict,mail_collection)
|
||||
|
||||
def defMailCrawlError(self,ErrorMessage,context):
|
||||
"""Handles errors that ocurred in the MailCrawler."""
|
||||
return AgentHome(self.ini_dict)
|
||||
config.ui.web.usermode = "Simple"
|
||||
print "[child_changeUserMode] : ", config.ui.web.usermode
|
||||
config.save()
|
||||
return AgentHome(first_start=0)
|
||||
|
||||
# "job overview" methods (class JobOverView)
|
||||
|
||||
|
@ -141,7 +129,8 @@ class AgentHome(rend.Page):
|
|||
|
||||
"""
|
||||
selected_job = ((IRequest(context).uri).split("?"))[1]
|
||||
file_pointer = open(JOBFILE,"r")
|
||||
JOBDETAILS = 'joblist.txt'
|
||||
file_pointer = open(JOBDETAILS,"r")
|
||||
job_details = ""
|
||||
job_list = file_pointer.readlines()
|
||||
for line in job_list:
|
||||
|
@ -150,12 +139,97 @@ class AgentHome(rend.Page):
|
|||
break
|
||||
file_pointer.close()
|
||||
job_details = job_details.split(";")
|
||||
return JobOverViewDetails(self.ini_dict, job_details)
|
||||
return JobOverViewDetails(job_details)
|
||||
|
||||
# "collect Outlook Mails" methods (class AgentOutlookMailCrawl)
|
||||
|
||||
def child_submitOutlookCrawlJob(self,context):
|
||||
"""Initiate Outlook crawling job as requested by user."""
|
||||
|
||||
ag = core.Agent()
|
||||
config2 = ag.config
|
||||
conf = config2
|
||||
crawlSubfolder = False
|
||||
form = IRequest(context).args
|
||||
if form != {}:
|
||||
iterator = getConfigIndex('type','unused')
|
||||
#save job configuration
|
||||
if form['mailCrawlInterval'][0] == "oneTime":
|
||||
conf.load('crawl[%i].state = "completed"' %(iterator))
|
||||
else:
|
||||
conf.load('crawl[%i].state = "active"' %(iterator))
|
||||
conf.load('crawl[%i].jobid = "outlook%i"' %(iterator, iterator))
|
||||
conf.load('crawl[%i].type = "OutlookMail"' %(iterator))
|
||||
conf.load('crawl[%i].folder = "%s"'%(iterator,form["searchFolder"][0])) #always Inbox, ev. read from Outlook which folders are available?
|
||||
conf.load('crawl[%i].getsubfolder = "%s"'%(iterator,form["selectSubfolder"][0]))
|
||||
conf.load('crawl[%i].latest = ""'%(iterator)) #TODO: who does parsing?
|
||||
conf.load('crawl[%i].filter_criteria = "%s"'%(iterator,form["selectFilterCriteria"][0]))
|
||||
conf.load('crawl[%i].filter_pattern = "%s"'%(iterator,form["filterPattern"][0]))
|
||||
conf.load('crawl[%i].content_format = "%s"'%(iterator,form["selectContentFormat"][0]))
|
||||
conf.load('crawl[%i].include_attachements = "%s"'%(iterator,form["selectAttachements"][0]))
|
||||
conf.load('crawl[%i].interval = "%s"'%(iterator,form["mailCrawlInterval"][0]))
|
||||
conf.save()
|
||||
|
||||
if form["mailCrawlInterval"][0] == 'oneTime':
|
||||
if OUTLOOK2000 == 1:
|
||||
#Outlook2000 (= Outlook 9) has different attributes
|
||||
fieldsMail = ['Body',
|
||||
'HTMLBody',
|
||||
'CC',
|
||||
'SenderName',
|
||||
'Recipients',
|
||||
'To',
|
||||
'Attachments',
|
||||
'Subject'
|
||||
]
|
||||
else:
|
||||
fieldsMail = ['Body',
|
||||
'BodyFormat',
|
||||
'HTMLBody',
|
||||
'CC',
|
||||
'SenderEmailAddress',
|
||||
'Recipients',
|
||||
'To',
|
||||
'Attachments',
|
||||
'Subject'
|
||||
]
|
||||
if form["selectSubfolder"][0] == 'Yes':
|
||||
crawlSubfolder = True
|
||||
|
||||
OutlookObj = MSOutlook()
|
||||
mails = OutlookObj.loadInbox(fieldsMail,crawlSubfolder)
|
||||
# currently deferreds are not implemented in outlook.py
|
||||
#deferred.addCallback(self.defMailCrawl,context)
|
||||
#deferred.addErrback(self.defMailCrawlError,context)
|
||||
#return deferred
|
||||
return self.defMailCrawl(mails,context)
|
||||
else:
|
||||
#TODO implement forwarding to next form (scheduler)
|
||||
return AgentOutlookMailCrawl("Scheduled Mail Crawling not implemented yet.")
|
||||
|
||||
else:
|
||||
return AgentOutlookMailCrawl("An error occurred: form data has been empty.")
|
||||
return AgentOutlookMailCrawl("Crawl Job settings have been saved.")
|
||||
|
||||
def defMailCrawl(self,mail_collection,context):
|
||||
"""Save and Forward the mail collection to a page view."""
|
||||
files = os.listdir(MAIL_DIR)
|
||||
filename = "Mail%i" %(len(files))
|
||||
print "Writing emails to files."
|
||||
for elem in mail_collection:
|
||||
fp = open((os.path.join(MAIL_DIR,filename)),'w')
|
||||
fp.write(str(elem))
|
||||
fp.close()
|
||||
return AgentOutlookMailView(mail_collection)
|
||||
|
||||
def defMailCrawlError(self,ErrorMessage,context):
|
||||
"""Handles errors that ocurred in the MailCrawler."""
|
||||
return AgentHome(first_start=0)
|
||||
|
||||
# rendering methods of Startpage
|
||||
|
||||
def render_getActiveUserMode(self,context,data):
|
||||
return self.ini_dict["UserMode"]
|
||||
return config.ui.web.usermode
|
||||
|
||||
def render_getAgentVersion(self,context,data):
|
||||
return "0.1 alpha"
|
||||
|
@ -196,7 +270,7 @@ class JobOverView(rend.Page):
|
|||
"""Builds page that lists all currently registered jobs.
|
||||
|
||||
Instance variables:
|
||||
ini_settings -- stores the initialization parameters
|
||||
currently none in use
|
||||
|
||||
Class methods:
|
||||
At the moment all methods of this class except the __init__ although public,
|
||||
|
@ -208,8 +282,8 @@ class JobOverView(rend.Page):
|
|||
|
||||
docFactory = template('joblisting.html')
|
||||
|
||||
def __init__(self, ini_dict={}):
|
||||
self.ini_settings = ini_dict
|
||||
def __init__(self):
|
||||
print "[PAGECLASS] JobOverView"
|
||||
|
||||
# rendering methods of job overview
|
||||
|
||||
|
@ -217,36 +291,36 @@ class JobOverView(rend.Page):
|
|||
return "Overview of all running Crawling jobs"
|
||||
|
||||
def render_getActiveUserMode(self,context,data):
|
||||
return self.ini_settings["UserMode"]
|
||||
return config.ui.web.usermode
|
||||
|
||||
def render_fillJobTable(self,ctx,data):
|
||||
"""Build table which displays all registered jobs."""
|
||||
|
||||
#---- get the registered jobs from the jobfile ----
|
||||
# might later be implemented by reading in a xml file or
|
||||
# requesting registered jobs from database
|
||||
file_jobfile = open(JOBFILE,"r")
|
||||
lines = file_jobfile.readlines()
|
||||
file_jobfile.close()
|
||||
joblist = []
|
||||
for elem in lines:
|
||||
joblist.append(elem.split(";"))
|
||||
iterator = 0
|
||||
config.load()
|
||||
while iterator < len(config.crawl):
|
||||
joblist.append(dict(config.crawl[iterator].items()))
|
||||
iterator = iterator + 1
|
||||
for elem in joblist:
|
||||
print elem
|
||||
job_table = [tags.tr
|
||||
[
|
||||
tags.td
|
||||
[
|
||||
tags.a(href="ViewJobDetails?%s" %(job_details[0],))
|
||||
tags.a(href="ViewJobDetails?%s" %(job_details['jobid']))
|
||||
[
|
||||
tags.b
|
||||
[
|
||||
"[" + job_details[0] +"]"
|
||||
"[" + job_details['jobid'] +"]"
|
||||
]
|
||||
]
|
||||
],
|
||||
tags.td[job_details[1]],
|
||||
tags.td[job_details[2]],
|
||||
tags.td[job_details[3]],
|
||||
tags.td[job_details[4]]
|
||||
tags.td[job_details['state']],
|
||||
tags.td[job_details['interval']],
|
||||
tags.td[job_details['filter_criteria']],
|
||||
tags.td[job_details['folder']]
|
||||
]
|
||||
for job_details in joblist
|
||||
]
|
||||
|
@ -270,21 +344,20 @@ class JobOverViewDetails(rend.Page):
|
|||
"""Builds page that displays detailed information about a selected job.
|
||||
|
||||
Instance variables:
|
||||
ini_settings -- stores the initialization parameters
|
||||
jobdetails -- list that contains all available job information
|
||||
|
||||
Class methods:
|
||||
At the moment all methods of this class except the __init__ although public,
|
||||
are intended to be called directly or stand-alone.
|
||||
|
||||
__init__ -- Store inital settings and the selected job.
|
||||
__init__ -- Store the selected job in member variable.
|
||||
|
||||
"""
|
||||
|
||||
docFactory = template('jobdetail.html')
|
||||
|
||||
def __init__(self, ini_dict={}, selectedJob=[]):
|
||||
self.ini_settings = ini_dict
|
||||
def __init__(self, selectedJob=[]):
|
||||
print "[PAGECLASS] JobOverViewDetails"
|
||||
self.jobdetails = selectedJob
|
||||
|
||||
# rendering methods of job view details
|
||||
|
@ -293,14 +366,14 @@ class JobOverViewDetails(rend.Page):
|
|||
return "Detailed view of crawling job."
|
||||
|
||||
def render_getActiveUserMode(self,context,data):
|
||||
return self.ini_settings["UserMode"]
|
||||
return config.ui.web.usermode
|
||||
|
||||
def render_displayJobDetails(self,ctx,data):
|
||||
"""Build the table containing information about the selected job."""
|
||||
|
||||
print "*******************************************************"
|
||||
print "[render_displayJobDetails] received form: ", str(self.jobdetails)
|
||||
print "[render_displayJobDetails] received IniForm: ", str(self.ini_settings)
|
||||
print "[render_displayJobDetails] usermode: ", config.ui.web.usermode
|
||||
print "*******************************************************"
|
||||
job_detail = []
|
||||
job_detail = [tags.tr
|
||||
|
@ -359,39 +432,141 @@ class AgentOutlookMailView(rend.Page):
|
|||
"""Builds page that displays an overview of all collected mails.
|
||||
|
||||
Instance variables:
|
||||
ini_dict -- stores the initialization parameters
|
||||
page_message -- string that is displayed on the page
|
||||
mail_collection -- collection containing all currently collected mails.
|
||||
|
||||
Class methods:
|
||||
At the moment all methods of this class except the __init__ although public,
|
||||
are intended to be called directly or stand-alone.
|
||||
|
||||
__init__ -- Store initial settings and the mail collection object.
|
||||
__init__ -- Store the mail collection object and the pagemessage
|
||||
|
||||
"""
|
||||
|
||||
docFactory = template('mail.html')
|
||||
|
||||
def __init__(self, ini_dict={}, mail_collection=[]):
|
||||
self.ini_dict = ini_dict
|
||||
def __init__(self, mail_collection=[], pagemessage=""):
|
||||
print "[PAGECLASS] AgentOutlookMailView"
|
||||
self.mail_collection = mail_collection
|
||||
self.page_message = pagemessage
|
||||
|
||||
# rendering methods of Collect Outlook Mails
|
||||
|
||||
def data_displayViewForm(self,context,data):
|
||||
return "Detailed view of all collected Outlook Mails. [DEMO]"
|
||||
return "Detailed view of all collected Outlook Mails."
|
||||
|
||||
def render_getActiveUserMode(self,context,data):
|
||||
return self.ini_dict["UserMode"]
|
||||
return config.ui.web.usermode
|
||||
|
||||
def render_systemMessage(self,context,data):
|
||||
"""Displays messages from the system to the user."""
|
||||
message = tags.b[self.page_message]
|
||||
return message
|
||||
|
||||
def render_displayOutlookMails(self,ctx,data):
|
||||
"""Builds table containing all currently collected mails."""
|
||||
if self.mail_collection != []:
|
||||
mail_table = [tags.tr
|
||||
[
|
||||
tags.td
|
||||
[
|
||||
tags.a(href="ViewMailDetails?%s" %(str(mailObject.get('SenderName'))))
|
||||
[
|
||||
tags.b
|
||||
[
|
||||
"[" + str(mailObject.get('SenderName')) +"]"
|
||||
]
|
||||
]
|
||||
],
|
||||
tags.td[str(mailObject.get('CC'))],
|
||||
tags.td[str(mailObject.get('Subject'))],
|
||||
tags.td[str(mailObject.get('To'))],
|
||||
tags.td['SourceFolder']
|
||||
]
|
||||
for mailObject in self.mail_collection
|
||||
]
|
||||
return mail_table
|
||||
else:
|
||||
mailFiles = os.listdir(MAIL_DIR)
|
||||
#TODO: read mail data from files
|
||||
mail_table = [tags.tr
|
||||
[
|
||||
tags.td
|
||||
[
|
||||
tags.a(href="ViewMailDetails?%s" %(str(mail)))
|
||||
[
|
||||
tags.b
|
||||
[
|
||||
"[" + str(mail) +"]"
|
||||
]
|
||||
]
|
||||
],
|
||||
tags.td[str(mail)],
|
||||
tags.td[str(mail)],
|
||||
tags.td[str(mail)],
|
||||
tags.td[str(mail)]
|
||||
]
|
||||
for mail in mailFiles
|
||||
]
|
||||
return mail_table
|
||||
|
||||
|
||||
pattern_list = []
|
||||
gen_pattern = inevow.IQ(ctx).patternGenerator('OutlookMails')
|
||||
for elem in self.mail_collection:
|
||||
pattern_list.append(gen_pattern(data=elem))
|
||||
return pattern_list
|
||||
def render_footer_fragment(self,context,data):
|
||||
return context.tag[FooterFragment(data)]
|
||||
|
||||
def render_navigation_fragment(self,context,data):
|
||||
return context.tag[NavigationFragment(data)]
|
||||
|
||||
def render_top_fragment(self,context,data):
|
||||
return context.tag[TopFragment(data)]
|
||||
|
||||
def render_header_fragment(self,context,data):
|
||||
return context.tag[HeaderFragment(data)]
|
||||
|
||||
|
||||
class AgentOutlookMailCrawl(rend.Page):
|
||||
|
||||
"""Builds page where an Outlook Mail Crawler can be configured and run.
|
||||
|
||||
Instance variables:
|
||||
page_message -- string that is displayed on the page
|
||||
|
||||
Class methods:
|
||||
At the moment all methods of this class except the __init__ although public,
|
||||
are intended to be called directly or stand-alone.
|
||||
|
||||
__init__ -- store pagemessage in member variable
|
||||
|
||||
"""
|
||||
|
||||
docFactory = template('mailcrawl.html')
|
||||
|
||||
def __init__(self, pagemessage=""):
|
||||
print "[PAGECLASS] AgentOutlookMailCrawl"
|
||||
self.page_message = pagemessage
|
||||
|
||||
# rendering methods of Collect Outlook Mails
|
||||
|
||||
def data_displayViewForm(self,context,data):
|
||||
return "Configure your MailCrawl Job in the form below.\
|
||||
You then can either choose to start it as a\
|
||||
single job, or as scheduled job (further input\
|
||||
for scheduler necessary). For each new collect\
|
||||
procedure a filter will be added, so that just\
|
||||
mails received in Outlook after the recent Crawl\
|
||||
Job has been run, will be collected."
|
||||
|
||||
def render_getActiveUserMode(self,context,data):
|
||||
return config.ui.web.usermode
|
||||
|
||||
def render_displayOutlookMails(self,ctx,data):
|
||||
"""Currently no implementation"""
|
||||
return ""
|
||||
|
||||
def render_systemMessage(self,context,data):
|
||||
"""Displays messages from the system to the user."""
|
||||
message = tags.b[self.page_message]
|
||||
return message
|
||||
|
||||
def render_footer_fragment(self,context,data):
|
||||
return context.tag[FooterFragment(data)]
|
||||
|
|
Loading…
Add table
Reference in a new issue