Ajouter 'gmailv2.py'
parent
36ad0dc924
commit
1b861dc2d9
@ -0,0 +1,101 @@
|
||||
import imaplib
|
||||
import email
|
||||
import re
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
import time
|
||||
from requests.adapters import HTTPAdapter
|
||||
from urllib3.util.retry import Retry
|
||||
|
||||
def connect_to_gmail(email_address, password):
|
||||
imap_server = "imap.gmail.com"
|
||||
imap_port = 993
|
||||
|
||||
imap_client = imaplib.IMAP4_SSL(imap_server, imap_port)
|
||||
imap_client.login(email_address, password)
|
||||
return imap_client
|
||||
|
||||
def find_unsubscribe_link(email_body):
|
||||
soup = BeautifulSoup(email_body, 'html.parser')
|
||||
unsubscribe_links = soup.find_all('a', href=re.compile(r'unsubscribe|opt-out', re.I))
|
||||
|
||||
if unsubscribe_links:
|
||||
return unsubscribe_links[0]['href']
|
||||
return None
|
||||
|
||||
def requests_retry_session(
|
||||
retries=3,
|
||||
backoff_factor=0.3,
|
||||
status_forcelist=(500, 502, 504),
|
||||
session=None,
|
||||
):
|
||||
session = session or requests.Session()
|
||||
retry = Retry(
|
||||
total=retries,
|
||||
read=retries,
|
||||
connect=retries,
|
||||
backoff_factor=backoff_factor,
|
||||
status_forcelist=status_forcelist,
|
||||
)
|
||||
adapter = HTTPAdapter(max_retries=retry)
|
||||
session.mount('http://', adapter)
|
||||
session.mount('https://', adapter)
|
||||
return session
|
||||
|
||||
def unsubscribe(imap_client, email_address, password):
|
||||
imap_client.select('INBOX')
|
||||
_, message_numbers = imap_client.search(None, 'ALL')
|
||||
|
||||
successful_unsubscribes = 0
|
||||
failed_unsubscribes = 0
|
||||
|
||||
for num in message_numbers[0].split():
|
||||
_, msg_data = imap_client.fetch(num, '(RFC822)')
|
||||
email_body = msg_data[0][1]
|
||||
email_message = email.message_from_bytes(email_body)
|
||||
|
||||
if email_message.is_multipart():
|
||||
for part in email_message.walk():
|
||||
if part.get_content_type() == "text/html":
|
||||
try:
|
||||
body = part.get_payload(decode=True).decode('utf-8')
|
||||
except UnicodeDecodeError:
|
||||
try:
|
||||
body = part.get_payload(decode=True).decode('iso-8859-1')
|
||||
except UnicodeDecodeError:
|
||||
print(f"Impossible de décoder l'e-mail {num}")
|
||||
failed_unsubscribes += 1
|
||||
continue
|
||||
|
||||
unsubscribe_link = find_unsubscribe_link(body)
|
||||
|
||||
if unsubscribe_link:
|
||||
print(f"Lien de désabonnement trouvé: {unsubscribe_link}")
|
||||
try:
|
||||
response = requests_retry_session().get(unsubscribe_link, timeout=10)
|
||||
if response.status_code == 200:
|
||||
print("Désabonnement réussi!")
|
||||
successful_unsubscribes += 1
|
||||
else:
|
||||
print(f"Échec du désabonnement. Code de statut: {response.status_code}")
|
||||
failed_unsubscribes += 1
|
||||
except Exception as e:
|
||||
print(f"Erreur lors du désabonnement: {str(e)}")
|
||||
failed_unsubscribes += 1
|
||||
break
|
||||
|
||||
imap_client.close()
|
||||
imap_client.logout()
|
||||
|
||||
return successful_unsubscribes, failed_unsubscribes
|
||||
|
||||
if __name__ == "__main__":
|
||||
email_address = "à remplir"
|
||||
password = "à remplir"
|
||||
|
||||
imap_client = connect_to_gmail(email_address, password)
|
||||
successes, failures = unsubscribe(imap_client, email_address, password)
|
||||
|
||||
print(f"\nRésumé:")
|
||||
print(f"Désabonnements réussis: {successes}")
|
||||
print(f"Désabonnements échoués: {failures}")
|
Loading…
Reference in New Issue