Kricek

Envoyer un mail avec piece jointe

Recommended Posts

Coucou tout le monde!

J'ai besoin d'un ptit conseil car là, je sèche complètement. Je pense être bien avancé et qu'il me manque juste un petit truc mais je n'arrive pas à savoir quoi.

Voilà :

Depuis mon appli, je souhaite que l'utilisateur puisse envoyer un mail contenant un fichier généré dans l'appli.

Il s'agit d'une appli permettant (entre autres) de créer des devis sous forme de tableau.

Ensuite, l'appli génère un fichier html contenant un tableau HTML avec les données entrées.

Le fichier est bien créé. Pas de souci.

Ensuite, je souhaite que l'utilisateur puisse envoyer ce fichier HTML en pièce jointe d'un mail.

Voici un morceau de mon code:

Intent envoiMail= new Intent(Intent.ACTION_SEND);
envoiMail.setType("text/html");
envoiMail.putExtra(Intent.EXTRA_SUBJECT,"Envoi du prédevis en date du "+date);
envoiMail.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://"+fichierPredevisNouveau.getAbsolutePath()));
startActivity(envoiMail);

Note : mon fichier est généré dans le dossier "/data/data/package_appli/export/fichier.html".

Jusque là, pas de souci.

J'ai bien le chooser qui s'affiche, me proposant de choisir la manière d'envoyer le mail.

Je choisis Gmail, là, toujours pas de souci.

Le brouillon de mon mail s'affiche bien, avec la pièce jointe.

Et au moment où je l'envois, je vais dans la boite d'envoi et là, la pièce jointe a disparu.

Et lors de la réception du mail sur la boite destinataire, la pièce jointe n'y est plus...

Une idée? Un conseil?

Merci d'avance!

Share this post


Link to post
Share on other sites

As-tu généré ton fichier avec les droits nécessaires pour qu'il soit accessible par une autre application que la tienne ? (paramètre mode de openFileOutput)

Share this post


Link to post
Share on other sites

As-tu généré ton fichier avec les droits nécessaires pour qu'il soit accessible par une autre application que la tienne ? (paramètre mode de openFileOutput)

Euh... Nan... Lol... Je le fais au moment de mon "createNewFile"?

Share this post


Link to post
Share on other sites

Utilise plutôt Context.openFileOutput qui te permettra de positionner les droits d'accès sur le fichier

Edited by chpil

Share this post


Link to post
Share on other sites

Bon, je suis seulement en train d'essayer de bosser là dessus (Week end prolongé oblige... lol) et j'ai un ptit souci:

En fait, la méthode openFileOutput renvoit un Stream en écriture... Le souci, c'est que ce fichier, je le crée à la volée (avec un PrintWriter):

PrintWriter ecriture = new PrintWriter(new FileWriter(fichierPredevis,true));
ecriture.println("<html>");
ecriture.println("<center>Devis Réalisé le "+date+"<br><br>");
ecriture.println("<table border=\"2\" align=\"center\" width=\"60%\">");
ecriture.println("<tr>");
ecriture.println("<th width=\"10%\">TVA</th>");
ecriture.println("<th width=\"50%\" colspan=\"2\">Description du produit</th>");
ecriture.println("<th width=\"15%\">Prix unitaire HT</th>");
ecriture.println("<th width=\"10%\">Quantité</th>");
ecriture.println("<th width=\"15%\">Prix total HT</th>");
ArrayList<Contenu> liste = OutilsBase.getListeContenusFromProjet(new Projet(date, nom));
for (Contenu c : liste){
ecriture.println("<tr>");
ecriture.println("<td align=\"center\">"+c.getArticle().getTva()+"</td>");
ecriture.println("<td align=\"left\" width=\"40%\">"+c.getArticle().getDescription()+"</td>");
ecriture.println("<td align=\"center\" width=\"10%\">- "+c.getReduc()+" %</td>");
ecriture.println("<td align=\"center\">"+c.getArticle().getPrixUnitaireHT()+" €</td>");
ecriture.println("<td align=\"center\">"+c.getQuantite()+"</td>");
ecriture.println("<td align=\"right\">"+c.getprixTotalHT()+" €</td>");
ecriture.println("</tr>");
}
ecriture.println("<tr><td colspan=\"6\"><br></td></tr>");
ecriture.println("<tr>");
ecriture.println("<td></td><td></td>");
ecriture.println("<td colspan=\"2\" align=\"center\">Total sans Remise :<br>"+totaux.getPrixTotalHTSansRemise()+" € HT<br>"+totaux.getPrixTotalTTCSansRemise()+" € TTC<br>TVA: "+totaux.getTvaTotaleSansRemise()+" €</td>");
ecriture.println("<td colspan=\"2\" align=\"center\">Total avec Remise :<br>"+totaux.getPrixTotalHTAvecRemise()+" € HT<br>"+totaux.getPrixTotalTTCAvecRemise()+" € TTC<br>TVA: "+totaux.getTvaTotaleAvecRemise()+" €</td>");
ecriture.println("</tr>");
ecriture.println("</table>");
ecriture.println("</center>");
ecriture.println("</html>");
ecriture.close();

Comment passer d'un PrintWriter à un Stream en écriture?

Share this post


Link to post
Share on other sites

En utilisant le constructeur de PrintWriter qui prend en paramètre un OutputStream

OutputStream os = openFileOutput(...);
PrintWriter ecriture = new PrintWriter(os);

Ensuite, tu utilises ton PrintWriter de la même manière que précédemment

Edited by chpil

Share this post


Link to post
Share on other sites

P*tain, je suis trop bête! Je l'ai déjà fait en plus! :D

Je vais tester ca tout de suite... Merci encore chpil!

Edit : Bon, ca n'a rien changé, en apparence... Lors de la préparation de l'email, la pièce jointe apparait. Une fois le mail envoyé, dans les messages envoyés, elle n'y est plus. A la réception elle n'y est plus non plus...

Voici ce que j'ai fait de mon code:

fichierPredevisNouveau.createNewFile();
BufferedReader lecture = new BufferedReader(new FileReader(fichierPredevis));
OutputStream os = openFileOutput(fichierPredevisNouveau.getAbsolutePath(), MODE_WORLD_WRITEABLE);
PrintWriter ecriture = new PrintWriter(os);

Et le code pète à la ligne où j'instancie mon OutputStream:

02-15 11:36:19.394: WARN/System.err(16058): java.lang.IllegalArgumentException: File /data/data/com.monappli.predevis/export/Predevis_Dudule_nouveau.htm contains a path separator
02-15 11:36:19.406: WARN/System.err(16058):     at android.app.ContextImpl.makeFilename(ContextImpl.java:1761)
02-15 11:36:19.406: WARN/System.err(16058):     at android.app.ContextImpl.openFileOutput(ContextImpl.java:455)
02-15 11:36:19.410: WARN/System.err(16058):     at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158)
02-15 11:36:19.410: WARN/System.err(16058):     at com.monappli.predevis.ui.Predevis.generationTexteMail(Predevis.java:174)
02-15 11:36:19.410: WARN/System.err(16058):     at com.monappli.predevis.ui.Predevis$4.run(Predevis.java:137)
02-15 11:36:19.410: WARN/System.err(16058):     at java.lang.Thread.run(Thread.java:1096)

J'ai vu dans la doc, pour openFileOutput:

The name of the file to open; can not contain path separators.

Euh... Du coup, comment déclarer un nom de fichier, en String, sans préciser son arborescence? :rolleyes:

Edited by Kricek

Share this post


Link to post
Share on other sites

openFileOutput crée le fichier dans le répertoire retourné par getFileDir. Tu ne peux pas, visiblement, choisir le répertoire dans lequel ces fichiers seront générés. Mais, si tu veux rendre visibles ces fichiers par d'autres applications, tu n'as pas d'autres choix, à moins de générer tes fichiers sur la SD

PS: en utilisant openFileOutput, tu n'as plus besoin d'appeler createNewFile avant

Share this post


Link to post
Share on other sites

Merci encore chpil... Je teste de suite.

Edit : Même souci:

openFileOutput(getFilesDir()+"Predevis_"+nom+".htm", MODE_WORLD_WRITEABLE);

Résultat :

java.lang.IllegalArgumentException: File /data/data/Mon_Package/files/Predevis_TataYoyo.htm contains a path separator

Edit 2 :

J'ai modifié mes arguments en ne mettant que le nom du fichier (et le laisser faire pour le répertoire...)

openFileOutput("Predevis_"+nom+".htm", MODE_WORLD_WRITEABLE);

Et du coup, je regarde le log et, en épluchant un peu, je tombe sur cette ligne intéressante:

ERROR/Gmail(15213): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/Mon_Package/export/Predevis_TataYoyo.htm

Ce qui signifierait qu'il n'est possible d'envoyer QUE des pièces jointes provenant de la carte SD?

Je teste avec un mail classique...

Edit 3 :

Bon, pour info, cela SEMBLE fonctionner. Mais pas sur Gmail.

A chaque fois que je tente d'envoyer ma pièce jointe par Gmail, il me met une erreur et le fichier ne part pas.

Il semblerait que l'envoi de pièces jointes par Gmail ne soit possible que si la pièce jointe se trouve sur la carte SD.......

Du coup, question: Quid des gens qui n'ont pas de carte SD dans leur bouzin??

Edited by Kricek

Share this post


Link to post
Share on other sites

Bonjour,

Il semblerait que les applications soient dans un "bac à sable", cad qu'elles ne peuvent accéder qu'à leur petit espace réservé.

Ainsi, lorsque l'on sauvegarde un fichier, c'est uniquement dans son petit espace. Et par conséquent, l'application e-mail ne peut y accéder.

Visiblement, toutes les applis ont le droit d'accéder à la carte SD, c'est pour cela que ça fonctionne de sauver la pièce jointe sur la carte SD (quand il y en a une) et de l'envoyer par e-mail.

Du coup, la question est: il y a t il un répertoire interne (pas sur la sd) commun accessible à toutes les applis?

Share this post


Link to post
Share on other sites

J'ai finalement trouvé!

Il faut mettre

	    fOut = openFileOutput(fileName, MODE_WORLD_READABLE);
    fOut.write(texte.getBytes());
    fOut.close(); 

Puis au moment de l'envoi:

	    sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+getFilesDir()+"/"+fileName));

Et ça marche super!

Share this post


Link to post
Share on other sites

J'ai le même problème que toi !

En fait ta solution fonctionne avec l'émulateur mais quand je test avec mon samsung galaxy teos j'ai le ùêùe soucis à savoir que le fichier joint est présent quand j'envoi le mmail mais à la réception je ne l'ai pas !

Je me permet donc de remonter ce sujet pour demande de l'aide !

Merci d'avance !

Share this post


Link to post
Share on other sites

Bonjour,

 

Ce sujet est ancien mais je rencontre également le même problème sur un galaxy note 4 et non sur les autres téléphones. 

 

J'utilise cette fonction : startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_STREAM,shareUri).setType("image/png").putExtra("sms_body", Msg), ""));

 

et j'ai essayé d'initialiser sharUri avec plusieurs méthodes : Uri.parse comme cité ci-dessus, méthode avec MediaStore

mais j'obtient toutjous le message : "impossible de joindre le fichier".

 

Avez-vous une idée?

 

merci

Share this post


Link to post
Share on other sites

Salut, 

 

1- est-ce que le fichier est présent sur le téléphone?

2- si oui, dans quel dossier (chemin complet)?

3- qu'as-tu mis dans "shareUri"? 

 

Et sinon, joli coup de godet  :P  ^_^

pelleteuse_mont_blanc.jpg

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.