繁体   English   中英

JAVA在发送带有嵌入式图像的HTML格式的电子邮件时出现问题

[英]JAVA Problems sending email in HTML format with embedded image

大家好,我花了两个小时来解决这个问题。

我有一个发送邮件的Java类,并且正文为HTML格式

这里那个方法

private void sendMail() {


      String body                      = "<html><body><p>Mr.<b>Jack Frusciante</b><br/>Work : <b>Programmer</b><br/><img alt=\"Firm\" src=\"data:image/png;base64,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\"/><br/><p>Lorem ipsum</p></p></body></html>";

        SendMail sendMail = new SendMail("jack@gmail.com","othermail@gmail.com","subject","");
        sendMail.setCC("othermailcc@gmail.com");
        sendMail.setBody(body);
        sendMail.send();

    }

这里是SendMail类

package com.jack.util;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.internet.PreencodedMimeBodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.PasswordAuthentication;


import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.kernel.mail.SMTPAccount;
import com.liferay.util.mail.MailEngine;
import com.sun.mail.smtp.SMTPMessage;

public class SendMail {

    private String from;
    private String subject;
    private String body;        
    private String to;
    private String cc;
    private String cid;
    private String smtpHost;
    private String smtpPort;
    private Boolean authenticationRequired;
    private String authenticationUsername;
    private String authenticationPassword;




    public SendMail(String from,String to,String subject,String body) {
        super();
        this.to = to;
        this.from = from;
        this.subject = subject;
        this.body = body;

    }






    public String getSmtpHost() {
        return smtpHost;
    }





    public void setSmtpHost(String smtpHost) {
        this.smtpHost = smtpHost;
    }





    public String getSmtpPort() {
        return smtpPort;
    }





    public void setSmtpPort(String smtpPort) {
        this.smtpPort = smtpPort;
    }





    public Boolean getAuthenticationRequired() {
        return authenticationRequired;
    }





    public void setAuthenticationRequired(Boolean authenticationRequired) {
        this.authenticationRequired = authenticationRequired;
    }





    public String getAuthenticationUsername() {
        return authenticationUsername;
    }





    public void setAuthenticationUsername(String authenticationUsername) {
        this.authenticationUsername = authenticationUsername;
    }





    public String getAuthenticationPassword() {
        return authenticationPassword;
    }





    public void setAuthenticationPassword(String authenticationPassword) {
        this.authenticationPassword = authenticationPassword;
    }





    public void setCC(String cc) {
        this.cc=cc;
    }








    public String getBody() {
        return body;
    }


    public void setBody(String body) {
        this.body = body;
    }


    public void send() {

        new Thread( new Runnable() {

            @Override
            public synchronized void run() {

                performSend();
            }

        }).start();

    }

    private void performSend() {

        try {
            Session session = getSession();

             SMTPMessage transport = new SMTPMessage(session);
            InternetAddress iaFrom = new InternetAddress(from, from);
            InternetAddress iaTo   = new InternetAddress(to,to);
            InternetAddress iaCC   = (cc!=null) ?  new InternetAddress(cc,cc) : null;
            MimeMultipart mailMessage = new MimeMultipart("related");
            BodyPart bp = new MimeBodyPart();
            bp.setContent(body,"text/html");
            mailMessage.addBodyPart(bp);
            transport.setContent(mailMessage);
            transport.setFrom(iaFrom);
            if(iaCC!=null) {
                transport.setRecipient(RecipientType.CC,  iaCC);
            }

            transport.setSubject(subject);
            InternetAddress[] recipients = { iaTo };
            Transport.send(transport, recipients);
            System.out.println("Sent message successfully....");

     } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
     } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }


     private Session getSession() {
            Properties mailProps = new Properties();
            mailProps.put("mail.transport.protocol", "smtp");
            mailProps.put("mail.smtp.host", "smtp.gmail.com");
            mailProps.put("mail.smtp.socketFactory.port", "465");
            mailProps.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
            mailProps.put("mail.smtp.auth",  "true" );
            mailProps.put("mail.smtp.port","465");
                return  Session.getInstance(mailProps,
                        new javax.mail.Authenticator() {
                            protected PasswordAuthentication getPasswordAuthentication() {
                                return new PasswordAuthentication("jack","jackpassword");
                            }
                        }); 

     }




}

邮件到达了,但是html的图片从未显示。 我注意到,检查了消息源,img标签就是这样改变的

<img alt=3D"Firm" src=3D"data:image/png;base64,iVBORw0KGgoAAAA=
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
MgUvIvKzHAAAAAElFTkSuQmCC"/>

身体部位从

Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

有人有解决此问题的想法吗?

提前致谢

我认为存在类似于“两次编码”的问题...或类似问题。

您应该尝试在发送过程的步骤中了解正文消息是如何转换的。

如果图像位于您的文档库中并且可以通过公共途径访问,那么一种明智的选择是在电子邮件正文中提供URL而不是完整图像内容...这可以帮助您避免与SMTP协议和邮件服务器加载。

或者,建议您将图像保存在图像服务器中,并将其引用包含在消息正文中。 当然,只要您所使用的特定服务器中提供了映像,该解决方案就可以使用。

作为示例,我将您的图像上传到Imgur服务器,这是从Java发送邮件的更简单版本:

package stack;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMail{

    public static void main(String emailAddress){


        String host = "smtp.gmail.com";
        String from = "yourMail@gmail.com";
        String subject = "Testing java mail";       
        String contentBody = "<html>\n" + "<body>\n"
                + "<p>Mr.<b>Jack Frusciante</b>\n"
                + "<br/>Work : <b>Programmer</b><br/>\n"
                + "<img src =\"http://imgur.com/81h91BL.png\"/>\n" + "<br/>\n"
                + "<p>Lorem ipsum</p></p>\n" + "</body>\n" + "</html>";                 



        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password", "");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");


        try{
            Session session = Session.getDefaultInstance(props, null);
            InternetAddress to_address = new InternetAddress(emailAddress.toLowerCase());


            MimeMessage message = new MimeMessage(session);     
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, to_address);
            message.setSubject(subject);                    
            message.setContent(contentBody, "text/html; charset=UTF-8");



            Transport transport = session.getTransport("smtp");
            transport.connect("smtp.gmail.com", "yourMail@gmail.com", "yourPassword");
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();

            System.out.println("This notification was sent to : " + emailAddress +"");
            }

            catch (MessagingException mex) {
            System.out.println("send failed, exception: " + mex);
            }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM