📧 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 :
Mail.send(opts)— Envoi d'email standard (HTML + texte, CC/BCC, Reply-To). Les pièces jointes ne sont pas encore prises en charge — elles arrivent prochainement.Mail.sendCode(opts)— Génère un code de vérification, l'envoie et vous le retourne pour vérification ultérieure.
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).
- Connectez-vous à votre compte Google.
- Activez la vérification en deux étapes sur myaccount.google.com/security (obligatoire).
- Allez sur myaccount.google.com/apppasswords.
- Saisissez un nom (ex : « BotStrike »), cliquez sur Créer.
- Google affiche un mot de passe de 16 caractères type
abcd efgh ijkl mnop. Copiez-le immédiatement (il ne sera plus visible). - Utilisez votre adresse Gmail comme
useret ce mot de passe commepassword.
Props (chiffré côté serveur) plutôt qu'en dur dans le code.📨 Outlook / Hotmail / Microsoft 365
- Host :
smtp.office365.com - Port :
587(STARTTLS) - User : votre adresse complète
- Password : vous devez générer un App Password sur account.live.com/proofs/AppPassword (la 2FA doit être activée).
📨 SendGrid (recommandé en production)
- Créez un compte gratuit sur sendgrid.com (100 emails/jour gratuits).
- Allez dans Settings → API Keys, créez une clé.
- Host :
smtp.sendgrid.net· Port :587· User :apikey(littéralement) · Password : la clé API générée.
📨 Mailgun
- Inscrivez-vous sur mailgun.com.
- Host :
smtp.mailgun.org· Port :587· User et Password fournis dans le dashboard sous votre domaine.
📨 Yahoo Mail
- Host :
smtp.mail.yahoo.com· Port :587ou465(SSL). - Générez un mot de passe d'application sur login.yahoo.com/account/security.
3 — Référence API : Mail.send(opts)
| Option | Type | Description |
|---|---|---|
host | string | Serveur SMTP (défaut : smtp.gmail.com) |
port | int | Port SMTP (défaut : 587) |
user | string | Identifiant SMTP (votre adresse email) — requis |
password | string | Mot de passe ou App Password — requis |
to | string ou liste | Destinataire(s) — requis |
subject | string | Sujet du message |
text | string | Corps en texte brut (au moins l'un de text ou html est requis) |
html | string | Corps HTML (peut coexister avec text en multipart) |
from_name | string | Nom convivial (ex : « Mon Bot ») affiché à côté de l'adresse |
cc | string ou liste | Copies carbone |
bcc | string ou liste | Copies invisibles |
reply_to | string | Adresse de réponse |
ssl | bool | Force SSL/TLS (auto activé si port=465) |
Retour : {ok: true, recipients: N} ou {ok: false, error: "..."}.
4 — Exemple : envoi simple
# 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.
# ─── 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.
7 — Dépannage
| Erreur | Cause probable | Solution |
|---|---|---|
Username and Password not accepted | Mauvais mot de passe Gmail | Utilisez un App Password, pas votre mot de passe principal |
Connection refused | Mauvais host/port | Vérifiez : 587 STARTTLS ou 465 SSL |
STARTTLS extension not supported | Serveur en SSL direct | Mettez ssl: true et port: 465 |
Sender address rejected | SendGrid : domaine non vérifié | Vérifiez votre domaine dans le dashboard SendGrid |
| Email reçu en spam | SPF/DKIM manquants | Configurez SPF/DKIM sur votre domaine, ou utilisez SendGrid/Mailgun |
8 — Voir aussi
- 📄 Générer des factures PDF/Word — bientôt disponible. Le PDF s'enverra par Telegram : l'email, lui, reste en texte/HTML.
- 🔑 Properties — stockez vos identifiants SMTP de façon sécurisée.
- 🌐 HTTP Requests — alternative via API REST (SendGrid, Mailgun ont des APIs HTTP).