📧 Envoyer des emails depuis votre bot — Mail SDK

BotStrike intègre un objet global Mail qui permet d'envoyer des messages email via n'importe quel serveur SMTP (Gmail, Outlook, SendGrid, Mailgun, Yahoo, votre propre serveur…). Aucune installation requise — c'est intégré au worker.

1 — Vue d'ensemble

L'objet Mail est disponible automatiquement dans toutes vos commandes (Python et JavaScript). Il offre deux méthodes principales :

💡 Cas d'usage typiques — Vérification d'email à l'inscription, alertes admin, factures envoyées par email, notifications de commande, double authentification (2FA), récupération de mot de passe.

2 — Comment obtenir vos identifiants SMTP

📨 Gmail (le plus simple)

Gmail n'autorise plus l'usage du mot de passe principal pour SMTP depuis 2022. Vous devez créer un « mot de passe d'application » (App Password).

  1. Connectez-vous à votre compte Google.
  2. Activez la vérification en deux étapes sur myaccount.google.com/security (obligatoire).
  3. Allez sur myaccount.google.com/apppasswords.
  4. Saisissez un nom (ex : « BotStrike »), cliquez sur Créer.
  5. Google affiche un mot de passe de 16 caractères type abcd efgh ijkl mnop. Copiez-le immédiatement (il ne sera plus visible).
  6. Utilisez votre adresse Gmail comme user et ce mot de passe comme password.
⚠️ Sécurité — Ne commitez jamais ce mot de passe dans Git. Stockez-le dans Props (chiffré côté serveur) plutôt qu'en dur dans le code.

📨 Outlook / Hotmail / Microsoft 365

📨 SendGrid (recommandé en production)

📨 Mailgun

📨 Yahoo Mail

3 — Référence API : Mail.send(opts)

OptionTypeDescription
hoststringServeur SMTP (défaut : smtp.gmail.com)
portintPort SMTP (défaut : 587)
userstringIdentifiant SMTP (votre adresse email) — requis
passwordstringMot de passe ou App Password — requis
tostring ou listeDestinataire(s) — requis
subjectstringSujet du message
textstringCorps en texte brut (au moins l'un de text ou html est requis)
htmlstringCorps HTML (peut coexister avec text en multipart)
from_namestringNom convivial (ex : « Mon Bot ») affiché à côté de l'adresse
ccstring ou listeCopies carbone
bccstring ou listeCopies invisibles
reply_tostringAdresse de réponse
sslboolForce SSL/TLS (auto activé si port=465)

Retour : {ok: true, recipients: N} ou {ok: false, error: "..."}.

4 — Exemple : envoi simple

Python
JavaScript
# Commande : /contact
result = Mail.send({
    'host': 'smtp.gmail.com',
    'port': 587,
    'user': 'monbot@gmail.com',
    'password': Props.get('SMTP_APP_PASSWORD'),  # stocké dans Props
    'from_name': 'Mon Bot Telegram',
    'to': 'admin@exemple.com',
    'subject': 'Nouveau message depuis le bot',
    'text': f"De : {user.get('first_name')}\nID : {user.get('id')}\nMessage : {params}",
    'html': f"<h2>Nouveau message</h2><p>De <b>{user.get('first_name')}</b> (ID {user.get('id')})</p><blockquote>{params}</blockquote>",
})

if result['ok']:
    bot.sendMessage("✅ Votre message a bien été transmis à l'administrateur.")
else:
    bot.sendMessage(f"❌ Erreur d'envoi : {result['error']}")
// Commande : /contact
const result = await Mail.send({
  host: 'smtp.gmail.com',
  port: 587,
  user: 'monbot@gmail.com',
  password: await Props.get('SMTP_APP_PASSWORD'),
  from_name: 'Mon Bot Telegram',
  to: 'admin@exemple.com',
  subject: 'Nouveau message depuis le bot',
  text: `De : ${user.first_name}\nID : ${user.id}\nMessage : ${params}`,
  html: `<h2>Nouveau message</h2><p>De <b>${user.first_name}</b> (ID ${user.id})</p><blockquote>${params}</blockquote>`,
});

if (result.ok) {
  await bot.sendMessage("✅ Votre message a bien été transmis à l'administrateur.");
} else {
  await bot.sendMessage(`❌ Erreur d'envoi : ${result.error}`);
}

5 — Exemple complet : vérification d'email avec code à 6 chiffres

Flux : l'utilisateur tape /verifier mon@email.com → le bot envoie un code par email → le bot demande à l'utilisateur de saisir le code → vérification.

Python
JavaScript
# ─── Commande 1 : /verifier <email> ───
email = (params or '').strip()
if '@' not in email or '.' not in email:
    bot.sendMessage("❌ Veuillez fournir un email valide. Exemple : /verifier moi@exemple.com")
    return

# Génère le code et l'envoie
result = Mail.sendCode({
    'user': 'monbot@gmail.com',
    'password': Props.get('SMTP_APP_PASSWORD'),
    'from_name': 'Mon Service',
    'to': email,
    'subject': 'Votre code de vérification',
    'length': 6,  # code à 6 chiffres
})

if not result['ok']:
    bot.sendMessage(f"❌ Échec de l'envoi : {result['error']}")
    return

# Stocke le code en attente avec une expiration de 10 minutes
import_user_id = str(user['id'])
Props.set(f"verify_{import_user_id}_code", result['code'])
Props.set(f"verify_{import_user_id}_email", email)
Props.set(f"verify_{import_user_id}_expires", int(time.time()) + 600)

bot.sendMessage(
    f"📧 Un code à 6 chiffres a été envoyé à *{email}*.\n\n"
    f"Tapez maintenant : `/code <votre code>`",
    {'parse_mode': 'Markdown'}
)


# ─── Commande 2 : /code <code> ───
code_saisi = (params or '').strip()
uid = str(user['id'])
code_attendu = Props.get(f"verify_{uid}_code")
expires = Props.get(f"verify_{uid}_expires") or 0

if not code_attendu:
    bot.sendMessage("❌ Aucun code en attente. Lancez d'abord /verifier <email>")
elif int(time.time()) > int(expires):
    bot.sendMessage("⏰ Code expiré. Recommencez avec /verifier <email>")
elif code_saisi == code_attendu:
    email_ok = Props.get(f"verify_{uid}_email")
    Props.set(f"user_{uid}_verified_email", email_ok)
    Props.delete(f"verify_{uid}_code")
    bot.sendMessage(f"✅ Email *{email_ok}* vérifié avec succès !", {'parse_mode': 'Markdown'})
else:
    bot.sendMessage("❌ Code incorrect. Réessayez.")
// ─── Commande 1 : /verifier <email> ───
const email = (params || '').trim();
if (!email.includes('@') || !email.includes('.')) {
  await bot.sendMessage("❌ Email invalide. Exemple : /verifier moi@exemple.com");
  return;
}

const result = await Mail.sendCode({
  user: 'monbot@gmail.com',
  password: await Props.get('SMTP_APP_PASSWORD'),
  from_name: 'Mon Service',
  to: email,
  subject: 'Votre code de vérification',
  length: 6,
});

if (!result.ok) {
  await bot.sendMessage(`❌ Échec de l'envoi : ${result.error}`);
  return;
}

const uid = String(user.id);
await Props.set(`verify_${uid}_code`, result.code);
await Props.set(`verify_${uid}_email`, email);
await Props.set(`verify_${uid}_expires`, Math.floor(Date.now()/1000) + 600);

await bot.sendMessage(
  `📧 Un code à 6 chiffres a été envoyé à *${email}*.\n\nTapez maintenant : \`/code <votre code>\``,
  { parse_mode: 'Markdown' }
);


// ─── Commande 2 : /code <code> ───
const codeSaisi = (params || '').trim();
const uid = String(user.id);
const codeAttendu = await Props.get(`verify_${uid}_code`);
const expires = parseInt(await Props.get(`verify_${uid}_expires`)) || 0;

if (!codeAttendu) {
  await bot.sendMessage("❌ Aucun code en attente. Lancez d'abord /verifier <email>");
} else if (Math.floor(Date.now()/1000) > expires) {
  await bot.sendMessage("⏰ Code expiré. Recommencez avec /verifier <email>");
} else if (codeSaisi === codeAttendu) {
  const emailOk = await Props.get(`verify_${uid}_email`);
  await Props.set(`user_${uid}_verified_email`, emailOk);
  await Props.delete(`verify_${uid}_code`);
  await bot.sendMessage(`✅ Email *${emailOk}* vérifié avec succès !`, { parse_mode: 'Markdown' });
} else {
  await bot.sendMessage("❌ Code incorrect. Réessayez.");
}

6 — Bonnes pratiques

🔐 Stockez vos identifiants dans Props, jamais en dur

Configurez une seule fois dans une commande admin :

# /admin_setmail <app_password>
if user['id'] != ADMIN_ID:
    return
Props.set('SMTP_APP_PASSWORD', params)
bot.sendMessage("✅ Mot de passe SMTP enregistré.")

⏱ Limitez la fréquence d'envoi

Gmail limite à ~500 emails/jour, SendGrid 100/jour gratuit. Implémentez un compteur dans Props pour éviter le bannissement.

📝 Toujours fournir text ET html

Les serveurs anti-spam pénalisent les emails HTML sans alternative texte. BotStrike construit automatiquement un message multipart/alternative si les deux sont fournis.

⚠️ Évitez le spam — N'envoyez jamais de messages non sollicités. Toujours obtenir un consentement explicite de l'utilisateur (ex : il a fourni son email lui-même).

7 — Dépannage

ErreurCause probableSolution
Username and Password not acceptedMauvais mot de passe GmailUtilisez un App Password, pas votre mot de passe principal
Connection refusedMauvais host/portVérifiez : 587 STARTTLS ou 465 SSL
STARTTLS extension not supportedServeur en SSL directMettez ssl: true et port: 465
Sender address rejectedSendGrid : domaine non vérifiéVérifiez votre domaine dans le dashboard SendGrid
Email reçu en spamSPF/DKIM manquantsConfigurez SPF/DKIM sur votre domaine, ou utilisez SendGrid/Mailgun

8 — Voir aussi