utf 8 karakterset die niet werkt met javax mail

Ik heb gebruikt Javax Mail API voor het verzenden van e-mails. Ik ben via een contact formulier voor het verzenden van de input, die verstuurd worden naar een specifieke email.

De e-mail wordt verzonden zonder problemen, al ben ik een deense man, en ik ben dan ook in de behoefte van drie deense karakters die ‘æ’, ‘ø’ en ‘å’, het onderwerp en de e-mail tekst.

Daarom heb ik gezien dat ik gebruik kan maken van UTF-8-codering, voor het leveren van deze tekens, maar toen mijn mail stuur ik zie alleen een aantal vreemde letters – ‘㦒, ‘ã’ en ‘㥒 – in plaats van de deense letters – ‘æ’, ‘ø’ en ‘å’.

Mijn methode voor het verzenden van de e-mail is op zoek als dit

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);
}

Me helpen hoe kan ik dit corrigeren ‘fout’.

  • setText(message, "UTF"), dus zowel voor het onderwerp en de inhoud van de codering moet worden ingesteld.
  • Dat heb ik gedaan en het werkte niet. Maar ik krijg een foutmelding bij het verzenden van e-mail, bij het schrijven van alleen UTF als de codering zoals u voorstelt.
InformationsquelleAutor Rohwedder | 2013-02-23



4 Replies
  1. 72

    Voor alle e-mails

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

    De mail.mime.charset Systeem eigenschap kan worden gebruikt voor het opgeven van de standaard MIME-charset te gebruiken voor gecodeerde woorden en stukken tekst die niet anders geef een karakterset. Normaal gesproken is de standaard MIME-charset is afgeleid van de standaard Java-tekenset, zoals gespecificeerd in de file.encoding Systeem eigendom. De meeste toepassingen zal het niet nodig om expliciet de standaard MIME-karakterset. In gevallen waar de standaard MIME-charset worden gebruikt voor e-mail berichten is anders dan de tekenset die gebruikt wordt voor bestanden die zijn opgeslagen op het systeem, kan deze eigenschap moet worden ingesteld.

    Zoals je kunt lezen hierboven, er is standaard geen waarde voor de mail.mime.charset en de codering van het bestand (file.encoding eigendom) wordt gebruikt.

    Voor een specifieke e-mail

    Echter, als u wilt opgeven van een specifieke codering voor een specifieke e-mail, dan moet je waarschijnlijk gebruik maken van de 2 parameters setSubject(subject,charset) en setText(text,charset) methoden.

    Als dat niet werkt, dan is waarschijnlijk uw input is al beschadigd voordat dit punt bereikt. In andere woorden, je hebt waarschijnlijk de verkeerde codering om uw gegevens te verzamelen.

    Mime-typen zijn ingewikkeld

    De setContent(content, "UTF-8") (zoals andere bronnen beweren) zal gewoon niet werken. Kijk maar naar de ondertekening van deze methode: setContent(Object content, String mimetype). Mime-type en de charset zijn 2 totaal verschillende dingen. Imho, moet je echt met een van de setText(...) methoden met een charset parameter.

    Maar als je toch met behulp van een mime-type om de charset setContent(content,mimetype), gebruik dan de juiste indeling. (niet alleen "UTF-8", maar iets als "text/plain; charset=UTF-8"). Maar belangrijker nog, wees ervan bewust dat alle mime-type heeft zijn eigen manier van omgaan met tekensets.

    • Als bedoeld in RFC-2046 de standaard tekenset voor text/plain is US-ASCII, maar kan overruled met een extra charset parameter.
    • Echter, in RFC-6657 maakt duidelijk dat de text/xml type bepaalt de tekenset van het gebruik van de inhoud van het bericht. De charset parameter zal slechts worden hier genegeerd.
    • En in RFC-2854 is vermeld dat text/html moet echt altijd opgeven van een karakterset. Maar als je het niet doet, dan zal het gebruik ISO-8859-1 (=Latin-1).
  2. 7

    Na het doorbrengen van veel tijd aan het opsporen van fouten en het zoeken op het internet voor een idee, ik heb een oplossing gevonden voor mijn probleem.

    Het lijkt erop dat wanneer ik toegestuurd van gegevens via een webservice-aanvraag mijn applicatie niet bij het coderen van tekens met UTF-8-codering. Dit betekende dat de gegevens die stuur van mijn contact formulier, waarin zich æ, ø en å tekens, kon niet worden behandeld, juist door het karakter codering.

    De oplossing leek voor het instellen van een Karakter Codering Filter, in mijn Deployment Descriptor, die zou het coderen van alle inkomende verzoek van het web te worden met de tekenset UTF-8.

    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 UTF-8 en de werking van de codering op alle aanvragen komen bij de url ‘ /* ‘.

  3. 1

    Het is gemakkelijk,
    het uitvoeren van uw project met de parameter -Dfile.encoding=UTF-8
    ex:
    java -Dfile.encoding=UTF-8 -jar MyProject.jar

    //Corrigeer een typefout

    • Ik denk dat inbegrip van een filter is het makkelijker??
    • het filter kan oplossen het specifieke probleem. Maar het is niet het antwoord op uw eerste vraag. Uw vraag ging over het verzenden van e-mails, niet over omgaan met web-aanvragen.
    • Gelieve te bevestigen uw typo: -Dfile.ecoding=UTF-8 -> -Dfile.encoding=UTF-8

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *