У меня есть этот скрипт 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 этого сообщения, поэтому, если я, например, удалю сообщение из базы данных, я также могу удалить сообщение со своим uid на сервере imap.
Я не хочу входить на сервер imap, а затем удалять сообщение по uid, потому что я не знаю пароль пользователя, так как он зашифрован.
Я думал получить, например, msg['Message-Id'], а затем выполнить поиск файлов в почтовом каталоге пользователя для этого Message-Id и удалить фактический файл, но для меня это звучит совершенно неправильно.
Я знаю, что в python у вас есть что-то вроде UIDNEXT в imaplib, но это при условии, что я вошел в систему, а я нет.
ОБНОВИТЬ:
С этим я могу получить следующий 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
Код для получения последней строки uid dovecot-uidlist:
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], ))
Сообщение в блоге с файлами по адресу https://pregmatch.org/read/python-procmail