Avatar billede jonasbc Nybegynder
04. juli 2003 - 09:40 Der er 10 kommentarer og
1 løsning

Problem med SMTP via socket

Hej!

Jeg sidder og roder lidt med at sende e-mail via en socket forbindelse til SMTP serveren.
Det går også fint med de første par kommandoer, men når jeg sender DATA kommandoeen, får jeg tilbage som svar, at jeg skal sende indholdet og afslutte med "." på en linje for sig... Men jeg kan ikke få det til at fungere!

Jeg har prøvet næsten alt, synes jeg, med forskelligt indhold i følgende kode:

[snakker lidt med server...]

writer.println("DATA");
line = reader.readLine();
System.out.println("Server Response : " + line);

writer.println("Subject: Test");

writer.println("test");
writer.println();

writer.println("."); //dette punktum bliver vist ikke accepteret!?

line = reader.readLine();
System.out.println("Server Response : " + line);

writer.println("QUIT");
line = reader.readLine();
System.out.println("Server Response : " + line);

socket.close();

//her når jeg aldrig til :(
Avatar billede jonasbc Nybegynder
04. juli 2003 - 09:43 #1
Jeg har forresten prøvet at putte noget...

writer.println("Content-Type: text/plain");
writer.println("Content-Transfer-Encoding: quoted-printable");

... i indholdet. Ingen forskel!
Avatar billede arne_v Ekspert
04. juli 2003 - 10:16 #2
Er der gode grunde til at du ikke bruger JavaMail pakken ?
Avatar billede arne_v Ekspert
04. juli 2003 - 10:17 #3
De content headere er på RFC 822 niveau ting og dit problem med DATA og .
er på RFC 821 niveau og derfor er det ikke overraskende at
det ikke gør en forskel.
Avatar billede jonasbc Nybegynder
04. juli 2003 - 10:30 #4
Hej!

Det med headerne kunne jeg godt forestille mig... Jeg har skimmet RFC 821 for at finde noget, men der var ikke rigtig noget, jeg kunne bruge til noget.

Jeg arbejder med en e-mail applikation til en set top box og har derfor kun en begrænset del af API'et til rådighed...
Avatar billede arne_v Ekspert
04. juli 2003 - 10:38 #5
Har du checket om du får sendt <CR><LF> og ikke bare <LF> eller <CR> ?
Avatar billede jonasbc Nybegynder
04. juli 2003 - 11:02 #6
Hej!

Jeg har lige prøvet med
writer.println("\r\n.\r\n");

Ingen forskel... Burde det ikke være mere end tilstrækkeligt??
Avatar billede arne_v Ekspert
04. juli 2003 - 12:54 #7
Jo.

Jeg har liggende noget kode som laver "handcoded" SMTP.

Jeg kan finde det frem i aften.
Avatar billede arne_v Ekspert
05. juli 2003 - 21:49 #8
Her er den lovede kode:

import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;

public class Email {
  // SMTP port
  public static final int SMTP_PORT = 25;

  // SMTP server
  private static String mailHost = null;

  // socket
  private Socket mailSocket;

  // streams
  private PrintWriter outStream;
  private BufferedReader inStream;

  // set SMTP server
  public static void setMailHost(String server) {
      mailHost = server;
  }

  // open email
    public void open(String from, String to, String subject) throws Exception {
      if (mailHost == null) {
          throw new Exception("Mailhost not set");
      }
      SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzzz", Locale.US);
      mailSocket = new Socket(InetAddress.getByName(mailHost), SMTP_PORT);
      outStream = new PrintWriter(mailSocket.getOutputStream());
      inStream = new BufferedReader(new InputStreamReader(mailSocket.getInputStream()));
      receive();
      send("HELO " + InetAddress.getLocalHost().getHostAddress());
      receive();
      send("MAIL FROM: <" + from + ">");
      receive();
      send("RCPT TO: <" + to + ">");
      receive();
      send("DATA");
      receive();
      send("Return-Path: <" + from + ">");
      send("From: " + from);
      send("To: " + to);
      send("Subject: " + subject);
      send("Date: " + format.format(new Date()));
      send("MIME-version: 1.0");
      send("Content-type: text/plain; Charset=iso-8859-1");
      send("Content-transfer-encoding: 8bit");
      send("");
      return;
  }

  // send line
  public void addLine(String line) {
      send(line);
      return;
  }

  // close email
  public void close() throws Exception{
      send(".");
      receive();
      send("QUIT");
      receive();
  }

  // send simple email
  public static void sendSimple(String from, String to, String subject, String body) throws Exception {
      Email temp = new Email();
      temp.open(from,to,subject);
      temp.addLine(body);
      temp.close();
      return;
  }

  // send simple email with no body
  public static void sendSimpleNoBody(String from, String to, String subject) throws Exception {
      Email temp = new Email();
      temp.open(from,to,subject);
      temp.close();
      return;
  }

  // send and receive
  private void send(String cmd) {
      outStream.print(cmd + "\r\n");
      outStream.flush();
      return;
  }
  private void receive() throws Exception{
      String resp = inStream.readLine();
      int code = Integer.parseInt(resp.substring(0,3));
      if( (code != 220) &&
          (code != 221) &&
          (code != 250) &&
          (code != 251) &&
          (code != 354) ) {
        throw new Exception("Bad response from SMTP server");
      }
      return;
  }
}
Avatar billede arne_v Ekspert
05. juli 2003 - 21:52 #9
Ovenstående virker.

Så er spørgsmålet kjo så hvrofor din ikke gør.

Umiddelbart kan jeg se 2 forskelle.

1)  Det ser ud som om du mangler en tom linie mellem RFC 822 headerne og
    body.

2)  Jeg bruger flush hele tiden for at sikre mig at det faktisk bliver
    sendt med det samme.
Avatar billede arne_v Ekspert
05. juli 2003 - 21:52 #10
Og et svar
Avatar billede jonasbc Nybegynder
05. juli 2003 - 22:09 #11
Hej!

Det fungerer sgu... Så skal jeg bare ha' fundet ud af, hvorfor min oprindelige kode ikke gør. Men det har nok noget at gøre med de ting, du nævner.

Tak for hjælpen i hvert fald. Lækkert at kode lige så'n en lørdag aften :)
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