webentwicklung-frage-antwort-db.com.de

Wie setze ich MimeBodyPart Content Type auf "text / html"?

Das folgende Programm zeigt einen unerwarteten Rückgabewert für den mehrteiligen HTML-Mime-Typ. Warum gibt dieses Programm "text/plain" und nicht "text/html" aus?

public class Main {
  public static void main(String[] args) throws javax.mail.MessagingException, Java.io.IOException {
    javax.mail.internet.MimeBodyPart mime_body_part = new javax.mail.internet.MimeBodyPart();
    mime_body_part.setContent("<h1>foo</h1>", "text/html");
    System.out.println(mime_body_part.getContentType());
  }
}

Ich habe zahlreiche alternative Möglichkeiten ausprobiert, einschließlich des Festlegens einer ByteArrayDataSource, die in einen DataHandler eingebunden ist, jedoch ohne Erfolg. Das gleiche passiert, wenn ich dies mit einer MimeMessage anstelle eines MimeBodyPart versuche.

So kompilieren Sie Linux und führen es aus:

javac -classpath .:activation.jar:mail.jar Main.Java
java -classpath .:activation.jar:mail.jar Main
32
necromancer

Rufen Sie in der beigefügten Nachricht MimeMessage.saveChanges() auf, um die Header zu aktualisieren, indem Sie die MIME-Struktur in einen Aufruf von MimeBodyPart.updateHeaders() an Ihrem Körperteil kaskadieren. Es ist dieser updateHeaders -Aufruf, der den Inhaltstyp vom DataHandler zum MIME-Header Content-Type Des Teils überträgt.

Wenn Sie den Inhalt eines MimeBodyPart festlegen, erstellt JavaMail intern (und nicht offensichtlich) ein DataHandler -Objekt, das das übergebene Objekt umschließt. Der Content-Type - Header des Teils lautet nicht sofort aktualisiert.

Es gibt keine einfache Möglichkeit, dies in Ihrem Testprogramm zu tun, da Sie nicht über ein MimeMessage und ein MimeBodyPart.updateHeaders() verfügen, das nicht public ist.


Hier ist ein Arbeitsbeispiel, das erwartete und unerwartete Ausgaben beleuchtet:

public class MailTest {

  public static void main( String[] args ) throws Exception {
    Session mailSession = Session.getInstance( new Properties() );
    Transport transport = mailSession.getTransport();

    String text = "Hello, World";
    String html = "<h1>" + text + "</h1>";

    MimeMessage message = new MimeMessage( mailSession );
    Multipart multipart = new MimeMultipart( "alternative" );

    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText( text, "utf-8" );

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent( html, "text/html; charset=utf-8" );

    multipart.addBodyPart( textPart );
    multipart.addBodyPart( htmlPart );
    message.setContent( multipart );

    // Unexpected output.
    System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
    System.out.println( "HTML Content Type: " + htmlPart.getContentType() );

    // Required magic (violates principle of least astonishment).
    message.saveChanges();

    // Output now correct.    
    System.out.println( "TEXT = text/plain: " + textPart.isMimeType( "text/plain" ) );
    System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
    System.out.println( "HTML Content Type: " + htmlPart.getContentType() );
    System.out.println( "HTML Data Handler: " + htmlPart.getDataHandler().getContentType() );
  }
}
50
dkarp

Ich weiß nicht warum (die Methode ist nicht dokumentiert), aber im Quellcode sollte diese Zeile dies tun:

mime_body_part.setHeader("Content-Type", "text/html");
23
JB Nizet

Versuchen Sie es mit diesem:

msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");
6
mesrar

Was ist mit:

mime_body_part.setHeader("Content-Type", "text/html");

In der Dokumentation von getContentType steht, dass der zurückgegebene Wert mit getHeader (name) gefunden wird. Wenn Sie also den Header mit setHeader setzen, sollte alles in Ordnung sein.

4
foens

Es gibt eine Methode setText(), die drei Argumente akzeptiert:

public void setText(String text, String charset, String subtype)
    throws MessagingException

Parameter:

text - the text content to set
charset - the charset to use for the text
subtype - the MIME subtype to use (e.g., "html")

HINWEIS: Der Untertyp akzeptiert Text nach/in MIME-Typen, z. B.

  • text/html wäre html
  • text/CSS wäre CSS
  • und so weiter..
3
Ravi Naik

Für mich setze ich zwei mal:

(MimeBodyPart)messageBodyPart.setContent(content, text/html)
(Multipart)multipart.addBodyPart(messageBodyPart)
(MimeMessage)msg.setContent(multipart, text/html)

und es hat gut funktioniert.

1
lwpro2

Mit "<h1>STRING<h1>".getBytes(); können Sie ein ByteArrayDataSource mit dem Inhaltstyp erstellen und setDataHandler in Ihrem MimeBodyPart festlegen.

versuchen:

String html "Test JavaMail API example. <br><br> Regards, <br>Ivonei Jr"
byte[] bytes = html.getBytes(); 
DataSource dataSourceHtml= new ByteArrayDataSource(bytes, "text/html");
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDataHandler(new DataHandler(dataSourceHtml));

MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(bodyPart);
1
ivoneijr