16. september 2001 - 16:17Der er
25 kommentarer og 1 løsning
problemer med JvaMail, e-mail til SMS..mærkelige tegn...V & =
Når jeg prøver at sende en SMS ved hjælp af JavaMail gennem en mail Gateway får jeg følgende mærkelige problem: Efter adressen hvor beskeden bliver sendt fra kommer der et \"V\" ind i beskeden. Ca. midtvejs, eller 2/3 inde i beskeden bliver der sat et \"=\" tegn ind.
Nogle der kan hjælpe mig af med dette mærkelige problem.??? Kildekoden er herunder. På forhånd tak.
String host = \"mailhosten\"; //eks.vip.cybercity.dk String from = \"emailadresen der bliver sendt fra\"; String til = \"mobilnummer@sms.tdm.dk\"; //sms.tdm.dk hvis det er teleDK eller nogle som benytter deres net String subj = \"overskrift i beskeden\"; String body = \"Dette er body teksten i beskeden\";
MimeMultipart mp = new MimeMultipart();
MimeBodyPart body2 = new MimeBodyPart(); body2.setDescription(\"\",\"iso-8859-5\"); body2.setContent(body,\"text/plain\"); mp.addBodyPart(body2);
// Get system properties Properties props = System.getProperties();
// Setup mail server props.put(\"mail.smtp.host\", host);
Session session = Session.getInstance(props);
// Define message MimeMessage message = new MimeMessage(session); message.setContent(mp);
// Set the from address message.setFrom(new InternetAddress(from));
// Set the to address message.addRecipient(Message.RecipientType.TO, new InternetAddress(til));
Transport.send(message); System.out.println(\"Mailen er sendt til: \"+til); } }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Jeg har selv anvendt javamail 1.1.3, men er nok på vej til 1.2, og har da opdaget en række ændringer med dem. Det jeg dog ikke har set endnu, er at den datastrøm, som leveres ikke er korrekt.
Du skriver selv, at problemet opstår når du bruger en sms mail gateway. Har du prøvet at sende den til en almindelig mailbox og kontrollere indholdet der.
Iøvrigt skal du huske på at du selv skal konvertere dine karakterer til den angivne content-transfer-encoding, hvilket hvis du ikke angiver er us-ascii. Jeg kan godt nok ikke se nogle problemer nu, men de dukker nok op på et tidspunkt. Husk på at mails bliver sendt via forskellige Mail Transfer Agents (MTA), og de skal ifølge standard kun kunne behandle 7-bit data.
PS. hvilket tegnsæt er 8859-5 (Eller, hvorfor ikke 8859-1, Latin-1);
Prøv at afslutte din mail med at dumpe den til en fil.
MimeMessage har en metode, writeTo, der skriver til en OutputStream.
Det giver et korrekt RFC822 mail. Deri er der formodentlig ingen fejl.
Derefter prøv med telnet til din \"mailhost\" port 25 og prøv at fodre brevet til den manuelt.
Serveren starter linier med et nummer, og derefter en tekst. Når det har skrevet et nummer, skal du skrive...: C:>telnet mailhost 25 220 mailserver.org HELO mydomain.dk 250 Nice to meet you MAIL FROM: tms@mydomain.dk 250 Sender ok RCPT TO:1234@sms.tdm.dk 250 Recipient ok DATA 354 Enter data, end with \".\" on a line by itself <Paste here> . 250 Message accepted QUIT 221 Closing connection
ok. Når jeg sender en med telnet som du beskriver ser alt perfekt ud!
Jeg kan godt sende beskeden med message.setText(body) som du skriver og så er de problemer jeg skriver øverst også løst, men så kan jeg ikke få den til at vise æøå. De bliver erstattet med ??? - tegn. (igen ser en almindelig e-mail normal ud!). ?
Jeg prøver lige at dumpe den til en outstream nu hvis jeg kan få den til det.
Hvor i alverden kører din javaklasse henne? Er det en bean i noget jsp eller lignende?? Bruger du et IDE, hvor du afvikler programmet indefra?
Jeg kørte det her i en simpel main metode: String host = \"mailhosten\"; //eks.vip.cybercity.dk String from = \"nbn@logical.dk\"; String til = \"mobilnummer@sms.tdm.dk\"; String subj = \"overskrift i beskeden\"; String body = \"Dette er body teksten i (æøå) beskeden\"; Properties props = System.getProperties(); props.put(\"mail.smtp.host\", host); Session session = Session.getInstance(props, null); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(til)); message.setSubject(subj); message.setText(body); message.saveChanges(); message.writeTo(System.out);
Som du kan se, anvender du charset cp1252, dvs. Window1 det er også (næsten) Latin-1. Det kan ændres ved at sige message.setText(body, \"iso-8859-1\");
Det interessante er, at din encoding er quoted-printable. Mail sendes jo via 1 eller flere servere (Mail Transfer Agents, MTA) og disse skal kun i følge protokollen kunne sende US-ASCII (Så virker det også med relay på diverse hosts etc), og derfor er din tekst lavet om under transmissionen til quoted-printable som er lidt ligesom URL-encoding, dvs. alle ikke US-ASCII karakterer bliver til = plus en hexværdi (=<cr> betyder at der ikke er noget linieskift her). Det lader ikke til at den gateway det går igennem kan forstå quoted-printable og tager content som US-ASCII (Det skal lige kontrolleres gennem telnet).
Det vi så skal have fundet ud af er, hvilken form for transfer-encoding, der kan bruges ud til sms. Hvis du kan sende sms til email, kan du jo evt. sende en besked med æøå til denne adresse: mos@logical.dk med subj: sms (Små bogstaver), så kan jeg lige kigge på den transfer-encoding som kommer derfra.
Alternativt kan du jo i mellemtiden bruge denne fantastiske funktion til at lave avanceret charset om til US-ASCII: public static String parseText(String s) { StringBuffer buf = new StringBuffer(s); for (int i = 0 ; i < buf.length() ; i++) { char ch = buf.charAt(i); if (((int) ch) >127) { switch(ch) { case \'æ\' : buf.replace(i, i+1, \"ae\"); break; case \'ø\' : buf.replace(i, i+1, \"oe\"); break; case \'å\' : buf.replace(i, i+1, \"aa\"); break; case \'Æ\' : buf.replace(i, i+1, \"AE\"); break; case \'Ø\' : buf.replace(i, i+1, \"OE\"); break; case \'Å\' : buf.replace(i, i+1, \"AA\"); break; default : buf.deleteCharAt(i--); } } } return buf.toString(); }
Hvis du prøver at dumpe en mail med denne (message.setText(parseText(body)); vil du opdage, at transfer-encoding ikke længere er quoted-printable!
Den kode du har postet op over fik jeg til at virke med message.setText(body,\"iso-8859-1\"); lige inden du skrev dine beskeder! :-) Nu virker både æøå og de mærkelige tegn (= mm.)er væk.. Jeg siger tak for din hjælp!
Vil det sige, at det virker, når det ser sådan her ud ? for så er det tegnesættet, men det var da også det du brugte i starten, men .... se nedenunder
Message-ID: <5352659.1000824742153.JavaMail.javamailuser@localhost> From: kenneth_andersen@vip.cybercity.dk To: 51900711@sms.tdm.dk Subject: overskrift i beskeden Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
Dette er body teksten i (=E6=F8=E5) sgj sdfighskdhgskduhg kdshg kdshgksudhg= kusdhgkusdhg ksuh gsbeskeden
Hvis det derimod fungerer når du bruger parseText, så kan jeg godt forstå det, for den fjerne alt der ikke er us-ascii og erstatter æ med ae und so weiter. Så transporteres der rent us-ascii, men hvis det bliver til æ,ø og å på modtageren igen, så er jeg forvirret :-)
Dette her virker! og ja, jeg er også forvirret, men det må bare have været tegnsættet der ikke har været rigtigt! Det eneste der er ændret er message.setText! ---cut--- String host \"mailhosten\"; //eks.vip.cybercity.dk String from = \"nbn@logical.dk\"; String til = \"mobilnummer@sms.tdm.dk\"; String subj = \"overskrift i beskeden\"; String body = \"Dette er body teksten i (æøå) beskeden\"; Properties props = System.getProperties(); props.put(\"mail.smtp.host\", host); Session session = Session.getInstance(props, null); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(til)); message.setSubject(subj); message.setText(body, \"iso-8859-1\"); message.saveChanges(); message.writeTo(System.out);
Jamen så forstår din sms gateway jo fint den \"ægte\" Latin-1. Det der så nok har været problemet i starten af denne tråd har nok været at det var attachet som multipart, selv om jeg ikke lige kan forstå at det skulle være et problem.
Men generelt set, hvis du har problemer med javamail, så dump altid beskeden ud, så kan du se ret håndgribeligt hvad der bliver sendt, og det er oftest det nemmeste debug.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.