Aller au contenu

Envoyer un mail avec piece jointe


Kricek

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!

Lien vers le commentaire
Partager sur d’autres 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?

Lien vers le commentaire
Partager sur d’autres 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

Modifié par chpil
Lien vers le commentaire
Partager sur d’autres 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:

Modifié par Kricek
Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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??

Modifié par Kricek
Lien vers le commentaire
Partager sur d’autres sites

  • 2 months later...

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?

Lien vers le commentaire
Partager sur d’autres 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!

Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

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 !

Lien vers le commentaire
Partager sur d’autres sites

  • 4 years later...

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

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...