J'utilise les Spring samples pour envoyer des images en ligne. Cela fonctionne, mais Gmail affiche également les images en pièces jointes. Comment l'éviter?
Le code est assez simple.
public class Email {
public static MimeMessagePreparator getContentAsInlineResourceMessagePreparator(final String to) {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
helper.setSubject("Email with inline image");
helper.setFrom("[email protected]");
helper.setTo(to);
String content = "Dear pedrofb...";
helper.setText("<html><body><p>" + content + "</p><img src='cid:company-logo'></body></html>", true);
helper.addInline("company-logo", new ClassPathResource("logo.png"));
}
};
return preparator;
}
public final static void main (String argv[]){
//Basic SMTP configuration
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(Host);
mailSender.setPort(port);
MimeMessagePreparator preparator = getContentAsInlineResourceMessagePreparator("[email protected]");
mailSender.send(preparator);
}
}
Ma question est similaire à Comment arrêter les images incorporées dans les e-mails qui sont affichées en tant que pièces jointes par GMail? mais la réponse est très ancienne et ne montre pas comment configurer correctement le ressort. Je ne veux pas construire le message parties & en-têtes moi-même
Posté le message brut dans Pastebin
Le problème est lié à la détermination MimeType
L'extension png
est traitée en tant que image/x-png
au lieu de image/png
, ce qui cause le problème avec Gmail. Ceci a été corrigé/modifié dans 5.X
et peut également être dans une version ultérieure de 4.X
également (je ne suis pas sûr de ceux-là). Mais la solution est assez facile. Changement
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
à
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8") {
@Override
public void addInline(String contentId, Resource resource) throws MessagingException {
Assert.notNull(resource, "Resource must not be null");
String contentType = this.getFileTypeMap().getContentType(resource.getFilename());
contentType = contentType.replace("x-png", "png");
this.addInline(contentId, resource, contentType);
}
};
Et cela remplacera la MimeType
en image/png
J'ai exécuté votre code. Cela fonctionne parfaitement: j'ouvre l'email résultant dans gmail, je vois l'image en ligne et je ne vois aucune pièce jointe! J'ai utilisé le 5.0.5.LELEASE.
Si ce n'est pas la solution, je suppose que vous pouvez avoir une propriété inhabituelle dans votre SmtpServer.toJavaMailSender () ou dans vos paramètres Gmail.