source: publico/PloneImapClient/trunk/ImapClient.py @ 2582

Última Alteração nesse arquivo desde 2582 foi 2582, incluída por johnnysouza, 13 anos atrás

implementado suporte a mensagens nao multipart

File size: 11.0 KB
Linha 
1# File: ImapClient.py
2#
3# Copyright (c) 2006 by Interlegis
4# Generator: ArchGenXML Version 1.4.0-RC2 svn/development
5#            http://plone.org/products/archgenxml
6#
7# GNU General Public Licence (GPL)
8#
9# This program is free software; you can redistribute it and/or modify it under
10# the terms of the GNU General Public License as published by the Free Software
11# Foundation; either version 2 of the License, or (at your option) any later
12# version.
13# This program is distributed in the hope that it will be useful, but WITHOUT
14# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
16# details.
17# You should have received a copy of the GNU General Public License along with
18# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19# Place, Suite 330, Boston, MA  02111-1307  USA
20#
21__author__  = '''STC Interlegis <stc@interlegis.gov.br>'''
22__docformat__ = 'plaintext'
23
24
25from AccessControl import ClassSecurityInfo
26from Products.Archetypes.atapi import *
27from Products.PloneImapClient.interfaces.IImapClient import IImapClient
28
29
30from Products.Archetypes.SQLStorage import *
31# additional imports from tagged value 'import'
32import imaplib
33import email
34from Products.PloneImapClient.Cache import Cache
35
36from Products.PloneImapClient.config import *
37
38from Products.CMFCore.utils import UniqueObject
39
40   
41##code-section module-header #fill in your manual code here
42##/code-section module-header
43
44schema=Schema((
45    StringField('conecoes',
46        widget=StringWidget(
47            visible=0,
48            label='Conecoes',
49            label_msgid='PloneImapClient_label_conecoes',
50            description_msgid='PloneImapClient_help_conecoes',
51            i18n_domain='PloneImapClient',
52        )
53    ),
54
55    StringField('caches',
56        widget=StringWidget(
57            visible=0,
58            label='Caches',
59            label_msgid='PloneImapClient_label_caches',
60            description_msgid='PloneImapClient_help_caches',
61            i18n_domain='PloneImapClient',
62        )
63    ),
64
65    StringField('IMAPServer',
66        widget=StringWidget(
67            visible=1,
68            label='Imapserver',
69            label_msgid='PloneImapClient_label_IMAPServer',
70            description_msgid='PloneImapClient_help_IMAPServer',
71            i18n_domain='PloneImapClient',
72        )
73    ),
74
75    StringField('SMTPServer',
76        widget=StringWidget(
77            visible=1,
78            label='Smtpserver',
79            label_msgid='PloneImapClient_label_SMTPServer',
80            description_msgid='PloneImapClient_help_SMTPServer',
81            i18n_domain='PloneImapClient',
82        )
83    ),
84
85    StringField('coding',
86        widget=StringWidget(
87            label='Coding',
88            label_msgid='PloneImapClient_label_coding',
89            description_msgid='PloneImapClient_help_coding',
90            i18n_domain='PloneImapClient',
91        )
92    ),
93
94    StringField('folderIN',
95        widget=StringWidget(
96            label='Folderin',
97            label_msgid='PloneImapClient_label_folderIN',
98            description_msgid='PloneImapClient_help_folderIN',
99            i18n_domain='PloneImapClient',
100        )
101    ),
102
103    StringField('folderOUT',
104        widget=StringWidget(
105            label='Folderout',
106            label_msgid='PloneImapClient_label_folderOUT',
107            description_msgid='PloneImapClient_help_folderOUT',
108            i18n_domain='PloneImapClient',
109        )
110    ),
111
112    StringField('folderTrash',
113        widget=StringWidget(
114            label='Foldertrash',
115            label_msgid='PloneImapClient_label_folderTrash',
116            description_msgid='PloneImapClient_help_folderTrash',
117            i18n_domain='PloneImapClient',
118        )
119    ),
120
121),
122)
123
124
125##code-section after-local-schema #fill in your manual code here
126##/code-section after-local-schema
127
128ImapClient_schema = BaseSchema + \
129    schema
130
131##code-section after-schema #fill in your manual code here
132##/code-section after-schema
133
134class ImapClient(UniqueObject,BaseContent):
135    """
136    <p>Tool do PloneImapClient</p>
137    """
138    security = ClassSecurityInfo()
139    __implements__ = (getattr(UniqueObject,'__implements__',()),) + (getattr(BaseContent,'__implements__',()),) + (IImapClient,)
140
141
142    # This name appears in the 'add' box
143    archetype_name             = 'PloneImapClient Tool'
144
145    meta_type                  = 'ImapClient'
146    portal_type                = 'ImapClient'
147    allowed_content_types      = []
148    filter_content_types       = 0
149    global_allow               = 0
150    allow_discussion           = 0
151    #content_icon               = 'ImapClient.gif'
152    immediate_view             = 'base_view'
153    default_view               = 'base_view'
154    suppl_views                = ()
155    typeDescription            = "PloneImapClient Tool"
156    typeDescMsgId              = 'description_edit_imapclient'
157    #toolicon                   = 'ImapClient.gif'
158
159    schema = ImapClient_schema
160
161    ##code-section class-header #fill in your manual code here
162    ##/code-section class-header
163
164
165    # tool-constructors have no id argument, the id is fixed
166    def __init__(self, id=None):
167        BaseContent.__init__(self,'portal_imapclient')
168       
169        ##code-section constructor-footer #fill in your manual code here
170        self.caches = []
171        self.conecoes = []
172        ##/code-section constructor-footer
173
174
175
176    #Methods
177
178    security.declarePublic('getConecaoIndex')
179    def getConecaoIndex(self,):
180        """
181       
182        """
183        mt = getToolByName(self,'portal_membership')
184        membro = mt.getAuthenticatedMember()
185
186        for i in xrange(len(self.conecoes)):
187            if self.conecoes[i][0] == str(membro):
188                try:
189                    self.conecoes[0][1].noop()
190                    return i
191                except:
192                    self.conecoes.__delitem__(i)
193                break
194       
195        # se no tiver uma conecao, retorna uma nova
196
197        c = imaplib.IMAP4(self.IMAPServer)
198        c.login(membro.getProperty('email_id',''), membro.getProperty('email_pass',''))
199        self.conecoes.append( [ str(membro), c ] )
200       
201        return len( self.conecoes ) - 1
202
203
204
205    security.declarePublic('getCacheIndex')
206    def getCacheIndex(self,):
207        """
208       
209        """
210        mt = getToolByName(self,'portal_membership')
211        membro = mt.getAuthenticatedMember()
212
213        for i in xrange(len(self.caches)):
214            if self.caches[i].getUser() == str(membro):
215                    return i
216       
217        # se no tiver uma conecao, retorna uma nova
218        cache = Cache(user=str(membro), _tool=self )
219        self.caches.append( cache )
220       
221        return len( self.caches ) - 1
222
223
224
225    security.declarePublic('atualizarCache')
226    def atualizarCache(self,):
227        """
228       
229        """
230        #cache = self.getCache(user)
231        #cache.atualizar()
232        pass
233
234
235    def maskAsRead(self,folder,UID):
236        """
237        Marca um e-mail como lido
238        TODO implementar marcar como lida no servidor mas sem ler
239        """
240        index = self.getCacheIndex()
241        return self._caches[index].markAsRead(folder,UID)
242
243
244    security.declarePublic('getMail')
245    def getMail(self,folder='INBOX',UID=0):
246        """
247        Pega uma mensagem do sevidor e retorna o seu texto.
248        """
249        index = self.getCacheIndex()
250        msg = self.caches[index].getMail(folder,UID)
251        mail = []
252        if msg.is_multipart():
253            for i in msg.walk():
254                if i.get_content_type() == 'text/plain':
255                    part = i.get_payload(decode=1)
256                    try:
257                        mail.append(part.decode(i.get_content_charset()).encode('UTF-8'))
258                    except:
259                        mail.append(part)
260        elif msg.get_content_type() == 'text/plain':
261            text = msg.get_payload(decode=1)
262            try:
263                mail.append(text.decode(msg.get_content_charset()).encode('UTF-8'))
264            except:
265                mail.append(text)
266
267        return tuple(mail)
268
269
270    security.declarePublic('getListaAnexos')
271    def getListaAnexos(self,folder='INBOX',UID=0):
272        """
273        Pega uma mensagem do sevidor e retorna uma lista de seus anexos.
274        """
275        index = self.getCacheIndex()
276        msg = self.caches[index].getMail(folder,UID)
277        anexos = []
278        if msg.is_multipart():
279            contents = msg.get_payload()
280            for i in xrange(len(contents)):
281                if contents[i].get_content_type() != 'text/plain':
282                    anexos.append( ( i , contents[i].get_content_type(), contents[i].get_filename('Anexo %d' % i) ) )
283        elif msg.get_content_type() != 'text/plain':
284            anexos.append( ( 0 , msg.get_content_type(), msg.get_filename('Anexo %d' % 0) ) )
285       
286        return tuple(anexos)
287
288
289
290    security.declarePublic('getAnexo')
291    def getAnexo(self,folder='INBOX',UID=0, num=0,RESPONSE=None):
292        """
293        Pega uma mensagem do sevidor e retorna um de seus anexos.
294        """
295       
296        index = self.getCacheIndex()
297        msg = self.caches[index].getMail(folder,UID)
298        if msg.is_multipart():
299            anexo = msg.get_payload()[num]
300        else:
301            anexo = msg
302       
303        RESPONSE.setHeader('Content-Type', anexo.get_content_type())
304        RESPONSE.setHeader('Content-Disposition', 'filename='+anexo.get_filename('Anexo %d' % num))
305               
306        return anexo.get_payload(decode=1)
307
308
309
310    security.declarePublic('getHeaders')
311    def getHeaders(self,folder):
312        """
313            Pega os Headers da Cache e trata-os, possibilitando uso na ZMI       
314        """
315        i = self.getCacheIndex()
316        h= self.caches[i].get_headers(folder)
317        h2 = []
318        for j in h:
319            h2.append(j.extract())
320        return h2
321
322
323    security.declarePublic('getFolders')
324    def getFolders(self,):
325        """
326       
327        """
328        i = self.getCacheIndex()
329        return self.caches[i].get_folders()
330
331
332
333    security.declarePublic('sentMail')
334    def sentMail(self,mail):
335        """
336       
337        """
338       
339        pass
340
341
342
343    security.declarePublic('delMail')
344    def delMail(self,folder,index):
345        """
346       
347        """
348       
349        pass
350
351
352
353    security.declarePublic('moveMail')
354    def moveMail(self,folder,index,destino):
355        """
356       
357        """
358       
359        pass
360
361
362
363    security.declarePublic('copyMail')
364    def copyMail(self,folder):
365        """
366       
367        """
368       
369        pass
370
371
372
373    security.declarePublic('newFolder')
374    def newFolder(self,pai,nome):
375        """
376       
377        """
378       
379        pass
380
381
382
383    security.declarePublic('delFolder')
384    def delFolder(self,nome):
385        """
386       
387        """
388       
389        pass
390
391
392def modify_fti(fti):
393    # hide unnecessary tabs (usability enhancement)
394    for a in fti['actions']:
395        if a['id'] in ['metadata']:
396            a['visible'] = 0
397    return fti
398
399registerType(ImapClient,PROJECTNAME)
400# end of class ImapClient
401
402##code-section module-footer #fill in your manual code here
403##/code-section module-footer
404
405
406
Note: Veja TracBrowser para ajuda no uso do navegador do trac.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.