4

I use following code to send an email using java spring. I can send a normal text message successfully using this code. But I added the part below this (/////////) in order to send a html email. After that the message is not sending. (You can see I have added //////////// to separate my code below. above that part is working fine)

public void sendUserRegisterEmail(String receiver, String receiverEmailAddress){
 MimeMessagePreparator preparator = new MimeMessagePreparator() {
 public void prepare(MimeMessage mimeMessage) throws Exception {
 MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
 message.setSubject(USER_REGISTER_MESSAGE_SUBJECT);
 message.setTo(receiverEmailAddress);
 message.setFrom(SENDER_EMAIL_ADDRESS);
 message.setText(String.format(USER_REGISTER_MESSAGE_BODY, receiver));
 //////////////////////////////////////////////////////////////////////
 Properties properties= getProperties();
 Session session = Session.getDefaultInstance(properties);
 MimeMessage msg = new MimeMessage(session);
 msg.setFrom(new InternetAddress(SENDER_EMAIL_ADDRESS, "Admin"));
 msg.addRecipient(Message.RecipientType.TO,
 new InternetAddress(receiverEmailAddress, "user"));
 msg.setSubject(USER_REGISTER_MESSAGE_SUBJECT,"UTF-8");
 Multipart mp = new MimeMultipart();
 MimeBodyPart htmlPart = new MimeBodyPart();
 htmlPart.setContent(message,"E:\\test.html");
 mp.addBodyPart(htmlPart);
 msg.setContent(mp);
 Transport.send(msg);
 }
 };
 sendEmail(preparator);
 }

This is my console after running the code. How ever I can't see any errors either. I use Itellij IDE and Jetty as the server.

DEBUG: JavaMail version 1.5.6
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map

Edit: I also followed this example and tried to send a html email. But I was unable to integrate that with my code.

This is my html file

<html>
this is s HTML text
</html>
asked Sep 4, 2017 at 8:37
6
  • Did you try another emails: different email providers? Commented Sep 4, 2017 at 8:56
  • No. This method was successful for normal text emails. Problem is with html emails only Commented Sep 4, 2017 at 8:58
  • Ok, can you simplify your HTML leaving just one simple tag like "p" with the text inside? Some providers block emails if they contain some not allowed tags or scripts, whatever. Commented Sep 4, 2017 at 9:00
  • I will put my html as an edit in the question Commented Sep 4, 2017 at 9:02
  • Your code is different from what I shared: try to pass second parameter as true: msg.setContent(mp, true); And also try the my variant. Hope it helps Commented Sep 4, 2017 at 9:49

2 Answers 2

4

Ok, try my snippets, they are working.

You can even put it all to one place without Spring IOC, f.e. into main() method and run.

Configuration (beans declaration)

 @Bean(name = "javaMailSender")
 public JavaMailSender javaMailSender(@Value("${mail.smtp.host}") String smtpHost,
 @Value("${mail.smtp.port}") int smtpPort,
 @Value("${mail.name}") String mailName,
 @Value("${mail.cred}") String mailCred) {
 Properties props = new Properties();
 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
 props.put("mail.smtp.auth", "true");
 JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
 javaMailSender.setHost(smtpHost);
 javaMailSender.setPort(smtpPort);
 javaMailSender.setUsername(mailName);
 javaMailSender.setPassword(mailCred);
 javaMailSender.setJavaMailProperties(props);
 return javaMailSender;
 }

Email service

import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
@Service("mailNotificationService")
public class MailNotificationService {
 @Value("${mail.name}")
 String mailFrom;
 @Resource
 private JavaMailSender javaMailSender;
 public void notify(String to, String subject, String message) {
 try {
 InternetAddress[] parsed;
 try {
 parsed = InternetAddress.parse(to);
 } catch (AddressException e) {
 throw new IllegalArgumentException("Not valid email: " + to, e);
 }
 MimeMessage mailMessage = javaMailSender.createMimeMessage();
 mailMessage.setSubject(subject, "UTF-8");
 MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true, "UTF-8");
 helper.setFrom(mailFrom);
 helper.setTo(parsed);
 helper.setText(message, true);
 javaMailSender.send(mailMessage);
 } catch (MessagingException ex) {
 throw new RuntimeException(ex);
 }
 }
}
answered Sep 4, 2017 at 9:23
0

You can try initialise your html file in String or StringBuffer variable assume htmContent and provide as first parameter in setContent type method.

htmlPart.setContent(htmContent.toString(), "text/html");

answered Sep 4, 2017 at 9:36

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.