Невозможно хранить сообщения электронной почты в одном потоке Python smtplibPython

Программы на Python
Anonymous
Невозможно хранить сообщения электронной почты в одном потоке Python smtplib

Сообщение Anonymous »

Я автоматизирую свои сообщения Gmail, Пользователь создает учетную запись, автоматический ответ создается из gpt и отправляется на электронную почту пользователя, а затем пользователь отвечает, на что снова ответ, сгенерированный из gpt, отправляется пользователю, и это продолжается, проблема в том, что разговор не остается в одной ветке, каждый раз, когда пользователь отвечает, создается новая ветка.
Автоматическая электронная почта администратора:
def process_emails():
accounts = account_repo.get_pending_sending_accounts()
print(f'Found sending accounts with remaining limit today.')

for account in accounts:
last_sent_time = account['LastSentTime']
if last_sent_time is not None:
next_sending_time = last_sent_time + timedelta(minutes=account['MinimumSendingDelay'])

print('Last Sent Time: ', last_sent_time)
print('Next Sending Time: ', next_sending_time)
print('Now: ', datetime.now())

if next_sending_time > datetime.now():
print('It\'s not good time, try again later.\n')
continue

subject = generate_email_subject()
print('Subject: ', subject)

content = generate_email('new', {account['FirstName']}, settings.SENDER_NAME, subject, None)
content = json.loads(content)

send_email(account['Email'], content['subject'], content['body'], settings.EMAIL_IDENTIFIER)


Помощник по электронной почте:
def send_email(recipient, subject, content, unique_identifier, message_id=None, references=None,in_reply_to=None,user=None):
message = MIMEMultipart()
message['From'] = f"{settings.SENDER_NAME} "
message['To'] = recipient
message['Subject'] = subject
message['Reply-To'] = settings.REPLY_TO
message['X-Unique-Identifier'] = unique_identifier # Custom header to track the email

if message_id is None:
# Generate a new Message-ID for the initial email
message_id = email.utils.make_msgid(domain="taylorbrokerservices.com")
message['Message-ID'] = message_id
else:
# For replies, set the Message-ID and threading headers
new_message_id = email.utils.make_msgid(domain="taylorbrokerservices.com")
message['Message-ID'] = new_message_id
message['In-Reply-To'] = message_id
message['References'] = message_id if not references else references

message.attach(MIMEText(content, 'plain'))

Ответ пользователя:
def process_unread_emails(mail):
response, _ = mail.select(settings.IMAP_INBOX_NAME)
if response != 'OK':
raise Exception(f"Failed to select '{settings.IMAP_INBOX_NAME}'")

_, data = mail.search(None, 'UNSEEN')

unread_messages = data[0].split()

protected_emails = settings.PROTECTED_EMAILS.split(',')

for msg_num in unread_messages:
_, msg_data = mail.fetch(msg_num, '(RFC822)')

for response_part in msg_data:
if not isinstance(response_part, tuple):
continue

msg = email.message_from_bytes(response_part[1])

msg_receive_time = datetime.strptime(msg['date'], '%a, %d %b %Y %H:%M:%S %z')
msg_receive_time = msg_receive_time.replace(tzinfo=None)
random_number = random.randint(20, 60)

reply_time = msg_receive_time + timedelta(minutes=random_number)
print('Reply Time: ', reply_time)
print('Now : ', datetime.now())

message_id = msg['Message-ID']
existing_references = msg['References'] if 'References' in msg else ''
references = f"{existing_references} {message_id}".strip()
print('Message-ID of User: ', message_id)

sender = email.utils.parseaddr(msg.get('from'))[1]
subject = msg.get('subject')

if not any(pe in sender for pe in protected_emails):
continue

payloads = msg.get_payload()
if len(payloads) == 0:
continue

body = payloads[-1].get_payload()
soup = BeautifulSoup(body, 'html.parser')
content = generate_email('reply', sender, settings.SENDER_NAME, subject, soup.text)
content = json.loads(content)

try:
send_email(sender, content['subject'], content['body'], settings.EMAIL_IDENTIFIER, message_id, references, in_reply_to=message_id)


Подробнее здесь: https://stackoverflow.com/questions/785 ... on-smtplib

Вернуться в «Python»