E-Mail via SMTP

Status
Nicht offen für weitere Antworten.

Aragos

Mitglied
Hoi,

ich versuche eMails per einfacher SMTP Verbindung zu senden. Leider funktioniert es noch nicht ganz - der Server sendet zwar keine Fehlermeldung, die eMail kommt aber auch nie beim Empfänger an.

Code:
import java.net.*;
import java.io.*;

public class sendMail {

	public static void main(String args[]) {
		//
		//  Send mail
		//
		//  sendMail [mail server] [recipient address] [Message]
		//               mail server can be hostname or IP address
		//
		//   ex.  sendMail smtp.company.com [email]myFriend@somewhere.qc.ca[/email] H3ll0w0rld
		//
		sendMail t = new sendMail();
		t.sendMail(args[0], args[1], args[2]);
	}

	public void sendMail(String mailServer, String recipient, String message) {
		try {
			Socket s = new Socket(mailServer, 25);
			BufferedReader in = new BufferedReader
			        (new InputStreamReader(s.getInputStream(), "8859_1"));
			BufferedWriter out = new BufferedWriter
			        (new OutputStreamWriter(s.getOutputStream(), "8859_1"));

			send(in, out, "HELO theWorld");
			// warning : some mail server validate the sender address
			//           in the MAIL FROm command, put your real address here
			send(in, out, "MAIL FROM: <webmaster@aragos.net>");
			send(in, out, "RCPT TO: <" + recipient + ">");
			send(in, out, "DATA");
			send(out, "Subject: " + message);
			send(out, "From: Aragos <webmaster@aragos.net>");
			send(out, "\n");
			// message body
			send(out, "Dies ist ein Test. Bitte bestätigen.");
			send(out, "\n.\n");
			send(in, out, "QUIT");
			s.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void send(BufferedReader in, BufferedWriter out, String s) {
		try {
			out.write(s + "\n");
			out.flush();
			System.out.println(s);
			s = in.readLine();
			System.out.println(s);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void send(BufferedWriter out, String s) {
		try {
			out.write(s + "\n");
			out.flush();
			System.out.println(s);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Die Ausgabe sieht folgendermaßen aus:

Code:
HELO theWorld
220 mail.artfiles.de ESMTP
MAIL FROM: <webmaster@aragos.net>
250 mail.artfiles.de
RCPT TO: <aragos@aragos.de>
250 ok
DATA
250 ok
Subject: H3ll0W0rld
From: Aragos <webmaster@aragos.net>


Dies ist ein Test. Bitte bestätigen.

.

QUIT
354 go ahead

Meines Wissens sollte der Server nach DATA den 354 code senden - aber ich kann mich auch irren, da ich noch so gut wie gar nichts über SMTP/Java weiß.

Könnte mir jemand einen Tipp geben was das Problem ist?

Vielen Dank schon mal

Aragos
 

Aragos

Mitglied
Weil mein lieber Projektleiter möglichst ohne zusätzliche Dinge auskommen möchte... naja, wenn ich es so nciht hinbekomme muss wohl trotz allem JavaMail her.

Aragos
 

Aragos

Mitglied
So, habe den Fehler gefixt, werde das script noch mit auth und Syntaxcheck ausstatten und dann hier posten :)

Aragos
 

Aragos

Mitglied
Ein kleiner SMTP Client:

Code:
/*
 * Copyright (c) 2004 MIT Media Lab. All Rights Reserved.
 */

import java.net.*;
import java.io.*;
import java.util.regex.Pattern;

/**
 * Send eMails per SMTP
 * includes address check
 *
 * @author Aragos (aragos@media.mit.edu / [email]aragos@aragos.de[/email] )
 * @version 1.1
 *
 */

public class smtpMail {

	// Standardvalues
	private static String
	    standardServerName = "mail.company.tld",
	    standardRecipients = "aragos@aragos.de, [email]aragos@aragos.net[/email]",
	    standardSender     = "aragos@aragos.net",
	    standardIdentifier = "[Report]";
	private static int
	    standardServerPort = 25;

	//------------------------------------------------------------------------------------------------------------------

	public int
	    serverPort;
	public String
	    mailSender,
	    mailSubject,
	    mailMessage,
	    mailFrom,
	    serverName;
	public String[]
	    mailRecipients;

	/**
	 * create an email with standard settings (server, port, senderaddress)
	 * @param subject    message subject
	 * @param message    the message itself
	 * @param recipients recipient-adresses seperated by comma or semi-colon (, ;): "someone@company.tld; [email]another@company.tld[/email], [email]foo@bar.org[/email]" (without quotes)
	 */

	public smtpMail(
	        String subject,
	        String message,
	        String recipients
	        )
	{

		mailSender     = standardSender;
		mailFrom       = standardSender;
		mailRecipients = recipients.split("[;,]");

		mailSubject    = subject;
		mailMessage    = message.replaceAll("[^\r]\n", "\r\n");

		serverName     = standardServerName;
		serverPort     = standardServerPort;

	}


	/**
	 * constructor for feedback mails
	 * @param altsender   alterative reply path - standardSender will be used for MAIL FROM
	 * @param subject     message subject
	 * @param message     the message itself
	 * @param identifier  whether or not the standard identifier should be used
	 */

	public smtpMail(
	        String altsender,
	        String subject,
	        String message,
	        boolean identifier
	        )
	{

		mailSender     = standardSender;
		mailFrom       = altsender;
		mailRecipients = standardRecipients.split("[;,]");

		mailSubject    = ( identifier ? standardIdentifier : "" ) + subject;
		mailMessage    = message.replaceAll("[^\r]\n", "\r\n");

		serverName     = standardServerName;
		serverPort     = standardServerPort;

	}

	/**
	 * used for sending Mails via the SMTP (Simple Mail Transfer Protocol)
	 * @return true if mail could be sent, false if not
	 */

	public boolean sendMail()
	{

		boolean delivery = false;

		try {

			Socket s = new Socket(serverName, serverPort);              //contacting server
			BufferedReader in = new BufferedReader
			        (new InputStreamReader(s.getInputStream(), "8859_1"));
			BufferedWriter out = new BufferedWriter
			        (new OutputStreamWriter(s.getOutputStream(), "8859_1"));

			//log
			System.out.println("***Starting to send Mail:");
			System.out.println(in.readLine());                          // Server Ident
			//xlog

			send(in, out, "EHLO EEMailer");                             // our Ident

			//log
			while(true){                                                // get Server extended informations
				String str = in.readLine();
				System.out.println(str);
				if (str.regionMatches(3, " ", 0, 1))
				   break;
			}
			//xlog

			send(in, out, "MAIL FROM: " + mailSender );                 // sender address
			for( int i = 0; i < mailRecipients.length; i++ )            // recipient addresses
			  send(in, out, "RCPT TO: <" + mailRecipients[i] + ">" );
			send(in, out, "DATA");                                      // starting content
			send(out, "Subject: " + mailSubject);                       // subject
			send(out, "From: " + mailFrom);                             // also possible: "From: SenderName <sender@address.com>"
			send(out, mailMessage);                                     // message body
			send(out, "\r\n.\r\n");                                     // message body termination
			send(out, "QUIT");                                          // end communication

			String str = in.readLine();
			if(str.regionMatches(0, "250", 0, 3)){                      // code 250 == ok
				delivery = true;
			//log
			    System.out.println("***Sending eMail successful: "  + str);
			}
			else
				System.out.println("***Error while sending eMail: " + str);
			//xlog

			s.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return delivery;
	}


	/**
	 * runs a regex check on all involved email adresses and returns the wrong ones
	 * @return an empty string array ( String str = new String[]{""}; ) if all emails are ok, otherwise a string array which contains wrong email adresses
	 */
	public String[] checkAddress(){
		String[] ret = new String[]{ "" };
		int errors  = 0;

		String pat = "^[_a-zA-Z0-9-]+(.[_a-zA-Z0-0-]+)*@[a-zA-Z0-9-]+(.[_a-zA-Z0-0-]+)*.([a-zA-Z]{2,4})$";

		if ( !Pattern.matches( pat, mailSender.trim()) )
			ret[errors++] = mailSender;

		if (!Pattern.matches(pat, mailFrom.trim()))
			ret[errors++] = mailFrom;

		for( int i = 0; i < mailRecipients.length; i++ )
			if (!Pattern.matches(pat, mailRecipients[i].trim()))
				ret[errors++] = mailSender;

		return ret;
	}

	private void send(
	        BufferedReader in,
	        BufferedWriter out,
	        String s)
	{
		try {
			out.write(s + "\r\n");
			out.flush();
			//log
			System.out.println(s);
			System.out.println( in.readLine() );
			//xlog
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void send(
	        BufferedWriter out,
	        String s)
	{
		try {
			out.write(s + "\r\n");
			out.flush();
			//log
			System.out.println(s);
			//xlog
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Und der Testcode dazu (vorher aber die Standardvalues ändern ;) ):

Code:
public class Test {

	public static void main(String args[]) {

		smtpMail mail = new smtpMail( "bluub@.sgn.de", "test", "Nachricht"); //email stimmt nicht ;)

		String[] errors = mail.checkAddress();

		if( !errors[0].equals("") )
		    for(int i = 0; i < errors.length; i++)
				System.out.println(errors[i]);
		else
		  mail.sendMail();
	}

}

Ich hoffe das stimmt so weit und entschpricht euren Dokumentationsansprüchen, ist mein erstes Javaprojekt und ich habe da noch nicht so die große Ahnung. Kritik und Anregungen gerne willkommen. :)

Aragos
 

Lengen1971

Aktives Mitglied
Hallo Aragos,

ich habe Teile deines ersten Codes übernommen, hat mir schon sehr gut geholfen. Ich hab allerdings noch das Problem, dass nach dem Befehlt QUIT nichts mehr passiert. Es kommt also keine Mail an und das Programm hängt an dieser Stelle.

Ich hab die Befehlsfolge mal selbst per Telnet an den SMTP-Server geschickt und da funzt alles, nach quit kommt GoodBye-Meldung und die Mail wird verschickt.

Hast Du noch eine Idee für mich?

Code:
import java.net.*; 
import java.io.*; 

public class sendMail
{
	String line_sep=System.getProperty("line.separator");
	
	public boolean sendMail(String mailServer, String recipient, String message) { 
      try { 
	     
         Socket s = new Socket(mailServer, 25); 
         BufferedReader in = new BufferedReader 
                 (new InputStreamReader(s.getInputStream(), "8859_1")); 
         BufferedWriter out = new BufferedWriter 
                 (new OutputStreamWriter(s.getOutputStream(), "8859_1")); 

         send(in, out, "HELO xxxxxxxx.xx"); 
         while(true){                                                // get Server extended informations 
            String str = in.readLine(); 
            System.out.println(str); 
            if (str.regionMatches(3, " ", 0, 1)) break; 
     	} 

         // warning : some mail server validate the sender address 
         //           in the MAIL FROm command, put your real address here 
         send(in, out, "MAIL FROM: [email]hcs@xxxxxxxx.xx[/email]"); 
         send(in, out, "RCPT TO: " + recipient); 
         send(in, out, "DATA"); 
         send(out, "Subject: " + message); 
         send(out, "From: <hcs@xxxxxxx.xx>"); 
         send(out, line_sep); 
         // message body 
         send(out, "Dies ist ein Test. Bitte bestätigen."); 
         send(out, line_sep+"."+line_sep); 
         while(true){                                                // get Server extended informations 
            String str = in.readLine(); 
            System.out.println(str); 
            if (str.regionMatches(3, " ", 0, 1)) break; 
      	} 
         send(in, out, "QUIT"); 
          String str = in.readLine(); 
          if(str.regionMatches(0, "250", 0, 3)){                      // code 250 == ok 
           	System.out.println("***Sending eMail successful: "  + str); 
         } 
         s.close(); 
         
      } catch (Exception e) { 
         e.printStackTrace(); 
      } 
      return true;
   } 
   public void send(BufferedReader in, BufferedWriter out, String s) { 
      try { 
         out.write(s + line_sep); 
         out.flush(); 
         System.out.println(s); 
         s = in.readLine(); 
         System.out.println(s); 
      } catch (Exception e) { 
         e.printStackTrace(); 
      } 
   } 
   public void send(BufferedWriter out, String s) { 
      try { 
         out.write(s + line_sep); 
         out.flush(); 
         System.out.println(s); 
      } catch (Exception e) { 
         e.printStackTrace(); 
      } 
   } 
}
 

Aragos

Mitglied
Hoi an alle,

hier eine "revised" edition, ich hoffe es hilft (besonders Lengen1971) weiter:

Ausserdem enthält diese Version einige Fixes, wie z.B. korrekte Ersetzung von Zeilenumbrüchen.

Code:
import java.net.*;
import java.io.*;
import java.util.regex.Pattern;
import java.util.StringTokenizer;

/**
 * Send eMails per SMTP
 * includes address check.
 * all email addresses can be multiple, seperated either by a comma or semi-colon
 *
 * @author Aragos ( [email]aragos@aragos.de[/email] )
 * @version 1.2
 */

public class testMail {

	// Standardvalues 
	public static String
	        standardServerName  = "smtp.yourdomain.tld",    // the smtp server this message will be delivered to 
			standardRecipients  = "you@yourdomain.tld",     // standard recipients of the message
			standardSender      = "you@yourdomain.tld";     // standard senderaddress of the message
	private static int
	        standardServerPort  = 25;
	
	//------------------------------------------------------------------------------------------------------------------

	public int
	        serverPort;
	public String
	        mailSender,
			mailSubject,
			mailMessage,
			mailFrom,
			serverName;
	public String[]
	        mailRecipients;

	/**
	 * create an email with standard settings (server, port, senderaddress)
	 *
	 * @param subject    message subject
	 * @param message    the message itself
	 * @param recipients recipient-adresses seperated by comma or semi-colon (, ;): "someone@company.tld; [email]another@company.tld[/email], [email]foo@bar.org[/email]" (without quotes)
	 */
	public testMail(String subject,
	                  String message,
	                  String recipients) {

		mailSender      = standardSender;
		mailFrom        = standardSender;
		mailRecipients  = recipients.split("[;,]");

		mailSubject     = subject.replaceAll("([^\r])\n", "$1\r\n");
		mailMessage     = message.replaceAll("([^\r])\n", "$1\r\n");
		serverName      = standardServerName;
		serverPort      = standardServerPort;

	}


	/**
	 * used for sending Mails via the SMTP (Simple Mail Transfer Protocol)
	 *
	 * @return true if mail could be sent, false if not
	 */

	public boolean sendMail() {

		boolean delivery = false;

		try {
			
			Socket s = new Socket(serverName, serverPort);              //contacting server
			BufferedReader in = new BufferedReader
			        (new InputStreamReader(s.getInputStream(), "8859_1"));
			BufferedWriter out = new BufferedWriter
			        (new OutputStreamWriter(s.getOutputStream(), "8859_1"));
			
			String str = in.readLine();
			//log
			//System.out.println("***Starting to send Mail:");
			//System.out.println(str);                          // Server Ident
			//xlog
			
			send(in, out, "EHLO EEMailer");                             // our Ident
			
			//log
			while (true) {                                              // get Server extended informations
				str = in.readLine();
				//System.out.println(str);
				if (str.regionMatches(3, " ", 0, 1))
					break;
			}
			//xlog
			
			send(in, out, "MAIL FROM: " + mailSender);                 // sender address
			for (int i = 0; i < mailRecipients.length; i++)            // recipient addresses
				send(in, out, "RCPT TO: <" + mailRecipients[i] + ">");
			send(in, out, "DATA");                                      // starting content
			send(out, "Subject: " + mailSubject);                       // subject
			send(out, "From: " + mailFrom);                             // also possible: "From: SenderName <sender@address.com>"
			send(out, mailMessage);                                     // message body
			send(out, "\r\n.\r\n");                                     // message body termination
			send(out, "QUIT");                                          // end communication
			
			str = in.readLine();
			if (str.regionMatches(0, "250", 0, 3)) {                    // code 250 == ok
				delivery = true;
				//log
				//	System.out.println("***Sending eMail successful: " + str);
			}/* else
			System.out.println("***Error while sending eMail: " + str);*/
			//xlog
			
			s.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return delivery;
	}

	/**
	 * runs a regex check on all involved email adresses and returns the wrong ones
	 *
	 * @return an empty string array ( String str = new String[]{""}; ) if all emails are ok, otherwise a string array which contains wrong email adresses
	 */
	public String[] checkAddress() {
		String[] ret = new String[]{""};
		int errors = 0;

		String pat = "^[_a-zA-Z0-9-]+(.[_a-zA-Z0-0-]+)*@[a-zA-Z0-9-]+(.[_a-zA-Z0-0-]+)*\\.([a-zA-Z]{2,4})$";

		if (!Pattern.matches(pat, mailSender.trim()))
			ret[errors++] = mailSender;

		if (!Pattern.matches(pat, mailFrom.trim()))
			ret[errors++] = mailFrom;

		for (int i = 0; i < mailRecipients.length; i++)
			if (!Pattern.matches(pat, mailRecipients[i].trim()))
				ret[errors++] = mailSender;

		return ret;
	}

	private void send(BufferedReader in,
	                  BufferedWriter out,
	                  String s) {
		try {
			out.write(s + "\r\n");
			out.flush();
			//log
			//System.out.println(s);
			s = in.readLine();
			//System.out.println(s);
			//xlog
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void send(BufferedWriter out,
	                  String s) {
		try {
			out.write(s + "\r\n");
			out.flush();
			//log
			//System.out.println(s);
			//xlog
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Java E-mail versenden. SMTP Port Fehler Java Basics - Anfänger-Themen 8
A Java Mail 1.4.4 - Email versenden (HOTMAIL SMTP auth) Java Basics - Anfänger-Themen 9
M Mail senden - Problem connect to SMTP host Java Basics - Anfänger-Themen 5
M Java Mail Programm Java Basics - Anfänger-Themen 4
Z E-Mail senden mit Bibliotheken Java Basics - Anfänger-Themen 1
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9
T PDF-Formula (XFDF) via Mail - Betreff mit Werten aus PDF-Formular ergänzen Java Basics - Anfänger-Themen 2
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
I Java Mail (IMAP -> Empfangen) und Google Mail Java Basics - Anfänger-Themen 1
K Mail senden, nachdem Anwendung beendet wurde (gleich wie) Java Basics - Anfänger-Themen 4
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
B Java Mail -> Mail senden, ist aber nich in IMAP unter "Gesendet" Java Basics - Anfänger-Themen 3
F String auf E-Mail kürzen Java Basics - Anfänger-Themen 11
B Java Mail: suchen von mehreren Emailadressen Java Basics - Anfänger-Themen 5
B java.mail - Email antworten und Content ausgeben Java Basics - Anfänger-Themen 4
J Mail body verschwindet Java Basics - Anfänger-Themen 2
Henri Mail zu einer Gruppe versenden Java Basics - Anfänger-Themen 10
F Mail empfangen mit JAVA Java Basics - Anfänger-Themen 3
S JavaMail API E-Mail versenden Probleme Java Basics - Anfänger-Themen 5
S E-Mail über Java Java Basics - Anfänger-Themen 9
Mike90 Anhänge einer Mail abrufen Java Basics - Anfänger-Themen 6
timbeau Javax.Mail: Check this out Java Basics - Anfänger-Themen 10
T Java-Mail API Java Basics - Anfänger-Themen 11
V JavaApplet versendet keine mail Java Basics - Anfänger-Themen 8
0 Mail Versand Java Basics - Anfänger-Themen 65
F Java Mail mit Anhang Java Basics - Anfänger-Themen 5
M Java Mail API Java Basics - Anfänger-Themen 7
StrikeTom Javax.mail frage(zu code) Java Basics - Anfänger-Themen 17
J Dateien automatisch per Mail versenden Java Basics - Anfänger-Themen 3
F E-Mail Java Basics - Anfänger-Themen 24
M Ist Mail API im Core? Java Basics - Anfänger-Themen 2
L E-Mail Attribute IMAP ändern Java Basics - Anfänger-Themen 4
M Mail-Programm Java Basics - Anfänger-Themen 8
F mail mit anhang Java Basics - Anfänger-Themen 5
F Anhang mi Java Mail Java Basics - Anfänger-Themen 13
F "From" bei Mail ändern Java Basics - Anfänger-Themen 6
F Mail Java Basics - Anfänger-Themen 3
W Mail problem Java Basics - Anfänger-Themen 3
H ist eine "neue Session" für Mail möglich? Java Basics - Anfänger-Themen 3
T E-mail programm Java Basics - Anfänger-Themen 2
F java mail api Java Basics - Anfänger-Themen 4
M Javamail: Mail als separate Datei speichern? Java Basics - Anfänger-Themen 6
G Mehrere E-Mail Adressaten Java Basics - Anfänger-Themen 3
G Mail versenden, wenn Mikrofon einen bestimmten Pegel erreich Java Basics - Anfänger-Themen 3
D Problem beim E-Mail versenden Java Basics - Anfänger-Themen 6
G mail verschicken Java Basics - Anfänger-Themen 3
G Mail Client öffnen Java Basics - Anfänger-Themen 9
R Javax.mail wird nicht gefunden Java Basics - Anfänger-Themen 2
D Suchen nach E-Mail Adressen mit RegEx? Java Basics - Anfänger-Themen 14
F E-Mail Programm Java Basics - Anfänger-Themen 4
R JAVA Mail Java Basics - Anfänger-Themen 5
G mail.jar und activation.jar Java Basics - Anfänger-Themen 3
M regulärer Ausdruck zum Parsen einer E-Mail Signatur Java Basics - Anfänger-Themen 16
C wo ist mein javax.mail? Java Basics - Anfänger-Themen 2
M Einfache HTML Mail versenden , suche Beispiel Java Basics - Anfänger-Themen 5
L package com.sun.mail does not exist Java Basics - Anfänger-Themen 8
L Import von mail.jar Java Basics - Anfänger-Themen 10
N Header für Mail Java Basics - Anfänger-Themen 5
L JavaMail: javax.mail wird nicht gefunden Java Basics - Anfänger-Themen 2
R die /ext klassen nutzen (Mail API) - klassen laden Java Basics - Anfänger-Themen 7
M E-Mail im Netzwerk über Microsoft Exchange Server versenden? Java Basics - Anfänger-Themen 3
H java smtp could not connect Java Basics - Anfänger-Themen 19
S Email und SMTP Java Basics - Anfänger-Themen 3
S smtp-Client programmieren Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben