• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

los5884

Dúvidas em script POP/IMAP

20 mensagens neste tópico

Boa noite a todos

Tenho as seguintes dúvidas, espero que me podem ajudar visto que não sei muito sobre python (estou a tentar aprender lol)

Tenho que escrever um script em Python com uma biblioteca POP, IMAP e SMTP para fazer o acesso automatizado dos clientes a partir de um script.

O que tenho que fazer é criar um script sem interface( read + print), o que estou a chamar POP e IMAP.

Depois tenho que criar uma “main” script onde tenho que chamar as duas funções a cima referidos. 

O meu problema é na “main” script não consigo recolher os parâmetros para uma lista. Outro problema que estou a ter é que tenho fazer com que o código faça uma repetição temporizada(tipo 3 em 3 segundos) e não sei se tenho que usar time.sleep(secs)) ou outra função 

O meu código é o seguinte:

A função IMAP:

import getpass, imaplib

def IMAP(server, login):

server = raw_input('');
login = raw_input('');

A função POP

import getpass, poplib 

def POP(user, server, passwd):
user = raw_input('');
server = raw_input('');
passwd = raw_input('');

A Main class

class Main:

  def getIMAP(server, login):

server = imaplib.IMAP4("localhost")
login = ("hello", "123")
typ, data = search(None, 'ALL')
for num in data[0].split():
	typ, data = fetch('1', '(BODY.PEEK[HEADER] FLAGS)')
	print 'Message %s\n%s\n' % (num, data[0][1])
close()
logout()

  def getPOP(user, server, passwd):

server = poplib.POP3("localhost")
user = ("hello")
passwd = ("123")
numMessages = len(M.list()[1])
for i in range(numMessages):
	for j in M.retr(i+1)[1]:
		print j

  def list(IMAP, POP):
for item in IMAP:
	if f(IMAP):
		return item

Desde já agradeço toda a vossa ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, as duas primeiras funções não fazem sentido. Recolhem os valores para variáveis que lhes são locais e não podem ser usadas em mais lado nenhum. Além disso, deveriam receber esses valores como argumentos.

Depois, na classe em si, tens vários problemas (M.retr, vai-te dar erro porque não tens M definida p exemplo).

Qual é mesmo o teu objectivo? Criares uma interface que receba variáveis do utilizador e depois as passe para a classe que acede ao servidor POP/IMAP?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens vários erros no teu script primeiro não é recomendável teres os imports separados da class, isso facilmente vai-te levar a erros

Vou deixar-te aqui um script que fiz a pressa para teres um guia.

import poplib, time, threading

class mail_connect:

    def __init__(self, user, passwd, server):

        self.user=user
        self.passwd=passwd
        self.server=server

        th_pop=threading.Thread(target=self.getPOP) #define a thread
        th_pop.start()  #inicia a thread
        
           
    def getPOP(self):

        self.e_mails=[] #array auxiliar
        self.numMessages=0 #inicia a variavel
        
        while 1:  #Loop infinito 
            mail_server = poplib.POP3(self.server) #estabelece a ligacao ao servidor
            mail_server.user(self.user)             #
            mail_server.pass_(self.passwd)          # faz a autenticacao
            numMessages = len(mail_server.list()[1]) #obtem o numero de msg no servidor
            for i in range(numMessages):            #Primeiro loop nas mensagens
                print "A processar %i mails de %i\n"%(i,numMessages) 
                for j in mail_server.retr(i+1)[1]: #obtem o conteudo das mensagens
                    self.e_mails.append(j)          #Armazena o conteudo num array 
            print self.e_mails                      #Imprime todas as mensagens
            time.sleep(3)                           #Espera 3 segundos para verificar outra vez
            print "A verificar novos email pop\n"
            


if __name__ == '__main__':

    mail_connect(raw_input("Please input user: "),
                 raw_input("Please input passwd: "),
                 raw_input("Please input server: "))

se tiveres questões em relação ao código deixa aqui que eu vou respondendo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, as duas primeiras funções não fazem sentido. Recolhem os valores para variáveis que lhes são locais e não podem ser usadas em mais lado nenhum. Além disso, deveriam receber esses valores como argumentos.

Depois, na classe em si, tens vários problemas (M.retr, vai-te dar erro porque não tens M definida p exemplo).

Qual é mesmo o teu objectivo? Criares uma interface que receba variáveis do utilizador e depois as passe para a classe que acede ao servidor POP/IMAP?

Boas desde já agradeço novamente toda a vossa ajuda.

A ideia é recolhe os parâmetros dos scripts de POP e de IMAP e por los a fazer uma repetição temporizada(tipo 3 em 3 segundos). Que depois em sei invoca as funções correspondente. Que no final irá mostra os resultados numa lista.

Quero por isto a funcionar antes de fazer a parte gráfica, porque a ideia final é fazer uma interface gráfica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque queres recolher dados de 3 em 3 segundos?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque queres recolher dados de 3 em 3 segundos?

eu digo 3 em 3 segundos por dizer  ;D, a ideia é ter uma repetição temporizada pode ser 10s como 5min. A ideia exacta é fazer como o Outlook ou Thunderbird, eles tem uma repetição de 5 em 5 min por exemplo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

no exemplo que te deixei tens o que estas a pedir ele executa verificação da mail box de 3 em 3 segundos e é perfeito para ambientes graficos porque executa em uma thread nao te vai bloquear a main window, alguma coisa que esse exemplo nao tem que precises?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pergunta importante: percebes o código? Percebes as diferenças do teu para o do newbeen? É que copiares por copiar não te vai ajudar :(

Eu perguntei isso dos 3 segundos porque tu tavas a PEDIR DADOS de 3 em 3 segundos, não a VERIFICAR EMAILS nesse período de tempo :)

P.S. newbeen, o tipo de threading que usaste é assim tão simples como chamar threading.Thread(target=função)?? Só isso? :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pergunta importante: percebes o código? Percebes as diferenças do teu para o do newbeen? É que copiares por copiar não te vai ajudar :(

Eu perguntei isso dos 3 segundos porque tu tavas a PEDIR DADOS de 3 em 3 segundos, não a VERIFICAR EMAILS nesse período de tempo :)

P.S. newbeen, o tipo de threading que usaste é assim tão simples como chamar threading.Thread(target=função)?? Só isso? :x

Sim eu percebi. A única coisa que me deixo na dúvida foi aqui:


def __init__(self, user, passwd, server):
        self.user=user
        self.passwd=passwd
        self.server=server
        th_pop=threading.Thread(target=self.getPOP) #define a thread
        th_pop.start()  #inicia a thread

ele usou o def _init_ porque?? É que em alguns dos tutórias que tiver a ler tinha isso, mas eu achei que não era importante.

A outra dúvida é no self.user=user podia ser só user=user??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens que ler um bocado sobre class's em python e vais preceber o porque do init e o porque do self... Faz algum trabalho de casa. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens que ler um bocado sobre class's em python e vais preceber o porque do init e o porque do self... Faz algum trabalho de casa. :(

é que vou fazer agora, tambem tenho que ver o codigo do IMAP que meti aqui esta-me a dar um erro :wallbash:.

obrigado por tudo :notworthy:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção isto é código não testado porque nao tenho uma conta imap para o fazer, tenho gmail, mais isso ia me obrigar a definir todas a variáveis referentes aos settings que eles pedem para autenticação como ssl, TLS

mas deve funcionar bem, não te fiz a papinha toda para te obrigar a pensar não pôs o loop de 3 segundo nem te configurei uma maneira de fazer return a todos os e-mail para o GUI mas esta a correr em uma thread e verifica uma conta pop e uma imap ao mesmo tempo...

espero que isto seja um bom incentivo para começares a ler código a modificar e a ler documentação...

aqui vai

import poplib, imaplib, time, threading

class mail_connect:

    def __init__(self, puser, ppasswd, pserver, iuser, ipasswd, iserver):

        self.login={"imap":{"user":iuser, "password":ipasswd, "server":iserver},
                    "pop":{"user":puser, "password":ppasswd, "server":pserver}}
        

        th_pop=threading.Thread(target=self.getPOP) #define a thread
        th_imap=threading.Thread(target=self.getIMAP)
        th_pop.start()  #inicia a thread
        th_imap.start()
       
           
    def getPOP(self):

        self.e_mails=[] #array auxiliar
        self.numMessages=0 #inicia a variavel
       
        while 1:  #Loop infinito
            mail_server = poplib.POP3(self.login["pop"]["server"]) #estabelece a ligacao ao servidor
            mail_server.user(self.login["pop"]["user"])             #
            mail_server.pass_(self.login["pop"]["password"])          # faz a autenticacao
            numMessages = len(mail_server.list()[1]) #obtem o numero de msg no servidor
            for i in range(numMessages):            #Primeiro loop nas mensagens
                print "A processar %i mails de %i\n"%(i,numMessages)
                for j in mail_server.retr(i+1)[1]: #obtem o conteudo das mensagens
                    self.e_mails.append(j)          #Armazena o conteudo num array
            print self.e_mails                      #Imprime todas as mensagens
            time.sleep(3)                           #Espera 3 segundos para verificar outra vez
            print "A verificar novos email pop\n"


    def getIMAP(self):
        
        Mmail_server = imaplib.IMAP4()
        Mmail_server.login(self.login["imap"]["user"], self.login["imap"]["password"])
        Mmail_server.select()
        typ, data = Mmail_server.search(None, 'ALL')
        for num in data[0].split():
            typ, data = Mmail_server.fetch(num, '(RFC822)')
            print 'Message %s\n%s\n' % (num, data[0][1])
        Mmail_server.close()
        Mmail_server.logout()

           


if __name__ == '__main__':

    print "Please input Pop Settings\n"
    puser=raw_input("Please input user: ")
    ppasswd=raw_input("Please input passwd: ")
    pserver=raw_input("Please input server: ")

    print "\nPlease input IMAP Settings\n"
    iuser=raw_input("Please input user: ")
    ipasswd=raw_input("Please input passwd: ")
    iserver=raw_input("Please input server: ")

    mail_connect(puser, ppasswd, pserver, iuser, ipasswd, iserver)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem me parecia que não ias entender o código :) Lê isto:

More Abstraction — Objects and Object-Oriented Programming deste tutorial.

newbeen, again, podes definir Threads assim tão facilmente? Não terás quaisquer problemas de concorrência?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é a melhor maneira, mas sim podes fazer assim simples principalmente com esta complexidade de programa, era melhor teres uma class para as thread e usares "queue" mas em python a maneira como programei não trás grandes problemas "pelo menos ate onde sei" claro que tens toda esse Blabla bla em relação ao GIL no python, ate tens um tópico aqui no pap em relação a isso!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem me parecia que não ias entender o código :) Lê isto:

More Abstraction — Objects and Object-Oriented Programming deste tutorial.

newbeen, again, podes definir Threads assim tão facilmente? Não terás quaisquer problemas de concorrência?

O tutorial está a ser muito fixe :). Está a ser melhor dos que já li :D. Obrigado

Atenção isto é código não testado porque nao tenho uma conta imap para o fazer, tenho gmail, mais isso ia me obrigar a definir todas a variáveis referentes aos settings que eles pedem para autenticação como ssl, TLS

mas deve funcionar bem, não te fiz a papinha toda para te obrigar a pensar não pôs o loop de 3 segundo nem te configurei uma maneira de fazer return a todos os e-mail para o GUI mas esta a correr em uma thread e verifica uma conta pop e uma imap ao mesmo tempo...

espero que isto seja um bom incentivo para começares a ler código a modificar e a ler documentação...

aqui vai

import poplib, imaplib, time, threading

class mail_connect:

    def __init__(self, puser, ppasswd, pserver, iuser, ipasswd, iserver):

        self.login={"imap":{"user":iuser, "password":ipasswd, "server":iserver},
                    "pop":{"user":puser, "password":ppasswd, "server":pserver}}
        

        th_pop=threading.Thread(target=self.getPOP) #define a thread
        th_imap=threading.Thread(target=self.getIMAP)
        th_pop.start()  #inicia a thread
        th_imap.start()
       
           
    def getPOP(self):

        self.e_mails=[] #array auxiliar
        self.numMessages=0 #inicia a variavel
       
        while 1:  #Loop infinito
            mail_server = poplib.POP3(self.login["pop"]["server"]) #estabelece a ligacao ao servidor
            mail_server.user(self.login["pop"]["user"])             #
            mail_server.pass_(self.login["pop"]["password"])          # faz a autenticacao
            numMessages = len(mail_server.list()[1]) #obtem o numero de msg no servidor
            for i in range(numMessages):            #Primeiro loop nas mensagens
                print "A processar %i mails de %i\n"%(i,numMessages)
                for j in mail_server.retr(i+1)[1]: #obtem o conteudo das mensagens
                    self.e_mails.append(j)          #Armazena o conteudo num array
            print self.e_mails                      #Imprime todas as mensagens
            time.sleep(3)                           #Espera 3 segundos para verificar outra vez
            print "A verificar novos email pop\n"


    def getIMAP(self):
        
        Mmail_server = imaplib.IMAP4()
        Mmail_server.login(self.login["imap"]["user"], self.login["imap"]["password"])
        Mmail_server.select()
        typ, data = Mmail_server.search(None, 'ALL')
        for num in data[0].split():
            typ, data = Mmail_server.fetch(num, '(RFC822)')
            print 'Message %s\n%s\n' % (num, data[0][1])
        Mmail_server.close()
        Mmail_server.logout()

           


if __name__ == '__main__':

    print "Please input Pop Settings\n"
    puser=raw_input("Please input user: ")
    ppasswd=raw_input("Please input passwd: ")
    pserver=raw_input("Please input server: ")

    print "\nPlease input IMAP Settings\n"
    iuser=raw_input("Please input user: ")
    ipasswd=raw_input("Please input passwd: ")
    iserver=raw_input("Please input server: ")

    mail_connect(puser, ppasswd, pserver, iuser, ipasswd, iserver)

Peço desculpa mas ainda não tive tempo para ver se o código trabalha :D, estou a ler o tutorial que o Joao me deu. Logo que posso digo se funciona ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Newbeen, o código do IMAP não esta a dar mas deixa estar vou ver se esta tudo bem configurado com o programa e vou tentar resolver o problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o programa nao funciona isso nao ajuda muito poem aqui o Traceback e talvez eu te consiga ajudar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o programa nao funciona isso nao ajuda muito poem aqui o Traceback e talvez eu te consiga ajudar

o erro que dá e o seguinte

Traceback (most recent call last):
  File "C:\Python26\lib\threading.py", line 524, in __bootstrap_inner
    self.run()
  File "C:\Python26\lib\threading.py", line 479, in run
    self.__target(*self.__args, **self.__kwargs)
  File "D:\My Documents\School\2008-2009\Projecto\Codigo\ProgramaIMAP.py", line 38, in getIMAP
    Mmail_server = imaplib.IMAP4()
  File "C:\Python26\lib\imaplib.py", line 163, in __init__
    self.open(host, port)
  File "C:\Python26\lib\imaplib.py", line 230, in open
    self.sock.connect((host, port))
  File "<string>", line 1, in connect
error: [Errno 10051] Uma operação de socket foi tentada numa rede inacessível

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pensa um bocado lê a mensagem de erro e tenta ver qual é o problema...

Se ele te diz que nao consegue abrir o socket a primeira coisa que deves tentar é fazer um ping ao servidor para ver se ele esta activo a seguir verifica a tua firewall e ve se ela nao esta a bloquear o teu programa.

PS: nao uses localhost,  isso por vezes trás problemas, tentar usar o ip, 127.0.0.1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pensa um bocado lê a mensagem de erro e tenta ver qual é o problema...

Se ele te diz que nao consegue abrir o socket a primeira coisa que deves tentar é fazer um ping ao servidor para ver se ele esta activo a seguir verifica a tua firewall e ve se ela nao esta a bloquear o teu programa.

PS: nao uses localhost,  isso por vezes trás problemas, tentar usar o ip, 127.0.0.1

Já pensei nisso e já tentei isso. É por isso que digo que deve ser o meu programa (configuração) que não deve estar bem feito. Porque eu consigo ligar ao POP nesse código, e o erro só dá depois de meter os erros do IMAP

Já encontrei uma solução. Não sei se é a mais “correcta” mas esta a dar

import poplib, imaplib, time, threading

class mail_connect:

    def __init__(self, puser, ppasswd, pserver, iuser, ipasswd, iserver):

        self.login={"imap":{"user":iuser, "password":ipasswd, "server":iserver},
                    "pop":{"user":puser, "password":ppasswd, "server":pserver}}
       

        th_pop=threading.Thread(target=self.getPOP) #define a thread
        th_imap=threading.Thread(target=self.getIMAP)
        th_pop.start()  #inicia a thread
        th_imap.start()
       
           
    def getPOP(self):

        self.e_mails=[] #array auxiliar
        self.numMessages=0 #inicia a variavel
       
        while 1:  #Loop infinito
            mail_server = poplib.POP3(self.login["pop"]["server"]) #estabelece a ligacao ao servidor
            mail_server.user(self.login["pop"]["user"])             #
            mail_server.pass_(self.login["pop"]["password"])          # faz a autenticacao
            numMessages = len(mail_server.list()[1]) #obtem o numero de msg no servidor
            for i in range(numMessages):            #Primeiro loop nas mensagens
                print "A processar %i mails de %i\n"%(i,numMessages)
                for j in mail_server.retr(i+1)[1]: #obtem o conteudo das mensagens
                    self.e_mails.append(j)          #Armazena o conteudo num array
            print self.e_mails                      #Imprime todas as mensagens
            time.sleep(3)                           #Espera 3 segundos para verificar outra vez
            print "A verificar novos email pop\n"


    def getIMAP(self):
       
		mail_server = imaplib.IMAP4(self.login["imap"]["server"])
		mail_server.login(self.login["imap"]["user"], self.login["imap"]["password"])
		mail_server.select()
		typ, data = mail_server.search(None, 'ALL')
		for num in data[0].split():
			typ, data = mail_server.fetch(num, '(RFC822)')
			print 'Message %s\n%s\n' % (num, data[0][1])
		mail_server.close()
		mail_server.logout()

           


if __name__ == '__main__':

    print "Please input Pop Settings\n"
    puser=raw_input("Please input user: ")
    ppasswd=raw_input("Please input passwd: ")
    pserver=raw_input("Please input server: ")

    print "\nPlease input IMAP Settings\n"
    iuser=raw_input("Please input user: ")
    ipasswd=raw_input("Please input passwd: ")
    iserver=raw_input("Please input server: ")

    mail_connect(puser, ppasswd, pserver, iuser, ipasswd, iserver)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora