我有这个用于将原始电子邮件插入数据库的 python 脚本。不要问我为什么要将原始邮件插入数据库。
import sys
from DB import *
import email
full_msg = sys.stdin.readlines()
j = ''.join(full_msg)
msg = email.message_from_string(j)
sql = '''INSERT INTO Email(Id, Message) VALUES (NULL, %s)'''
db = DB()
db.query(sql, (msg, ))
如果我能获得该消息的 uid 那就太好了,所以如果我从 db 中删除消息,我也可以在 imap 服务器上删除消息我的 uid。
我不想登录到 imap 服务器然后通过 uid 删除消息,因为我不知道用户密码,因为它是加密的。
我想获取例如 msg['Message-Id'] ,然后在用户 maildir 中为该 Message-Id grep 文件并删除实际文件,但这对我来说完全错误。
我知道在 python 中你在 imaplib 中有类似 UIDNEXT 的东西,但这是假设我已经登录但我没有登录。
更新:
有了这个,我可以获取下一个 uid,但我必须登录。如何在不登录的情况下获取 UIDNEXT?顺便说一句,我将 postfix/dovecot 与 mysql 一起使用。
import getpass, sys
from imapclient import IMAPClient
try:
hostname, username = sys.argv[1:]
except ValueError:
print 'usage %s hostname username' % sys.argv[0]
c = IMAPClient(hostname, ssl=True)
try:
c.login(username, getpass.getpass())
except c.Error, e:
print "Could not login in:", e
sys.exit(1)
else:
select_dict = c.select_folder('INBOX', readonly=True)
for k, v in select_dict.items():
if k == 'UIDNEXT':
print '%s: %r' % (k,v)
c.logout()
新更新
dovecot-uidlist 示例
16762 W105493 S104093 :1417408077.2609_1.zumance
16763 S18340 W18608 :1417429204.3464_1.zumance
获取 dovecot-uidlist uid 最后一行的代码:
l = open("dovecot-uidlist").readlines()
print l[-1].split(" ")[0]
这是邮件管道的完整脚本:
import sys
import email
import re
from DB import *
full_msg = sys.stdin.readlines()
j = ''.join(full_msg)
msg = email.message_from_string(j)
match = re.search(r'[\w\.-]+@[\w\.-]+', msg['to'])
address = match.group(0)
address = address.split("@")
with open("/var/vmail/"+address[1]+"/"+address[0]+"/dovecot-uidlist", 'r') as f:
first_line = f.readline()
nextuid = first_line.split(" ")
nextuid = re.findall(r'\d+', nextuid[2])
sql = '''INSERT INTO Email(Id, Message, Uid, Domain, Mbox) VALUES (NULL, %s, %s, %s, %s)'''
db = DB()
db.query(sql, (msg, nextuid[0], address[1], address[0], ))