[MY-RS] Envoyer des email depuis une application

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Flo_
Messages : 18
Inscription : 20 Avr 2017 08:43

Re: [MY-RS] Envoyer des email depuis une application

Message par Flo_ » 14 Août 2017 10:33

Drakulo a écrit :
14 Août 2017 10:25
Flo_ a écrit :
13 Août 2017 17:59
Pour ce qui est du script, j'ai utilisé ceci niveau php
C'est quand même vachement risqué d'exposer sur le web un service qui envoie des mails comme ça...

:|
Merci de l'info. Mais au final si le lien que j'appel via mon application (et qui m'envoie grâce au script php le mail) n'est connu que de moi même, où est le risque (c'est peut être une question stupide, mais je ne m'y connais pas beaucoup dans ce domaine là).

Merci par avance

Avatar de l’utilisateur
Drakulo
Messages : 113
Inscription : 10 Mars 2017 22:49
Contact :

Re: [MY-RS] Envoyer des email depuis une application

Message par Drakulo » 14 Août 2017 10:39

Flo_ a écrit :
14 Août 2017 10:33
Mais au final si le lien que j'appel via mon application (et qui m'envoie grâce au script php le mail) n'est connu que de moi même, où est le risque (c'est peut être une question stupide, mais je ne m'y connais pas beaucoup dans ce domaine là).
Si ton URL est accessible sans sécurité, TOUT LE MONDE peut potentiellement y accéder. C'est une très grosse erreur de penser ça ! Internet est blindé de Bots qui vont chercher des URLs non sécurisées pour lancer des actions malveillantes. C'est un coup à se faire bannir de son hébergeur sans comprendre pourquoi. Méfie-toi.

:aille:
Fun Games Maker @TriplArt
Coach à esprit UNITY : Finissez vos jeux, vivez de votre passion
Enseignant de programmation / Unity3D à Bellecour Ecole

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [MY-RS] Envoyer des email depuis une application

Message par F@B » 14 Août 2017 10:54

bien entendu ! il FAUT sécuriser le formulaire avec un clef ou autre !

d'ailleurs en php il faut sécuriser tout formulaire.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Flo_
Messages : 18
Inscription : 20 Avr 2017 08:43

Re: [MY-RS] Envoyer des email depuis une application

Message par Flo_ » 14 Août 2017 10:57

D'accord. Merci de l'info :)
Au passage je tiens à signaler que je sais plus trop comment j'ai procèdé, mais au final ça marche même après le build.

A part question sécurité, tout roule pour le moment ;) Bon après comme je l'ai dis plus haut c'est juste un tout petit projet personnel, donc à part me faire bannir de l'hébergeur si je me fais spammer ça risque rien d'autre ?

Merci encore

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: [MY-RS] Envoyer des email depuis une application

Message par F@B » 14 Août 2017 11:10

Bin niveau conscience pro, tu vas transformer un serveur, en serveur de SPAM, polluer des millions de boites aux lettres de EnlargeYourWTF, ou pire un email de pishing de la nouvelle attaque causant plusieurs milliers, millions de victimes....

tout ça juste par feignasserie de ne pas ajouter un chechsum ou une clef ou un minimum de contrôle. :mrgreen:

Donc oui on peux se dire "c'est pas grave, ça marche ! ".... à toi de voir ! :gene:

La en plus ton script tel quel on peut injecter des adresses je pense.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Flo_
Messages : 18
Inscription : 20 Avr 2017 08:43

Re: [MY-RS] Envoyer des email depuis une application

Message par Flo_ » 14 Août 2017 11:20

F@B a écrit :
14 Août 2017 11:10
Bin niveau conscience pro, tu vas transformer un serveur, en serveur de SPAM, polluer des millions de boites aux lettres de EnlargeYourWTF, ou pire un email de pishing de la nouvelle attaque causant plusieurs milliers, millions de victimes....

tout ça juste par feignasserie de ne pas ajouter un chechsum ou une clef ou un minimum de contrôle. :mrgreen:

Donc oui on peux se dire "c'est pas grave, ça marche ! ".... à toi de voir ! :gene:

La en plus ton script tel quel on peut injecter des adresses je pense.
Ah, donc tu veux dire qu'avec mon script on peut envoyer des email pas que à mon adresse? Si je lock l'adresse dans le script je sais pas trop comment est ce que ça suffirait ?
Quoi qu'il en soit j'essayerais d'ajouter ce dont tu m'as parlé si j'y arrive, c'est pas vraiment l'envie qui m'en manque, c'est plus les compétences et le temps.

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [MY-RS] Envoyer des email depuis une application

Message par simonj » 14 Août 2017 11:49

Salut,

J'ai eu à faire la même chose sur un jeu. Du coup je me suis fait un script .php pour envoyer des mails. Il est somme toute assez basique mais pour l'instant il fonctionne bien.

Liste des paramètres à envoyer en POST :
  • key : La clef de sécurité pour envoyer ton message. Elle DOIT ÊTRE cryptée en MD5 (Jamais envoyer de mdp en clair sur le réseau) et constitué d'un "sel" au début (Une chaine fixe qui n'as rien à voir avec ton mdp) et de ton mdp à la fin. Par exemple dans ton exemple la clef envoyé devras être constitué de "th3Me9aS3I" + "_myKey3xempl3_" haché par la fonction md5.
  • from : L'adresse qui va envoyer le message. Attention cette adresse peux être non validée et bloquée par des boites mail. Ca ne m'as jamais arrivé, mais c'est possible.
  • to : L'adresse du destinataire du mail.
  • subject : Le sujet du mail.
  • body : Le message du mail.
Bien sûr c'est à héberger sur un serveur web et il faut envoyer le WWW de Unity pour lui envoyer les bons paramètres.

Tu peux même récupérer les codes de retour pour savoir comment ça s'est passé (200, 400, 401, 500).

Code : Tout sélectionner

<?php
	function verifyKey($keyExpected) 
	{
		$salt = "th3Me9aS3I";
		$keys = array("_myKey3xempl3_");
		
		if($keyExpected == null)
			return false;
		
		foreach($keys as $key)
		{
			$keyTemporary = md5($key . $salt);
			if($keyTemporary == $keyExpected)
				return true;
		}
		
		return false;
	}

	$separatorHeader = "\r\n";
	$errorLog = "";
	
	sendMessage();
	
	function sendMessage() 
	{
		if(!verifyKey($_POST["key"]))
		{
			http_response_code(401);
			print_r("Wrong identification");
			return;
		}
		
		// Validation
		$isValid = true;
		if(!isset($_POST["from"]))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'from' is empty\n"; 
		}
		else if(!filter_var($_POST["from"], FILTER_VALIDATE_EMAIL))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'from' is invalid\n"; 
		}
		if(!isset($_POST["to"]))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'to' is empty\n"; 
		}
		else  if(!filter_var($_POST["to"], FILTER_VALIDATE_EMAIL))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'to' is invalid \n"; 
		}
		if(!isset($_POST["subject"]))
		{
			$isValid = false;
			$errorLog .= "'subject' is empty\n"; 
		}
		if(!isset($_POST["body"]))
		{
			$isValid = false;
			$errorLog .= "'body' is empty\n"; 
		}
			
		// Sending
		if($isValid) 
		{
			$to = $_POST["to"];
			$subject = $_POST["subject"];
			$body = $_POST["body"];
			$headers = "From: " . $_POST["from"];
			
			if(mail($to, $subject, $body, $headers))
			{
				http_response_code(200);
				print_r("Message envoyé");
			}
			else 
			{
				http_response_code(500);
				print_r("Erreur dans l'envoi du message");
			}
		}
		else 
		{
			http_response_code(400);
			print_r("Erreur dans le message : \n" . $errorLog);
		}
	}
?>
PS : C'est pas normal que le code soit tout collé... !

Flo_
Messages : 18
Inscription : 20 Avr 2017 08:43

Re: [MY-RS] Envoyer des email depuis une application

Message par Flo_ » 14 Août 2017 12:23

simonj a écrit :
14 Août 2017 11:49
Salut,

J'ai eu à faire la même chose sur un jeu. Du coup je me suis fait un script .php pour envoyer des mails. Il est somme toute assez basique mais pour l'instant il fonctionne bien.

Liste des paramètres à envoyer en POST :
  • key : La clef de sécurité pour envoyer ton message. Elle DOIT ÊTRE cryptée en MD5 (Jamais envoyer de mdp en clair sur le réseau) et constitué d'un "sel" au début (Une chaine fixe qui n'as rien à voir avec ton mdp) et de ton mdp à la fin. Par exemple dans ton exemple la clef envoyé devras être constitué de "th3Me9aS3I" + "_myKey3xempl3_" haché par la fonction md5.
  • from : L'adresse qui va envoyer le message. Attention cette adresse peux être non validée et bloquée par des boites mail. Ca ne m'as jamais arrivé, mais c'est possible.
  • to : L'adresse du destinataire du mail.
  • subject : Le sujet du mail.
  • body : Le message du mail.
Bien sûr c'est à héberger sur un serveur web et il faut envoyer le WWW de Unity pour lui envoyer les bons paramètres.

Tu peux même récupérer les codes de retour pour savoir comment ça s'est passé (200, 400, 401, 500).

Code : Tout sélectionner

<?php
	function verifyKey($keyExpected) 
	{
		$salt = "th3Me9aS3I";
		$keys = array("_myKey3xempl3_");
		
		if($keyExpected == null)
			return false;
		
		foreach($keys as $key)
		{
			$keyTemporary = md5($key . $salt);
			if($keyTemporary == $keyExpected)
				return true;
		}
		
		return false;
	}

	$separatorHeader = "\r\n";
	$errorLog = "";
	
	sendMessage();
	
	function sendMessage() 
	{
		if(!verifyKey($_POST["key"]))
		{
			http_response_code(401);
			print_r("Wrong identification");
			return;
		}
		
		// Validation
		$isValid = true;
		if(!isset($_POST["from"]))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'from' is empty\n"; 
		}
		else if(!filter_var($_POST["from"], FILTER_VALIDATE_EMAIL))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'from' is invalid\n"; 
		}
		if(!isset($_POST["to"]))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'to' is empty\n"; 
		}
		else  if(!filter_var($_POST["to"], FILTER_VALIDATE_EMAIL))
		{
			$isValid = false;
			$errorLog .= "Adress mail 'to' is invalid \n"; 
		}
		if(!isset($_POST["subject"]))
		{
			$isValid = false;
			$errorLog .= "'subject' is empty\n"; 
		}
		if(!isset($_POST["body"]))
		{
			$isValid = false;
			$errorLog .= "'body' is empty\n"; 
		}
			
		// Sending
		if($isValid) 
		{
			$to = $_POST["to"];
			$subject = $_POST["subject"];
			$body = $_POST["body"];
			$headers = "From: " . $_POST["from"];
			
			if(mail($to, $subject, $body, $headers))
			{
				http_response_code(200);
				print_r("Message envoyé");
			}
			else 
			{
				http_response_code(500);
				print_r("Erreur dans l'envoi du message");
			}
		}
		else 
		{
			http_response_code(400);
			print_r("Erreur dans le message : \n" . $errorLog);
		}
	}
?>
PS : C'est pas normal que le code soit tout collé... !

Tout d'abord je te remercie pour ton code et ton aide. Cependant je n'avais jamais touché à php avant d'ouvrir ce topic. J'ai peur de ne pas savoir comment envoyer des paramètres en POST, ni crypter en md5, ni une bonne partie du reste. Il en est d'ailleurs de même pour ce qui est d'envoyer des infos avec WWW pour le script php.

Actuellement je crois que mon script fonctionne même si comme l'on dit les deux personnes qui m'ont récemment aidé en répondant, ce n'est pas sécurisé. Je vais tâcher d'en apprendre un peu plus sur comment sécuriser cela malgré que j'aurais surement du mal.

Merci tout de même pour ta réponse que je garde de côté dans le cas où les précédente n'aboutieraient à rien

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [MY-RS] Envoyer des email depuis une application

Message par simonj » 14 Août 2017 14:22

Je ne veux pas insister mais honnêtement il n'y a rien d'insurmontable. Surtout que l'on es là pour t'aider.

Pour envoyer des paramètres depuis UNITY vers une adresse mail, tu dois créer un WWWForm (Formulaire WWW).

Code : Tout sélectionner

WWWForm form = new WWWForm();
Une fois que tu as crée ton formulaire. Tu peux lui ajouter des paramètres qui vont être ajouté dans l'URL de ta page. C'est juste un système de clef/valeur (En POST ou GET, ici c'est en POST mais tu peux modifier pour les envoyer en GET. Mais pas beaucoup d'intérêt dans notre cas).

Code : Tout sélectionner

form.AddField("address", "monadresse");

Code : Tout sélectionner

form.AddField("subject", "testtt");

Code : Tout sélectionner

form.AddField("message", "testest");
Et une fois que tu as ajouté tous tes paramètres, tu peux envoyer ce formulaire à une adresse grâce à la classe WWW. Tu lui donnes une URL à laquelle envoyer tout ton bazard, ton formulaire et il fait tout seul les choses.

Code : Tout sélectionner

WWW www = new WWW("http://monsite.fr/sendemailscript.php", form);
Ca c'est la base.

Après dans le script .php que je t'ai donné, tu as les même paramètres. Avec un nom que j'ai fixé dans le script. C'est juste un protocole pour que l'application et la page web puisse se comprendre mais c'est pas bien plus compliqué. A toi de mettre le bon nom des paramètres que tu veux envoyer (key, from, to, subject, body)

La seule chose un peu plus compliqué c'est créer un mot de passe crypté en MD5 (Méthode de cryptage) dans UNITY. Du coup voici une fonction de cryptage en MD5 que tu peux utiliser dans UNITY.

Code : Tout sélectionner

public static string GetMD5Hash(string a_input, string a_salt)
    {
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(a_input + a_salt);
        bs = x.ComputeHash(bs);
        System.Text.StringBuilder s = new System.Text.StringBuilder();
        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }
        return s.ToString();
    }
    
Désolé pour la mise en forme toute compressé, c'est moche et pas compréhensible. Mais le but c'est que tu puisses l'utiliser. Alors sache que pour l'utiliser, tu dois lui passer en paramètres ton mot de passe et un une chaîne de caractère que l'on appelle le "Sel" que l'on met en plein milieu du mot de passe pour complexifier le tout.

Code : Tout sélectionner

GetMD5Hash("_myKey3xempl3_", "th3Me9aS3I")
Ca te retourne simplement un string que tu pourras envoyer à ton script .php pour qu'elle puisse vérifier que c'est bien ton application qui envoie le mail (C'est directement fait dans le script .php, mais si tu l'ouvres tu peux voir assez facilement où s'est fait).

Code : Tout sélectionner

form.AddField("key", GetMD5Hash("_myKey3xempl3_", "th3Me9aS3I"));
Une fois que tu as ajouté tous les paramètres tu envoi ton WWW juste en le créant.

Si tu ne comprends pas les choses, fait les dans l'ordre. Petit à petit tu vas construire ton architecture et progresser dans le raisonnement. Voir et comprendre ce qui ne va pas et apprendre ;)

Typiquement après, tu peux même récupérer le code de réponse de la page web. Ce qui te permet de savoir si cela a bien été envoyé ou pas. Et sinon quelle est l'erreur afin d'afficher un message à l'utilisateur. Mais je ne vais pas te gaver avec ça, si tu arrives à ce point là envoi moi un message et je te montrerais comment faire.

Flo_
Messages : 18
Inscription : 20 Avr 2017 08:43

Re: [MY-RS] Envoyer des email depuis une application

Message par Flo_ » 14 Août 2017 14:33

simonj a écrit :
14 Août 2017 14:22
Je ne veux pas insister mais honnêtement il n'y a rien d'insurmontable. Surtout que l'on es là pour t'aider.

Pour envoyer des paramètres depuis UNITY vers une adresse mail, tu dois créer un WWWForm (Formulaire WWW).

Code : Tout sélectionner

WWWForm form = new WWWForm();
Une fois que tu as crée ton formulaire. Tu peux lui ajouter des paramètres qui vont être ajouté dans l'URL de ta page. C'est juste un système de clef/valeur (En POST ou GET, ici c'est en POST mais tu peux modifier pour les envoyer en GET. Mais pas beaucoup d'intérêt dans notre cas).

Code : Tout sélectionner

form.AddField("address", "monadresse");

Code : Tout sélectionner

form.AddField("subject", "testtt");

Code : Tout sélectionner

form.AddField("message", "testest");
Et une fois que tu as ajouté tous tes paramètres, tu peux envoyer ce formulaire à une adresse grâce à la classe WWW. Tu lui donnes une URL à laquelle envoyer tout ton bazard, ton formulaire et il fait tout seul les choses.

Code : Tout sélectionner

WWW www = new WWW("http://monsite.fr/sendemailscript.php", form);
Ca c'est la base.

Après dans le script .php que je t'ai donné, tu as les même paramètres. Avec un nom que j'ai fixé dans le script. C'est juste un protocole pour que l'application et la page web puisse se comprendre mais c'est pas bien plus compliqué. A toi de mettre le bon nom des paramètres que tu veux envoyer (key, from, to, subject, body)

La seule chose un peu plus compliqué c'est créer un mot de passe crypté en MD5 (Méthode de cryptage) dans UNITY. Du coup voici une fonction de cryptage en MD5 que tu peux utiliser dans UNITY.

Code : Tout sélectionner

public static string GetMD5Hash(string a_input, string a_salt)
    {
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(a_input + a_salt);
        bs = x.ComputeHash(bs);
        System.Text.StringBuilder s = new System.Text.StringBuilder();
        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }
        return s.ToString();
    }
    
Désolé pour la mise en forme toute compressé, c'est moche et pas compréhensible. Mais le but c'est que tu puisses l'utiliser. Alors sache que pour l'utiliser, tu dois lui passer en paramètres ton mot de passe et un une chaîne de caractère que l'on appelle le "Sel" que l'on met en plein milieu du mot de passe pour complexifier le tout.

Code : Tout sélectionner

GetMD5Hash("_myKey3xempl3_", "th3Me9aS3I")
Ca te retourne simplement un string que tu pourras envoyer à ton script .php pour qu'elle puisse vérifier que c'est bien ton application qui envoie le mail (C'est directement fait dans le script .php, mais si tu l'ouvres tu peux voir assez facilement où s'est fait).

Code : Tout sélectionner

form.AddField("key", GetMD5Hash("_myKey3xempl3_", "th3Me9aS3I"));
Une fois que tu as ajouté tous les paramètres tu envoi ton WWW juste en le créant.

Si tu ne comprends pas les choses, fait les dans l'ordre. Petit à petit tu vas construire ton architecture et progresser dans le raisonnement. Voir et comprendre ce qui ne va pas et apprendre ;)

Typiquement après, tu peux même récupérer le code de réponse de la page web. Ce qui te permet de savoir si cela a bien été envoyé ou pas. Et sinon quelle est l'erreur afin d'afficher un message à l'utilisateur. Mais je ne vais pas te gaver avec ça, si tu arrives à ce point là envoi moi un message et je te montrerais comment faire.

Oua ! Merci du temps que tu m'accordes. Effectivement c'est plus clair comme ça pour moi :) mais j'aurais pas osé en demander tant ! Et bien je vais essayer de me pencher là dessus car tes explications semblent vraiment utiles. Je m'y met cette aprem je me permet de te tenir au courant par l'intermédiaire de ce post.

En tous cas merci beaucoup ! :)

Répondre

Revenir vers « (C#) CSharp »