Insérer une image dans le corp d'un email

Bonjour,

J’ai créé une ressource de type Image comme ci-dessous:

J’aimerais dans le code, pouvoir insérer une image dans le corps d’un email à l’intérieur de la balise HTML “img”, dans la propriété src : <img src="mon_url" />.

Je suis actuellement dans la capacité d’insérer du contenu à l’intérieur de la propriété src, mais je ne sais pas comment récupérer l’URL de ma ressource image.

Auriez-vous une idée ?

cf. Insérer une image dans une notification par email

Je suis déjà tombé sur ce topic, le problème c’est que la ligne de code suivante me retourne un id null (en remplaçant MY_IMAGE par HR_LOGO_SIPAREX) :
String id = mail.addImage(mail.getMail().resourceImage("MY_IMAGE", false));

Voici le code de l’action d’envoi de mail des infos du user (vous pouvez tester ça envoie un mail avec des images inlinées dans le corps de mail et des PJ):

Cela vous donnera un exemple plus complet:

Mail mail = new Mail(getGrant());
String from = null; // use default "mail.user" from mail service
String[] to = { email };
String[] cc = null;
String[] bcc = null;

ObjectField img = getField("usr_image_id");
boolean hasImg = !img.isEmpty();

ArrayList<Mail.MailAttach> attachs = new ArrayList<>();
Mail.MailAttach vcard = mail.objectAttach(this, "User-VCARD");
if (vcard != null)
	attachs.add(vcard);
Mail.MailAttach privacypolicy = mail.resourceAttach("PDF", "PRIVACYPOLICY");
if (privacypolicy != null)
	attachs.add(privacypolicy);
if (hasImg)
	attachs.add(mail.documentAttach(this, img));

ArrayList<Mail.MailImage> images = new ArrayList<>();
Mail.MailImage logo = mail.resourceImage(this, "LOGO", false);
if (logo != null)
	images.add(logo);
Mail.MailImage image = hasImg ? mail.documentImage(this, img) : null;
if (image != null)
	images.add(image);

String subject = getField("usr_first_name").getValue() + " " + getField("usr_last_name").getValue();

StringBuilder body = new StringBuilder();
if (logo != null)
	body.append(logo.getRefUrl() + "<hr/>");
body.append("<table border=\"0\"><tr><td>");
body.append("<p><strong>" + getField("usr_login").getValue() + "</strong>");
body.append("<br/>" + getField("usr_first_name").getValue() + " " + getField("usr_last_name").getValue() + "</p>");
if (image !=null)
	body.append("</td><td>" + image.getRefUrl(50));
body.append("</td></tr></table>");

body.append("<table border=\"0\"><tr><td>");
body.append("<p><i>" + getField("usr_address1").getValue());
body.append("<br/>" + getField("usr_address2").getValue());
body.append("<br/>" + getField("usr_zipcode").getValue());
body.append("<br/>" + getField("usr_city").getValue());
body.append("<br/>" + getField("usr_state").getValue());
body.append("<br/>" + getField("usr_country").getValue() + "</i></p>");
body.append("</td><td>");
body.append("<p>" + getField("usr_email").getValue());
body.append("<br/>" + getField("usr_work_num").getValue());
body.append("<br/>" + getField("usr_home_num").getValue());
body.append("<br/>" + getField("usr_cell_num").getValue() + "</p>");
body.append("</td></tr></table>");

if (!mail.sendWithAttach(to, from, cc, bcc, subject, body.toString(), Mail.MAIL_MIME_TYPE_HTML, null,
		attachs.toArray(new Mail.MailAttach[attachs.size()]),
		images.toArray(new Mail.MailImage[images.size()])))
	throw new PlatformException("Send email failed");

Le mail résultant (tel qu’affiché dans Gmail):

2 Likes

PS: s’agissant des ressources assurez vous que ce sont bien des ressources globales, i.e. associées à la Disposition default

En suivant votre exemple, il manquait un paramètre (non obligatoire) dans la méthode resourceImage(). Je l’ai rajouté, et je n’ai plus de valeur null. Cependant, avec la méthode getRefUrl() :
String img = mail.getMail().resourceImage(this, "HR_LOGO_SIPAREX", false).getRefUrl();

Voici ce que j’obtiens :
<img title="logo-SIPAREX-GROUPE-Q.png" alt="logo-SIPAREX-GROUPE-Q.png" src="cid:SSzb4DE4AKDaJrufhuZf">

Le problème, c’est que dans mon mail, l’image est en erreur 404, il ne la trouve pas.
image

Effectivement dans l’exemple User la ressource “LOGO” est une ressource de l’objet User, pas une ressource globale => d’où l’appel à la méthode resourceImage avec l’objet en argument = le this.

Si votre ressource est une resource globale il faut utiliser la méthode resourceImage sans argument objet ou autre.

L’argument ou l’absence d’argument de ces méthodes n’est pas “facultatif” => c’est ce qui indique quel type de ressource il s’agit.

Pour rappel il y a des ressources globales, d’objet métier, de processus métier ou d’objet externe (= composant spécifique)

PS: Attention aussi à bien paramétrer votre ressource en “Image” et pas en “Icône” sinon ce sont les méthodes resourceIcon qu’il faut utiliser. cf. Mail pour la javadoc complète de cette classe helper Mail

D’accord, je comprends mieux pourquoi il faut mettre le this dans cette situation.

Mais du coup, pourquoi, mon image ne s’affiche pas et pourquoi du coup j’ai une erreur 404 (avec ce que je vous ai mis dans le message du dessus) ? Parce que pour le moment mon mail ressemble à ça:

Pourtant j’obtiens bien ça :
<img title="logo-SIPAREX-GROUPE-Q.png" alt="logo-SIPAREX-GROUPE-Q.png" src="cid:SSzb4DE4AKDaJrufhuZf">

Cf. ma réponse précédente

Vous devez utiliser la bonne méthode pour le bon type de ressource =globale ou associée à votre objet.

Si c’est une ressource globale il ne faut pas ce this qui veut dire que vous cherchez une ressource d’objet et réciproquement.

Sans infos sur le paramétrage de votre ressource je ne peux pas plus vous aider.

PS: vérifiez dans le source SMTP de votre mail reçu que le pb d’affichage d’image n’est pas simplement le fait de votre client de messagerie. En effet, ceux -ci refusent systématiquement d’afficher les images contenus dans un email “douteux” or vu votre copie d’écran je pense que votre FROM est en @simplicite.io/fr => votre instance n’est pas autorisée sur ce domaine et du coup votre mail doit surement finir en spam ou dans le genre.

Je viens d’ajouter en pièce jointe l’image avant de l’afficher dans le corps du mail et ça marche:
image

Le problème, c’est que dans la balise HTML (<img />) la source (src) de l’image est un content-id (cid:) donc il faut impérativement que l’image soit en pièce jointe pour qu’elle soit affichée dans le corps du texte.
Du coup dans mon cas, je pense que ça règle mon problème, mais dans le futur peut-être que je voudrais afficher une image sans qu’elle soit en pièce jointe.

Auriez-vous une solution pour le futur ?

Dans le mail User que je vous ai indiqué le logo n’est pas en pièce jointe et il s’affiche bien dans le corps du mail (cf. la copie d’écran du mail dans le client Gmail).

Vous faites sans doute quelque chose de travers quelque part.

Comparez votre code avec le code que je vous ai fourni.

Pour insérer une image dans un email, dans Simplicité ou ailleurs… il faut obligatoirement le passer en attachement simple ou avec sa référence content-id :

  • Il est impossible de faire autrement car tous les clients de messagerie modernes filtrent les contenus inlinés dynamiquement de type : <img src="data:image/png...">

  • Il faut forcement utiliser un <img src="cid:..."> vers un attachment = attribué par les API (mail.addImage ou équivalent).

1 Like

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.