UTF-8-charset werkt niet met Javax.mail

Ik heb java mail api , voor het verzenden van e-mails. Ik gebruik een contactformulier om de invoer te verzenden, die naar een specifieke e-mail moet worden verzonden.

De e-mail wordt zonder problemen verstuurd, hoewel ik een Deense man ben, en ik heb daarom drie Deense karakters nodig die ‘æ’, ‘Ø’ en ‘Å’, in het onderwerp en de e-mailtekst is.

Ik heb daarom gezien dat ik UTF-8-tekencodering kan gebruiken om deze personages te verstrekken, maar wanneer mijn e-mail is verzonden, zie ik alleen enkele vreemde letters – ‘à ã’, ‘ø’ en ‘à ¥’ – in plaats van de Deense letters – ‘æ’, ‘Ø’ en ‘Å’.

Mijn methode om de e-mail te verzenden, ziet er als volgt uit:

public void sendEmail(String name, String fromEmail, String subject, String message) throws AddressException, MessagingException, UnsupportedEncodingException, SendFailedException
{
    //Set Mail properties
    Properties props = System.getProperties();
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.smtp.host", "smtp.gmail.com");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.port", "465");
    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("my_username", "my_password");
        }
    });
    //Create the email with variable input
    MimeMessage mimeMessage = new MimeMessage(session);
    mimeMessage.setHeader("Content-Type", "text/plain; charset=UTF-8");
    mimeMessage.setFrom(new InternetAddress(fromEmail, name));
    mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("my_email"));
    mimeMessage.setSubject(subject, "utf-8");
    mimeMessage.setContent(message, "text/plain");
    //Send the email
    Transport.send(mimeMessage);
}

Help me alsjeblieft te ontdekken hoe ik deze ‘fout’ kan corrigeren.


Antwoord 1, Autoriteit 100%

voor alle e-mails

Er zijn een paar systeemeigenschappen met betrekking tot mailing , kan dat waarschijnlijk uw code te vereenvoudigen. Ik heb het over deze specifieke eigenschap eigenlijk:. "mail.mime.charset"

mail.mime.charsetSysteem eigenschap kan worden gebruikt om de standaard te specificeren MIME charset om te gebruiken voor gecodeerde woorden en tekst onderdelen die niet anders een charset opgeven. Normaal gesproken wordt de standaard MIME charset afgeleid van de standaard Java karakterset, zoals gespecificeerd in het file.encodingSysteem eigendom. De meeste toepassingen zullen geen behoefte hebben om expliciet de standaard MIME charset. In gevallen waarin de standaard MIME karakterset moet worden gebruikt voor e-mail berichten is anders dan de karakterset gebruikt voor bestanden die zijn opgeslagen op het systeem, moet deze eigenschap set zijn.

Zoals je hierboven kunt lezen, standaard is er geen waarde voor de mail.mime.charseten de codering van een bestand (file.encodingwoning) wordt gebruikt.

Voor een specifieke e-mail

Echter, als je wilt naar een specifieke dat codeert voor een specifiek e-mailadres opgeeft, dan moet je waarschijnlijk gebruik maken van de 2 parameter setSubject(subject,charset)en setText(text,charset)methoden.

Als dat niet werkt, dan heeft u waarschijnlijk uw input is al beschadigd voordat het dit punt bereikt. Met andere woorden, u waarschijnlijk de verkeerde codering om uw gegevens te verzamelen .

Mime types ingewikkeld

De setContent(content, "UTF-8")(zoals andere bronnen beweringen) gewoon niet werken. Kijk enkel naar de handtekening van deze methode: setContent(Object content, String mimetype). MIME TYPE EN CHARSET zijn 2 totaal verschillende dingen. IMHO, je zou echt een van de setText(...)Methods met een CharSet-parameter moeten gebruiken.

Maar als u volhardt in het gebruik van een Mimetype om de CharSet in te stellen setContent(content,mimetype), gebruik vervolgens het juiste formaat. (Niet alleen "UTF-8", maar zoiets als "text/plain; charset=UTF-8"). Maar nog belangrijker, Houd er rekening mee dat elk MIME-type zijn eigen manier van hanteren van charsets heeft.

  • Zoals gespecificeerd in RFC-2046 De standaardcarySet voor text/plainis US-ASCII, maar kan worden overruled met een extra parameter van Charset.
  • Echter, in rfc-6657 maakt duidelijk dat de text/xmlTYPE Bepaalt de chareset met behulp van de inhoud van het bericht. De parameter Charset zal hier gewoon worden genegeerd.
  • en in rfc-2854 wordt vermeld dat text/htmlmoet echt altijd een chareset opgeven. Maar als u niet, dan gebruikt het ISO-8859-1(= Latin-1).

Antwoord 2, Autoriteit 52%

Misschien moet u ook u UTF-8 hier

mimeMessage.setContent(message, "text/plain; charset=UTF-8");

U moet naar http://www.coderanch.com/ T / 274480 / JAVA / JAVA / JAVAMAIL-SET-CONTECT-UTF


Antwoord 3, Autoriteit 8%

Na het doorbrengen van veel tijd op debugging, en het zoeken naar internet voor een aanwijzing, heb ik een oplossing voor mijn probleem gevonden.

Het lijkt erop dat wanneer ik gegevens via een webverzoek heb gestuurd, mijn aanvraag niet codeert met de tekens met UTF-8-codering. Dit betekende dat de gegevens die uit mijn contactformulier waren verzenden, dat æ, Ø en Å-karakters bevatte, niet correct konden worden behandeld door het karaktercodering.

De oplossing leek een -karaktercoderingsfilter in te stellen, in mijn implementatie-descriptor, die alle inkomende aanvraag van het web kan coderen om met het tekencodering UTF-8 te zijn.

private void registerCharacterEncodingFilter(ServletContext servletContext) {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceEncoding(true);
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}

Dit filter stelt de codering in op UTF-8 en forceert u de codering op alle verzoeken die bij de URL ‘/ *’.


Antwoord 4, Autoriteit 2%

Het is gemakkelijk,
Voer uw project uit met parameter -dfile.encodering = UTF-8
ex:
java -dfile.encodering = UTF-8 -JAR MYPROJECT.JAR

// fixeer een typo


Antwoord 5, Autoriteit 2%

Voordat u uw string naar de verzendmethode verzendt, moet u de tekenreeks converteren naar UTF-8

Als u een “aanvraag” -parameter ontvangt, kunt u “SetCharactacterenCodering” gebruiken:

request.setCharacterEncoding("utf-8");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
...
MimeMessage mineMessage = new MimeMessage(session);
        mineMessage.setFrom(new InternetAddress(myAccountEmail));
        mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
        mineMessage.setSubject(subject, "UTF-8");
        mineMessage.setContent(content, "text/plain;charset=UTF-8");

Converteer anders uw string naar UTF-8-formaat met de volgende methode:

String subject = new String(subject.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
String content = new String(content.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
...
MimeMessage mineMessage = new MimeMessage(session);
    mineMessage.setFrom(new InternetAddress(myAccountEmail));
    mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
    mineMessage.setSubject(subject, "UTF-8");
    mineMessage.setContent(content, "plain/plain;charset=UTF-8");

Dit is het resultaat in het Spaans.


Antwoord 6

Ik weet dat ik laat ben met deze vraag, maar ik had zojuist een soortgelijk probleem.

Het kan de moeite waard zijn om ook je broncodes te controleren! Ik gebruikte een testklasse, met een hardgecodeerd onderwerp/tekst met enkele speciale tekens, die steeds onleesbaar bleven bij het verzenden van de e-mail. Hoewel ik de tekenset UTF-8 had ingesteld waar van toepassing (mimeMessage.setSubject(subject, charset), mimeMessage.setContent(content, “text/plain; charset=UTF-8”)).

Toen merkte ik op dat de broncodering van deze klasse windows-1252 was. Voor zover ik weet, worden alle bronteksten geconverteerd naar UTF-8 wanneer een java-bestand wordt gecompileerd. Maar in dit geval, in de maven pom.xml voor dit project, ontbrak de eigenschap project.build.sourceEncoding – dus ik weet eigenlijk niet zeker welke codering maven gebruikte tijdens het compileren (standaard), aangezien er geen was gespecificeerd.

Het wijzigen van de broncodering was hier niet mogelijk, maar zodra ik de speciale tekens veranderde in Unicode-codeletters (bijv. “ü” in “\u00fc”), werkte alles prima.


Antwoord 7

mimeMessage.setContent(mail.getBody(), "text/html; charset=UTF-8");

misschien heb ik het mis, maar dit werkt voor mij. 🙂 elk ööö-, äää-, üüü-teken wordt correct weergegeven in mijn vooruitzichten.

screenshot van Outlook

Other episodes