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

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

implementada parte de delMail

File size: 12.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
33from Products.PloneImapClient.Cache import Cache
34import email
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,REQUEST=None):
227        """
228       
229        """
230        cache_index = self.getCacheIndex()
231        self.caches[cache_index].atualizar()
232        return REQUEST.RESPONSE.redirect('imapclient_mailbox')
233
234
235
236    security.declarePublic('markAsREad')
237    def markAsREad(self,folder,UID):
238        """
239       
240        """
241       
242        pass
243
244
245    security.declarePublic('getMail')
246    def getMail(self,folder='INBOX',UID=0):
247        """
248        Pega uma mensagem do sevidor e retorna o seu header e o seu texto.
249        """
250        index = self.getCacheIndex()
251        msg = self.caches[index].getMail(folder,UID)
252        mail = []
253        if msg.is_multipart():
254            for i in msg.walk():
255                if i.get_content_type() == 'text/plain':
256                    part = i.get_payload(decode=1)
257                    try:
258                        mail.append(part.decode(i.get_content_charset()).encode('UTF-8'))
259                    except:
260                        mail.append(part)
261        elif msg.get_content_type() == 'text/plain':
262            text = msg.get_payload(decode=1)
263            try:
264                mail.append(text.decode(msg.get_content_charset()).encode('UTF-8'))
265            except:
266                mail.append(text)
267
268        return tuple(mail)
269
270
271    def getHeader(self, folder, UID):
272        i = self.getCacheIndex()
273        return self.caches[i].getHeader(folder,UID).extract()
274
275
276    security.declarePublic('getHeaders')
277    def getHeaders(self,folder):
278        """
279            Pega os Headers da Cache e trata-os, possibilitando uso na ZMI       
280        """
281        i = self.getCacheIndex()
282        h= self.caches[i].get_headers(folder)
283        h2 = []
284        for j in h:
285            h2.append(j.extract())
286        return h2
287
288
289
290    security.declarePublic('getFolders')
291    def getFolders(self,):
292        """
293       
294        """
295        i = self.getCacheIndex()
296        return self.caches[i].get_folders()
297
298
299
300    security.declarePublic('sentMail')
301    def sentMail(self,mail):
302        """
303       
304        """
305       
306        pass
307
308
309
310    security.declarePublic('delMail')
311    def delMail(self,folder,UIDs,REQUEST=None):
312        """
313        deleta uma lista de emails
314        """
315        lista = UIDs.split(' ')
316        conecao_index = self.getConecaoIndex()
317        cache_index = self.getCacheIndex()
318
319        for i in lista:
320            if i:
321                self.caches[cache_index].delMail(folder,i)
322
323        if not UIDs:
324            msg = 'Selecione uma mensagem para ser apagada.'
325        elif len(lista) == 1:
326            msg = '1 mensagem apagada.'
327        else:
328            msg = str( len(lista) ) + ' mensagens apagadas.'
329       
330        return REQUEST.RESPONSE.redirect('imapclient_mailbox?folder='+folder+'&portal_status_message='+msg+ str(lista) )
331
332
333
334    security.declarePublic('moveMail')
335    def moveMail(self,folder,index,destino):
336        """
337       
338        """
339       
340        pass
341
342
343
344    security.declarePublic('copyMail')
345    def copyMail(self,folder):
346        """
347       
348        """
349       
350        pass
351
352
353
354    security.declarePublic('newFolder')
355    def newFolder(self,pai,nome):
356        """
357       
358        """
359       
360        pass
361
362
363
364    security.declarePublic('delFolder')
365    def delFolder(self,nome):
366        """
367       
368        """
369       
370        pass
371
372
373
374    security.declarePublic('getListaAnexos')
375    def getListaAnexos(self,folder='INBOX',UID=0):
376        """
377        Pega uma mensagem do sevidor e retorna uma lista de seus anexos.
378        """
379        index = self.getCacheIndex()
380        msg = self.caches[index].getMail(folder,UID)
381        anexos = []
382        if msg.is_multipart():
383            contents = msg.get_payload()
384            for i in xrange(len(contents)):
385                if contents[i].get_content_type() != 'text/plain':
386                    anexos.append( ( i , contents[i].get_content_type(), contents[i].get_filename('Anexo %d' % i) ) )
387        elif msg.get_content_type() != 'text/plain':
388            anexos.append( ( 0 , msg.get_content_type(), msg.get_filename('Anexo %d' % 0) ) )
389       
390        return tuple(anexos)
391
392
393
394    security.declarePublic('getAnexo')
395    def getAnexo(self,folder='INBOX',UID=0, num=0,RESPONSE=None):
396        """
397        Pega uma mensagem do sevidor e retorna um de seus anexos.
398        """
399       
400        index = self.getCacheIndex()
401        msg = self.caches[index].getMail(folder,UID)
402        if msg.is_multipart():
403            anexo = msg.get_payload()[num]
404        else:
405            anexo = msg
406       
407        RESPONSE.setHeader('Content-Type', anexo.get_content_type())
408        RESPONSE.setHeader('Content-Disposition', 'filename='+anexo.get_filename('Anexo %d' % num))
409               
410        return anexo.get_payload(decode=1)
411
412
413    #manually created methods
414
415    def maskAsRead(self,folder,UID):
416        """
417        Marca um e-mail como lido
418        TODO implementar marcar como lida no servidor mas sem ler
419        """
420        index = self.getCacheIndex()
421        return self._caches[index].markAsRead(folder,UID)
422
423
424def modify_fti(fti):
425    # hide unnecessary tabs (usability enhancement)
426    for a in fti['actions']:
427        if a['id'] in ['metadata']:
428            a['visible'] = 0
429    return fti
430
431registerType(ImapClient,PROJECTNAME)
432# end of class ImapClient
433
434##code-section module-footer #fill in your manual code here
435##/code-section module-footer
436
437
438
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.