如何使用imap4.IMAP4Client删除邮件?我无法使用“删除”方法正确应用“已删除”标签。
我一直收到以下错误:
Failure: twisted.mail.imap4.IMAP4Exception: Invalid system flag \
示例代码将不胜感激。这就是我到目前为止所做的:
from twisted.internet import protocol, reactor
from twisted.mail import imap4
#Variables for connection
username = 'user@host.com'
password = 'mypassword'
host = 'imap.host.com'
port = 143
class IMAP4LocalClient(imap4.IMAP4Client):
def connectionMade(self):
self.login(username,password).addCallbacks(self._getMessages, self._ebLogin)
#reports any connection errors
def connectionLost(self,reason):
reactor.stop()
#drops the connection
def _ebLogin(self,result):
print result
self.transport.loseConnection()
def _programUtility(self,result):
print result
return self.logout()
def _cbExpungeMessage(self,result):
return self.expunge().addCallback(self._programUtility)
def _cbDeleteMessage(self,result):
return self.setFlags("1:5",flags=r"\\Deleted",uid=False).addCallback(self._cbExpungeMessage)
#gets the mailbox list
def _getMessages(self,result):
return self.list("","*").addCallback(self._cbPickMailbox)
#selects the inbox desired
def _cbPickMailbox(self,result):
mbox='INBOX.Trash'
return self.select(mbox).addCallback(self._cbExamineMbox)
def _cbExamineMbox(self,result):
return self.fetchMessage("1:*",uid=False).addCallback(self._cbDeleteMessage)
class IMAP4ClientFactory(protocol.ClientFactory):
def buildProtocol(self,addr):
return IMAP4LocalClient()
def clientConnectionFailed(self,connector,reason):
print reason
reactor.stop()
reactor.connectTCP(host,port,IMAP4ClientFactory())
reactor.run()
更改为:
def _cbDeleteMessage(self,result):
return self.setFlags("1:5",flags=['\\Deleted'],uid=False).addCallback(self._cbExpungeMessage)
感谢Jean-Paul Calderone并且它有效,setFlags需要一个列表,而不仅仅是一个字符串。
答案 0 :(得分:1)
我认为这里存在两个问题。
首先,您将一个字符串作为flags
参数传递给setFlags
。 Notice the documentation for that parameter:要设置的标志(类型:任何可迭代的str)。请尝试使用包含一个字符串的列表。
其次,\\Deleted
可能不是您正在与支持交互的服务器的标志。 IMAP4中的标准删除标记为\Deleted
。