Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -28,8 +28,8 @@ def authenticate_gmail(credentials_file):
|
|
| 28 |
if creds and creds.valid:
|
| 29 |
st.session_state.creds = creds
|
| 30 |
st.session_state.authenticated = True
|
| 31 |
-
|
| 32 |
-
return
|
| 33 |
except Exception as e:
|
| 34 |
st.error(f"Invalid token.json file: {e}")
|
| 35 |
os.remove('token.json')
|
|
@@ -38,8 +38,8 @@ def authenticate_gmail(credentials_file):
|
|
| 38 |
if st.session_state.creds and st.session_state.creds.expired and st.session_state.creds.refresh_token:
|
| 39 |
st.session_state.creds.refresh(Request())
|
| 40 |
st.session_state.authenticated = True
|
| 41 |
-
|
| 42 |
-
return
|
| 43 |
else:
|
| 44 |
if not st.session_state.flow:
|
| 45 |
st.session_state.flow = InstalledAppFlow.from_client_secrets_file(credentials_file, SCOPES)
|
|
@@ -56,7 +56,6 @@ def authenticate_gmail(credentials_file):
|
|
| 56 |
st.session_state.flow.fetch_token(code=auth_code)
|
| 57 |
st.session_state.creds = st.session_state.flow.credentials
|
| 58 |
st.session_state.authenticated = True
|
| 59 |
-
# Save the credentials to a file for later use
|
| 60 |
with open('token.json', 'w') as token_file:
|
| 61 |
json.dump({
|
| 62 |
"token": st.session_state.creds.token,
|
|
@@ -66,70 +65,37 @@ def authenticate_gmail(credentials_file):
|
|
| 66 |
"client_secret": st.session_state.creds.client_secret,
|
| 67 |
"scopes": st.session_state.creds.scopes
|
| 68 |
}, token_file)
|
| 69 |
-
st.success("Authentication successful!
|
| 70 |
-
fetch_emails_directly()
|
| 71 |
except Exception as e:
|
| 72 |
st.error(f"Error during authentication: {e}")
|
| 73 |
|
| 74 |
-
|
| 75 |
-
if st.session_state.authenticated and st.session_state.creds:
|
| 76 |
-
service = build('gmail', 'v1', credentials=st.session_state.creds)
|
| 77 |
-
label = "INBOX" # Default label, you can make this dynamic
|
| 78 |
-
st.info(f"Fetching emails from {label}...")
|
| 79 |
-
emails = fetch_emails(service, label)
|
| 80 |
-
if emails:
|
| 81 |
-
df = pd.DataFrame(emails)
|
| 82 |
-
st.dataframe(df)
|
| 83 |
-
csv = df.to_csv(index=False).encode('utf-8')
|
| 84 |
-
st.download_button("Download Emails as CSV", csv, f"{label}_emails.csv", "text/csv")
|
| 85 |
-
else:
|
| 86 |
-
st.warning(f"No emails found in {label}.")
|
| 87 |
-
else:
|
| 88 |
-
st.error("You are not authenticated. Please authenticate again.")
|
| 89 |
|
| 90 |
# Fetch Emails from Gmail API
|
| 91 |
def fetch_emails(service, label):
|
| 92 |
emails = []
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
msg
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
body = base64.urlsafe_b64decode(part['body'].get('data', '').encode('UTF-8')).decode('UTF-8')
|
| 116 |
-
email_data = {
|
| 117 |
-
"Date": headers.get('Date', ''),
|
| 118 |
-
"From": headers.get('From', ''),
|
| 119 |
-
"To": headers.get('To', ''),
|
| 120 |
-
"Subject": headers.get('Subject', ''),
|
| 121 |
-
"Snippet": msg.get('snippet', ''),
|
| 122 |
-
"Body": body,
|
| 123 |
-
"Attachments": "Yes" if 'attachmentId' in str(msg['payload']) else "No",
|
| 124 |
-
}
|
| 125 |
-
emails.append(email_data)
|
| 126 |
-
|
| 127 |
-
progress_bar.progress(min(len(emails) / total_emails, 1.0))
|
| 128 |
-
next_page_token = results.get('nextPageToken')
|
| 129 |
-
if not next_page_token:
|
| 130 |
-
break
|
| 131 |
-
|
| 132 |
-
st.success(f"Fetched {len(emails)} emails from {label}")
|
| 133 |
return emails
|
| 134 |
|
| 135 |
# Main Page
|
|
@@ -153,16 +119,19 @@ def main_page():
|
|
| 153 |
if not user_email or not app_password or not credentials_file:
|
| 154 |
st.error("Please provide all required inputs (Gmail, App Password, credentials.json)")
|
| 155 |
else:
|
| 156 |
-
# Save credentials.json locally
|
| 157 |
with open("credentials.json", "wb") as f:
|
| 158 |
f.write(credentials_file.getbuffer())
|
| 159 |
-
authenticate_gmail("credentials.json")
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
|
| 167 |
# Navigation
|
| 168 |
if "page" not in st.session_state:
|
|
|
|
| 28 |
if creds and creds.valid:
|
| 29 |
st.session_state.creds = creds
|
| 30 |
st.session_state.authenticated = True
|
| 31 |
+
st.success("Authentication successful!")
|
| 32 |
+
return creds
|
| 33 |
except Exception as e:
|
| 34 |
st.error(f"Invalid token.json file: {e}")
|
| 35 |
os.remove('token.json')
|
|
|
|
| 38 |
if st.session_state.creds and st.session_state.creds.expired and st.session_state.creds.refresh_token:
|
| 39 |
st.session_state.creds.refresh(Request())
|
| 40 |
st.session_state.authenticated = True
|
| 41 |
+
st.success("Authentication successful!")
|
| 42 |
+
return st.session_state.creds
|
| 43 |
else:
|
| 44 |
if not st.session_state.flow:
|
| 45 |
st.session_state.flow = InstalledAppFlow.from_client_secrets_file(credentials_file, SCOPES)
|
|
|
|
| 56 |
st.session_state.flow.fetch_token(code=auth_code)
|
| 57 |
st.session_state.creds = st.session_state.flow.credentials
|
| 58 |
st.session_state.authenticated = True
|
|
|
|
| 59 |
with open('token.json', 'w') as token_file:
|
| 60 |
json.dump({
|
| 61 |
"token": st.session_state.creds.token,
|
|
|
|
| 65 |
"client_secret": st.session_state.creds.client_secret,
|
| 66 |
"scopes": st.session_state.creds.scopes
|
| 67 |
}, token_file)
|
| 68 |
+
st.success("Authentication successful!")
|
|
|
|
| 69 |
except Exception as e:
|
| 70 |
st.error(f"Error during authentication: {e}")
|
| 71 |
|
| 72 |
+
return st.session_state.creds
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
# Fetch Emails from Gmail API
|
| 75 |
def fetch_emails(service, label):
|
| 76 |
emails = []
|
| 77 |
+
results = service.users().messages().list(userId='me', labelIds=[label], maxResults=100).execute()
|
| 78 |
+
messages = results.get('messages', [])
|
| 79 |
+
|
| 80 |
+
for message in messages:
|
| 81 |
+
msg = service.users().messages().get(userId='me', id=message['id'], format='full').execute()
|
| 82 |
+
headers = {header['name']: header['value'] for header in msg['payload']['headers']}
|
| 83 |
+
body = ''
|
| 84 |
+
if 'parts' in msg['payload']:
|
| 85 |
+
for part in msg['payload']['parts']:
|
| 86 |
+
if part['mimeType'] == 'text/plain':
|
| 87 |
+
body = base64.urlsafe_b64decode(part['body'].get('data', '').encode('UTF-8')).decode('UTF-8')
|
| 88 |
+
email_data = {
|
| 89 |
+
"Date": headers.get('Date', ''),
|
| 90 |
+
"From": headers.get('From', ''),
|
| 91 |
+
"To": headers.get('To', ''),
|
| 92 |
+
"Subject": headers.get('Subject', ''),
|
| 93 |
+
"Snippet": msg.get('snippet', ''),
|
| 94 |
+
"Body": body,
|
| 95 |
+
}
|
| 96 |
+
emails.append(email_data)
|
| 97 |
+
|
| 98 |
+
st.success(f"Fetched {len(emails)} emails from {label}.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
return emails
|
| 100 |
|
| 101 |
# Main Page
|
|
|
|
| 119 |
if not user_email or not app_password or not credentials_file:
|
| 120 |
st.error("Please provide all required inputs (Gmail, App Password, credentials.json)")
|
| 121 |
else:
|
|
|
|
| 122 |
with open("credentials.json", "wb") as f:
|
| 123 |
f.write(credentials_file.getbuffer())
|
| 124 |
+
creds = authenticate_gmail("credentials.json")
|
| 125 |
+
if creds:
|
| 126 |
+
service = build('gmail', 'v1', credentials=creds)
|
| 127 |
+
label = st.selectbox("Select Label", ["INBOX", "SENT", "DRAFTS", "TRASH", "SPAM"])
|
| 128 |
+
if st.button("Fetch Emails"):
|
| 129 |
+
emails = fetch_emails(service, label)
|
| 130 |
+
if emails:
|
| 131 |
+
df = pd.DataFrame(emails)
|
| 132 |
+
st.dataframe(df)
|
| 133 |
+
csv = df.to_csv(index=False).encode('utf-8')
|
| 134 |
+
st.download_button("Download Emails as CSV", csv, f"{label}_emails.csv", "text/csv")
|
| 135 |
|
| 136 |
# Navigation
|
| 137 |
if "page" not in st.session_state:
|