Envoi emailing de masse

Bonjour à tous,
Pour un client, je dois envoyer un même mail à une base de données de 32000 personnes (des avocats pour une campagne électorale)
Le problème est que légalement, je dois pouvoir prouver que j’ai envoyé ce mail par tranche de 99 personnes.
L’outil que je dois utiliser est SendInBlue. Auriez-vous une idée d’automatisation / outil / script que je pourrai utiliser pour ne pas avoir à réaliser + de 320 fois cette manipulation ?
Merci d’avance pour vos retours,
Bon lundi !

Salut
Emelia super simple à prendre en main et pas trop chère

1 « J'aime »

Cela voudrait donc dire que je devrais passer par Emelia plutot que SendInBlue ?

Je pense
Ça te permettrait d’envoyer petit à petit tes mails

J’utilise cette méthode, peut-être que d’autre te permettront d’avoir d’autres outils

bonjour
pas trop compris? avec Sendinblue tu peux prouver que tu as bien envoyé aux 32000 ???
que cherches tu a faire ?

Non, ce que j’ai besoin de prouver c’est que c’est par tranche de 99 que l’envoi a été fait, même si c’est le même mail pour les 32k contacts

honnêtement je ne vois pas … Mis à part envoyer la campagne 320 fois à 99 contacts… et fournir comme preuve 320 rapports statistiques…

Yes, de mon côté la seule chose que je vois c’est un script Python dév exclusivement pour ce besoin… Merci pour ton retour en tout cas !

Je suis sur tel, j’ai pas pris le temps de vérifier mais je ferais un découpage des 32.000 lignes en plusieurs feuilles et une auto Make ou n8n pour procéder aux envois.

Code Gsheets + n8n

Google Sheets
Mon prompt :

Fais-moi un script Apps script qui permet de découper 1 Google sheets avec une feuille s’appelant « all » contenant 32000 lignes en de multiples feuilles pour en avoir 99 par feuilles en reprenant celle de all. Il ne faut jamais que ce soit la même ligne qui soit repris et chaque nouveau feuillet se nommera « campagne » avec un nombre qui augmente à chaque nouvelle feuille, par exemple campagne 1 puis campagne 2, puis campagne 3

Le code renvoyé :

function splitSheet() {
  // Ouvrir le classeur actif
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // Sélectionner la feuille "all"
  var allSheet = spreadsheet.getSheetByName("all");
  // Obtenir le nombre total de lignes
  var totalRows = allSheet.getLastRow();
  
  // Vérifier si la feuille "all" existe
  if (!allSheet) {
    throw new Error("La feuille 'all' est introuvable.");
  }
  
  // Nombre de lignes par feuille
  var rowsPerSheet = 99;
  
  // Calculer le nombre de feuilles à créer
  var numOfSheets = Math.ceil(totalRows / rowsPerSheet);
  
  // Créer les nouvelles feuilles et copier les données
  for (var i = 0; i < numOfSheets; i++) {
    // Créer une nouvelle feuille avec le nom "campagne X"
    var newSheetName = "campagne " + (i + 1);
    var newSheet = spreadsheet.insertSheet(newSheetName);
    
    // Calculer la première et la dernière ligne à copier
    var startRow = (i * rowsPerSheet) + 1;
    var endRow = startRow + rowsPerSheet - 1;
    if (endRow > totalRows) {
      endRow = totalRows;
    }
    
    // Obtenir la plage de cellules à copier et copier les données
    var sourceRange = allSheet.getRange(startRow, 1, endRow - startRow + 1, allSheet.getLastColumn());
    var destinationRange = newSheet.getRange(1, 1, endRow - startRow + 1, allSheet.getLastColumn());
    sourceRange.copyTo(destinationRange);
  }
}

Automatisation n8n

Voici les étapes pour créer un workflow dans n8n pour lire le nombre de feuilles « campagne X » et envoyer des campagnes e-mail en utilisant Sendinblue:

  1. Faites glisser un node « Google Sheets » sur la zone de travail.
  2. Sélectionnez « Get All Sheets » comme opération.
  3. Exécutez le node pour récupérer les informations sur les feuilles.
  4. Faites glisser un node « Function » sur la zone de travail et reliez-le au node « Google Sheets ».
  5. Configurez le node « Function » pour créer un tableau contenant les noms des feuilles « campagne X ». Par exemple:
const sheets = items[0].json.sheets;
const campaigns = sheets.filter(sheet => sheet.title.startsWith('campagne'));
const campaignNames = campaigns.map(campaign => campaign.title);
return campaignNames.map(name => ({ json: { name } }));
  1. Faites glisser un node « Google Sheets » sur la zone de travail et reliez-le au node « Function ». Configurez-le pour récupérer les données dont vous avez besoin pour votre campagne d’e-mails. Pour cela, sélectionnez « Lookup Spreadsheet Row » comme opération et utilisez l’expression {{$item(0).$node["Function"].json["name"]}} pour sélectionner la feuille « campagne X » correspondante.
  2. Ajoutez un node « Function » après le node « Google Sheets » qui récupère les données de la feuille « campagne X ». Configurez le code pour créer un tableau de destinataires à partir des données récupérées. Par exemple :
const recipients = items.map(item => ({
  email: item.json.email,
  name: item.json.prenom + " " + item.json.nom,
}));
return [
  {
    json: {
      recipients,
    },
  },
];
  1. Faites glisser un node « Sendinblue » sur la zone de travail et reliez-le au node « Function » qui crée le tableau de destinataires. Configurez-le pour créer une nouvelle campagne en utilisant les données récupérées de Google Sheets. Remplissez les champs nécessaires pour créer la campagne, y compris le champ « Recipients » avec l’expression {{$json["recipients"]}} pour inclure tous les destinataires de la feuille « campagne X ».
  2. Faites glisser un autre node « Sendinblue » sur la zone de travail et reliez-le au précédent node « Sendinblue ». Configurez-le pour envoyer la campagne que vous venez de créer.

En suivant ces étapes, vous aurez un seul e-mail de campagne pour chaque feuille « campagne X », avec tous les destinataires inclus

Le code en Python (et Excel) avec la même logique, vu que tu parlais de le faire en Python @parnd 😉
import os
import math
import pandas as pd
import requests
from openpyxl import load_workbook


def split_excel_file(filename, rows_per_file=99):
    df = pd.read_excel(filename, sheet_name="all")

    num_files = math.ceil(len(df) / rows_per_file)

    file_list = []

    for i in range(num_files):
        start_row = i * rows_per_file
        end_row = start_row + rows_per_file
        new_df = df[start_row:end_row]

        new_file_name = f"campagne_{i + 1}.xlsx"
        file_list.append(new_file_name)
        new_df.to_excel(new_file_name, index=False)

    return file_list


def send_email_campaign(api_key, subject, sender, file_name):
    url_create = "https://api.sendinblue.com/v3/smtp/email"
    url_send = "https://api.sendinblue.com/v3/smtp/email/{id}/send"

    headers = {
        "accept": "application/json",
        "api-key": api_key,
        "content-type": "application/json",
    }

    # Lire les informations des destinataires à partir du fichier Excel
    recipients_df = pd.read_excel(file_name)
    recipients = []

    for _, row in recipients_df.iterrows():
        recipient_email = row['email']
        recipient_name = f"{row['prenom']} {row['nom']}"
        recipients.append({"email": recipient_email, "name": recipient_name})

    data_create = {
        "subject": subject,
        "sender": sender,
        "to": recipients,
        "htmlContent": "Contenu personnalisé pour la campagne",
    }

    response_create = requests.post(url_create, headers=headers, json=data_create)

    if response_create.status_code == 201:
        print(f"Campagne créée pour le fichier {file_name}")
        email_id = response_create.json()['id']

        response_send = requests.post(url_send.format(id=email_id), headers=headers)

        if response_send.status_code == 204:
            print(f"Campagne envoyée pour le fichier {file_name}")
        else:
            print(f"Erreur lors de l'envoi de la campagne pour le fichier {file_name}")

    else:
        print(f"Erreur lors de la création de la campagne pour le fichier {file_name}")


def main():
    api_key = "your_sendinblue_api_key"
    subject = "Sujet de l'email"
    sender = {"name": "Your Name", "email": "[email protected]"}

    input_file = "input.xlsx"
    file_list = split_excel_file(input_file)

    for file_name in file_list:
        send_email_campaign(api_key, subject, sender, file_name)


if __name__ == "__main__":
    main()

Ce script crée et envoie une campagne pour chaque feuille « campagne X » avec tous les destinataires inclus

Certainement des ajustements à faire, mais en espérant que ça t’aidera :v: