使用Java在Email Body中发送图像

我已经能够使用Java将图像作为附件发送到电子邮件中。 我现在正试图在电子邮件正文中发送相同的图像,如下所示:

public static void main(String[] args) throws NoSuchProviderException, MessagingException { System.out.println("Sending mail..."); Properties props = new Properties(); props.setProperty("mail.smtp.starttls.enable", "true"); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.host", "smtp.gmail.com"); props.setProperty("mail.smtp.port", "587"); props.setProperty("mail.smtp.user", "mysusername"); props.setProperty("mail.smtp.password", "mypassword"); Session mailSession = Session.getDefaultInstance(props, null); mailSession.setDebug(true); Transport transport = mailSession.getTransport(); MimeMessage message = new MimeMessage(mailSession); message.setSubject("HTML mail with images"); message.setFrom(new InternetAddress("myaddress@gmail.com")); message.setContent ("

This is a test

" + "", "text/html"); message.addRecipient(Message.RecipientType.TO, new InternetAddress("receiver@simbatech.biz")); transport.connect();//This is line 46 transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); transport.close(); }

我得到这个输出:

 Sending mail... DEBUG: setDebug: JavaMail version 1.4ea DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true Exception in thread "main" javax.mail.AuthenticationFailedException at javax.mail.Service.connect(Service.java:306) at javax.mail.Service.connect(Service.java:156) at javax.mail.Service.connect(Service.java:105) at image.in.body.ImageInBody.main(ImageInBody.java:46) Java Result: 1 

当我使用正确的用户名和密码设置为我的Gmail帐户时,为什么身份validation失败?

您需要声明这样的图像:

  

将图像加载为MimeBodyPart,并将unique-name-or-id与MimeBodyPart的FileName相匹配。

看下面的代码可能会使用完整

 class SimpleMail2 { public static void main(String[] args) throws Exception{ System.out.println("Sending mail..."); Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); Session mailSession = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("sender@gmail.com","password"); } }); Message message = new MimeMessage(mailSession); message.setFrom(new InternetAddress("sender@gmail.com")); message.setSubject("HTML mail with images"); message.setRecipient(Message.RecipientType.TO, new InternetAddress("receiver@gmail.com")); message.setText("Dear Mail Crawler," + "\n\n No spam to my email, please!"); MimeMultipart multipart = new MimeMultipart("related"); BodyPart messageBodyPart = new MimeBodyPart(); String htmlText = "

Raghava chary

" + ""; messageBodyPart.setContent(htmlText, "text/html"); multipart.addBodyPart(messageBodyPart); try { messageBodyPart = new MimeBodyPart(); InputStream imageStream = SimpleMail2.class.getClass().getResourceAsStream("/ab/log.gif"); DataSource fds = new ByteArrayDataSource(IOUtils.toByteArray(imageStream), "image/gif"); messageBodyPart.setDataHandler(new DataHandler(fds)); messageBodyPart.setHeader("Content-ID",""); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); Transport.send(message); System.out.println("Done"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

并添加org.apache.commons.io.jar.zip和axiom-api-1.2.6.jar并添加mail.jar和activation.jar

创建一个内容处理内联的多部分正文,并在base64中对您的图像进行编码。

检查此SO以获取一些详细信息(在Python中) 发送包含嵌入图像的Multipart html电子邮件

首先,请参阅此常见错误的 JavaMail FAQ条目。

然后,请参阅此JavaMail FAQ条目以及用于连接到Gmail的示例代码 。

请注意,没有“mail.smtp.password”属性。 由于您没有提供密码,因此身份validation失败。

另一个常见的错误(今天就是我):图像的Content-ID标题必须在<尖括号>中。 如果不这样做会破坏一些邮件程序(gmail,OS X 10.10)而不会破坏其他邮件程序(Outlook,iOS <= 8.1)。