I am trying to save multiple emails in my drafts folder so I could review and press the SEND button in my web browser but I seem to be running into multiple issues.
I spent about half a day checking google and stackoverflow but didnt get much luck:
Here are a few examples that seemed relevant but didnt work
How do I create a draft in Gmail using IMAP using Python
Programmatically Save Draft in Gmail drafts folder
Creating a Draft message in Gmail using the imaplib in Python
Programmatically Save Draft in Gmail drafts folder
Below is my code, which executes and completes with a 0 code but nothing is saved to my drafts folder. Can anyone please help ?
import imaplib
import ssl
import email.message
import email.charset
import time
class DraftMailDemo:
def send(self):
tls_context = ssl.create_default_context()
server = imaplib.IMAP4_SSL('imap.gmail.com')
#server.starttls(ssl_context=tls_context)
server.login('some.email@gmail.com', 'pass123')
# Select mailbox
server.select("INBOX.Drafts")
# Create message
new_message = email.message.Message()
new_message["From"] = "sender@mydomain.com"
new_message["To"] = "Jimmy <recipient@mydomain.com>"
new_message["Subject"] = "Your subject"
new_message.set_payload("""
This is your message.
It can have multiple lines and
contain special characters: äöü.
""")
# Fix special characters by setting the same encoding we'll use later to encode the message
new_message.set_charset(email.charset.Charset("utf-8"))
encoded_message = str(new_message).encode("utf-8")
print(encoded_message)
server.append('INBOX.Drafts', '', imaplib.Time2Internaldate(time.time()), encoded_message)
# Cleanup
#server.close()
server.logout()
if __name__ == '__main__':
mail = DraftMailDemo()
mail.send()
Output of the program:
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /Users/prashanth/PycharmProjects/pythonTools/DraftMailDemo.py
b'From: sender@mydomain.com\nTo: Jimmy <recipient@mydomain.com>\nSubject: Your subject\nMIME-Version: 1.0\nContent-Type: text/plain; charset="utf-8"\nContent-Transfer-Encoding: base64\n\nCiAgICAgICAgVGhpcyBpcyB5b3VyIG1lc3NhZ2UuCiAgICAgICAgSXQgY2FuIGhhdmUgbXVsdGlw\nbGUgbGluZXMgYW5kCiAgICAgICAgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnM6IMOkw7bDvC4K\nICAgICAgICA=\n'
Process finished with exit code 0
I even tried this following code and it executes with a 0 exit code but still doesnt save anything to the Drafts folder.
import imaplib
import time
import email
def createdraft():
conn = imaplib.IMAP4_SSL('imap.gmail.com', port=993)
conn.login('some.email@gmail.com', 'pass123')
conn.select('[Gmail]/Drafts')
conn.append("[Gmail]/Drafts", '', imaplib.Time2Internaldate(time.time()), str(email.message_from_string('TEST')).encode('UTF-8'))
class SecondTryDraft:
pass
if __name__ == '__main__':
mail = SecondTryDraft()
createdraft()
My Environment:
Python : 3.10
OS : Mac OS Big Sur 11.6.5
Ok, I finally figured this out after multiple tries and tweaking the other examples. I was able to create a MultiMime message that I can save to the Drafts folder and it works, hurray !!
It doesnt seem very efficient though (execution takes around 3-5 secs - I could use some suggestions on making it more efficient.
import imaplib
import time
from email.message import EmailMessage
from email.headerregistry import Address
def createdraft(lead_name, lead_email):
msg = EmailMessage()
msg['Subject'] = "My Introduction"
msg['From'] = Address("Jane Doe", "Jane.Doe", "gmail.com")
msg['To'] = Address(lead_name, lead_email.split("@")[0], lead_email.split("@")[1])
msg.set_type('text/html')
html_msg = f"""
<div class="gmail_default" style="color:rgb(0,0,255)"><font size="2">Hello {lead_name.split(" ")[0]},</font></div>
<div class="gmail_default" style="color:rgb(0,0,255)"><font size="2"><br></font></div>
<div class="gmail_default" style="color:rgb(0,0,255)"><font size="2">My name is John and I would like to connect with you.
<div class="gmail_default" style="color:rgb(0,0,255)"><font size="2">Look forward to hearing from you.<br></font></div>
<div class="gmail_default" style="color:rgb(0,0,255)"><font size="2"><br clear="all"></font></div>
<div><font size="2"><b><span style="color:rgb(0,0,255)">Jane</span></b></font></div>
<div><font size="2"><b><span style="color:rgb(0,0,255)">Mobile : 111-222-3333</span></b></font></div>
<div><font size="2"><b><span style="color:rgb(0,0,255)">Email : <a href="mailto:Jane.Doe@gmail.com" target="_blank">Jane.Doe@gmail.<wbr>com</a></span></b></font></div>
"""
msg.add_alternative(html_msg, subtype="html")
conn = imaplib.IMAP4_SSL('imap.gmail.com', port=993)
conn.login('jane.doe@gmail.com', 'pass123')
conn.select('[Gmail]/Drafts')
conn.append("[Gmail]/Drafts", '', imaplib.Time2Internaldate(time.time()), str(msg).encode('UTF-8'))
class CreateDraftMultiMimeText:
pass
if __name__ == '__main__':
mail = CreateDraftMultiMimeText()
createdraft('John Doe', 'John.Doe@gmail.com')
Environment :
Python : 3.10
OS : Mac OS Big Sur 11.6.5