我使用 java mail 从我的方法发送了一封带有 html 的电子邮件,但只有在 gmail 中它才到达并且没有一些样式,它是什么?

I send an email with html from my method with java mail and only in gmail it arrives broken and without some styles, what is it?

提问人:octtag 提问时间:11/14/2023 最后编辑:Mark Rotteveelocttag 更新时间:11/15/2023 访问量:27

问:

这是我的主要方法,第二个是我调用它的地方。我的 html 格式似乎是正确的,样式是内联的,当我将其发送给 Outlook 用户或当我手动将 html 放入以下 div 内的 gmail 中时,这就有效了:

<div id=":vn" class="Am Al editable LW-avf tS-tW" hidefocus="true" aria-label="Message Body" g_editable="true" role="textbox" aria-multiline="true" contenteditable="true" tabindex="1" style="direction: ltr; min-height: 266px;" spellcheck="false" aria-owns=":y1" aria-controls=":y1" aria-expanded="false"></div>    

主要方法:

public void enviarEmail(String destinatario, String asunto, String contenidoHtml, String contentType) throws MessagingException {
    // Configuración de las propiedades
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.hostinger.com");
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.starttls.required", "true");

    // Crear una nueva sesión con autenticación
    Session session = Session.getInstance(props, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    });

    // Crear el mensaje
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress(username));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destinatario));
    message.setSubject(asunto);
    // Especificar UTF-8 en el contenido
    message.setContent(contenidoHtml, contentType);

    // Enviar el mensaje
    Transport.send(message);
}

然后我用这个方法调用它:

public void enviarTicketsPorEmail(String correoDestinatario, Carrito carrito) throws MessagingException {
    StringBuilder cuerpoEmail = new StringBuilder();

    // .newsletter-recibo-de-tickets
    cuerpoEmail.append("<!DOCTYPE html>")
            .append("<html>")
            .append("<head>")
            .append("<meta charset=\"UTF-8\">")
            .append("<meta http-equiv=\"X-UA-Compatible\" content=\"text/html; IE=edge\">")
            .append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">")
            .append("<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;900&display=swap\" />")
            .append("</head>")

            //body
            .append("<div style=\"margin:0;line-height:normal; display:flex; flex-direction: column; width:100%;justify-content: center;align-items: center;align-content: center;flex-wrap: nowrap;\">")

            .append("<div style=\"width: 100%;\">")
            .append("<img src=\"https://simplepassbucket.s3.sa-east-1.amazonaws.com/img/newsletters/parteInicialCompraExitosa.png\" style=\"width: 100%;\">")
            .append("</div>")
            .append("<div style=\"line-height:130%;display:inline-block;font-size:14px;margin:10px 0\">")
                    .append("<span style:'font-size: 14px'>Código de compra: <span style=\"font-weight:600; font-size: 14px\" id=\"m_-4881203300558445123codigoCompra\">")
            .append(carrito.getPago().getPagoId())
            .append("</span>")
            .append("</span>")
            .append("</div>")

       
//THE REST OF THE CODE WAS REMOVED SO IT IS NOT SO LONG


            .append("</div>")
            .append("</html>");
    // Usar la función de envío de correo para enviar el correo con el cuerpo construido y el tipo de contenido correcto
    mailSender.enviarEmail(correoDestinatario, "Tus tickets :)", cuerpoEmail.toString(), "text/html; charset=UTF-8");
}

我已经在那里解释过了,但是是的,基本上我需要一个 java 邮件中的方法示例,该方法能够自动向 gmail 用户发送 html,而不会破坏或变形。

java html spring-boot , gmail jakarta-mail

评论

1赞 Mark Rotteveel 11/14/2023
大多数电子邮件客户端不加载外部样式表。事实上,许多电子邮件客户端通常需要对 HTML 元素本身进行相当多的样式设置,甚至忽略内联样式表。创建可用的 HTML 电子邮件本身就是一门手艺,您不能使用用于“普通”HTML 页面的所有技巧。
0赞 M. Deinum 11/14/2023
在发送 HTML 电子邮件时,所有内容都必须内联,因此,如果您想使用自定义样式表,它必须是要发送的 HTML 的一部分,而不是将要加载的某个远程资源(图像是rule_的一般例外。所以我怀疑你的字体被加载了,这可能就是它(部分)格式错误的原因。

答:

0赞 octtag 11/15/2023 #1

我使用的是 display: flex;Gmail 不支持此功能。我通过实现表结构解决了它。