Avatar billede tms Nybegynder
16. september 2001 - 16:17 Der 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.

Mvh. Kenneth

---cut---

import java.lang.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
import java.sql.*;
import java.net.InetAddress;

public class test2 {

public test2() {

}

public void sendSMS() throws Exception {

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

---cut---



Avatar billede logical Nybegynder
17. september 2001 - 07:59 #1
Hvilken version af javamail anvender du??

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);
Avatar billede disky Nybegynder
17. september 2001 - 08:54 #2
tms:

Er det f.eks., øæå som bliver vist forkert ? Eller er det konsekvent ?
Avatar billede tms Nybegynder
17. september 2001 - 13:37 #3
Jeg bruger ver. 1.2
Ved almindelig mailbox er der ingen problemer.
Det var en fejl med tegnsættet. Jeg bruger 8859-1.
æøå bliver vist rigtigt.
Avatar billede tms Nybegynder
17. september 2001 - 13:40 #4
Altså fejlen er ikke blevet løst. Jeg har hele tiden brugt tegnsæt 8859-1 og hele tiden har jeg haft fejlen!
Avatar billede logical Nybegynder
17. september 2001 - 20:52 #5
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
Avatar billede logical Nybegynder
17. september 2001 - 21:05 #6
Når du har dumpet den, så fortæl mig lige hvilken content-transfer-encoding der står i din multipart
Avatar billede logical Nybegynder
17. september 2001 - 21:10 #7
Forresten, har du andre parter i dit brev end din mail, fordi så kan du bare hælde indhold direkte ind i din mail:

MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(til));
message.setSubject(subj);
message.setText(body);

Avatar billede tms Nybegynder
17. september 2001 - 22:06 #8
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.
Avatar billede tms Nybegynder
17. september 2001 - 22:13 #9
Hvordan får jeg den til at skrive til en fil .??
Kan ikke lige få den outPutStream til at virke...
Avatar billede logical Nybegynder
18. september 2001 - 07:20 #10
try {
  OutputStream os = new BufferedOutputStream(new FileOutputStream(\"mail.txt\"));
  message.writeTo(os);
} catch (IOException e) {...}
Avatar billede tms Nybegynder
18. september 2001 - 09:30 #11
Dette laver ikke nogen fil...og heller ingen exception.???
Avatar billede logical Nybegynder
18. september 2001 - 10:17 #12
Nogen ting går lidt stærk en gang imellem, hvor jeg kun viser det centrale.

Jeg har denne kode oppe og virke:

OutputStream os = new BufferedOutputStream(new FileOutputStream(\"mail.txt\"));
message.saveChanges();
message.writeTo(os);
os.flush();

(saveChanges fungere ligesom pack i gui. Alle header bliver fabrikeret og færdiggjort)

Det var nok flush, der mangler til at hælde tingene ordentlig ned.
Avatar billede tms Nybegynder
18. september 2001 - 11:39 #13
jeg får stadig ikke nogen mail.txt fil.?
Jeg behøver vel ikke sende beskeden for at flush\'e den. ??
Avatar billede logical Nybegynder
18. september 2001 - 11:45 #14
Nej, men så bare bruge System.out

message.saveChanges();
message.writeTo(System.out);
Avatar billede tms Nybegynder
18. september 2001 - 12:08 #15
Hvor kommer det så.?
På skærmen NEJ! I hvilken fil så.?
Avatar billede logical Nybegynder
18. september 2001 - 12:12 #16
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);
Avatar billede tms Nybegynder
18. september 2001 - 14:21 #17
prøver lige præcis din kode når jeg kommer hjem lidt senere!
Avatar billede logical Nybegynder
18. september 2001 - 14:25 #18
Jeg er lige i nærheden hele tiden :-) Dog ikke til stede mellem kl. 16 og 20.
Avatar billede tms Nybegynder
18. september 2001 - 16:54 #19
ok. Så virkede det. Her er hvad der kom ud.
Dvs. ÆØÅ bliver mærkelige og der kommer også et = midt i det hele.??????

---cut---
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=Cp1252
Content-Transfer-Encoding: quoted-printable

Dette er body teksten i (=E6=F8=E5) sgj sdfighskdhgskduhg kdshg kdshgksudhg=
kusdhgkusdhg ksuh gsbeskeden
Avatar billede logical Nybegynder
18. september 2001 - 18:39 #20
Det var den message, du skulle paste i telnet.

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!
Avatar billede logical Nybegynder
18. september 2001 - 18:40 #21
Imens vil jeg prøve at høre om nogen kender til transfer-encoding på sms-gateways :-)
Avatar billede tms Nybegynder
18. september 2001 - 21:59 #22
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!
Avatar billede tms Nybegynder
18. september 2001 - 22:01 #23
Men det vil sige at fordi der ikke blev brugt Latin1 havde vi problemet! .?
Avatar billede logical Nybegynder
19. september 2001 - 08:03 #24
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 :-)
Avatar billede tms Nybegynder
19. september 2001 - 08:18 #25
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);
Avatar billede logical Nybegynder
19. september 2001 - 08:21 #26
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester