webForumDet fria alternativet

JavaMail

11 svar · 492 visningar · startad av AG

AGMedlem sedan mars 20001 229 inlägg
#1

Kanske en konstig fråga men....
Hur fungerar javamail? Är det bara några färdiga klasser som används, eller är det något nödvändigt.
Är det enkelt att göra en egen mailuppsättning?

Andreas

ViktorMedlem sedan aug. 20021 710 inlägg
#2

Borde nog ligga i J2EE forumet eftersom JavaMail är en del av J2EE.

Java mail är en stor uppsättning klasser som möjliggör både hämtning och sändning av mail i olika format, POP, IMAP, SMTP osv.
Att göra en egen SMTP klass är ganska enkelt, det finns redan en skriven här på forumet, http://www.webforum.nu/showthread.php?s=&threadid=56504. POP3 är nog inte heller så svår att göra en egen klass till, men det har jag inte provat.

/Viktor

AGMedlem sedan mars 20001 229 inlägg
#3

Tackar
Var en smtp klass jag behövde. Frågan är hur jag skall göra för addera "subject" till klassen.

Andreas

ViktorMedlem sedan aug. 20021 710 inlägg
#4

Ej testat

String message="Hello World! This is a cool mail from Viktor!";
String subject="You have a cool mail!";
message=subject+"\n\n"+message;

sen är det bara att skicka message.

/Viktor

LimeMedlem sedan sep. 2001837 inlägg
#5

Njea... Det finns en klass som heter javax.mail.Message som har en massa bra metoder t.ex. setSubject(String subject). Använd den instället.

/Lime

AGMedlem sedan mars 20001 229 inlägg
#6

Tyvärr Viktor fungerade det inte.
Gäller som sagt klasses som det länkades till.

Andreas

ViktorMedlem sedan aug. 20021 710 inlägg
#7

Det var jag som skrev fel (kunde inte följa min egna instruktioner från den länkade topicen...) här är hela programmet med subject inkluderat

import java.io.*;
import java.net.Socket;
import java.net.SocketException;

public class Test {
	private Socket socket;
	private OutputStreamWriter outputStreamWriter;
	private BufferedReader bufferedReader;

	public static void main( String[] args ) {
		Test email = new Test();
		email.start("Hello","MyMessage", "ffsd@fds.com", "ffsfs@dfsd.com" );
	}

	public void start(String subject, String message, String from, String to ) {
		try {
			System.out.println( "Connection to mail1.telia.com..." );
			this.socket = new Socket( "mail1.telia.com", 25 );

			this.outputStreamWriter = new OutputStreamWriter( this.socket.getOutputStream() );
			this.bufferedReader = new BufferedReader( new InputStreamReader( this.socket.getInputStream() ) );

			System.out.println( "Connected!" );
			System.out.println( "From server: " + bufferedReader.readLine() );

			send( "helo mail1.telia.com" );
			send( "MAIL FROM:<" + from + ">" );
			send( "RCPT TO:<" + to + ">" );
			send( "DATA" );
			send("Subject:"+subject+"\r\n\r\n"+message + "\r\n.\r\n" );

			this.outputStreamWriter.close();
			this.bufferedReader.close();
			this.socket.close();
		}
		catch( Exception e ) {
			System.err.println( "Error: " + e.getMessage() );
			e.printStackTrace();
		}
	}

	private void send( String sendMe ) throws Exception {
		System.out.println( "To server: " + sendMe );
		this.outputStreamWriter.write( sendMe + "\r\n" );
		this.outputStreamWriter.flush();
		System.out.println( "From server: " + this.bufferedReader.readLine() );
	}
}

Men som Lime säger så är det bättre att använda JavaMail om man kan.

/Viktor

sgtpepperMedlem sedan apr. 20005 524 inlägg
#8

JavaMail är ett API för att skicka mail. Visst kan man som ovan skriva sin egen SMTP-klass, men varför uppfinna hjulet på nytt?

Så här skickar man ett enkelt mail med JavaMail (vill man t.ex bifoga en fil så krävs endast tre-fyra extra rader kod):

try {
	java.util.Properties mailProps = 
		new java.util.Properties();

	mailProps.setProperty(
		"mail.smtp.host", 
		"min-smtp-server.foo.com"
	);

	javax.mail.Session session =
		javax.mail.Session.getDefaultInstance(
			mailProps, null
		);
			
	javax.mail.Message msg = 
		new javax.mail.internet.MimeMessage(session);
	
	msg.setFrom(
		new javax.mail.internet.InternetAddress(
			"sgtpepper@webforum.nu")
	);
	
	msg.setRecipient(
		javax.mail.Message.RecipientType.TO, 
		new javax.mail.internet.InternetAddress("foo@bar.com")
	);
					
	msg.setSubject("Min fina rubrik");
	msg.setSentDate(new java.util.Date());
	msg.setText("Mitt meddelande");
	
	javax.mail.Transport.send(msg);	
} catch(javax.mail.internet.AddressException ae) {
	System.out.println("Felaktig adress");
} catch(javax.mail.MessagingException me) {
	System.out.println("Kunde inte skicka mailet");
}

I jar-en j2ee.jar finns allt som behövs för att köra ovanstående, se till att den finns i classpath:en.

Eftersom ursprungsfrågan gällde JavaMail och då JavaMail ingår i J2EE så flyttas inläggget från Java -> J2EE.

AGMedlem sedan mars 20001 229 inlägg
#9

Ok.
Anledningen till att jag inte ville inkludera javamail var faktiskt att det krävde att jag lade till delar till classpathen.
Eftersom det endast skulle användas för smtp, skicka ut aktiveringskod så får detta duga.

Men tack skall ni ha.

Andreas

AGMedlem sedan mars 20001 229 inlägg
#10

Nu skulle jag behöva hjälp med att förstå detta problem.
När följande kod används fungerar systemet och det skickas ut mail.

package serverspy;

import java.io.*;
import java.net.Socket;
import java.net.SocketException;

public class EmailBean2 {
	private Socket socket;
	private OutputStreamWriter outputStreamWriter;
	private BufferedReader bufferedReader;

String exp = "";
	
public String getExp() {
return exp;
}

	
	public void start( String subject, String message, String from, String to ) {
		try {
			//System.out.println( "Connection to localhost..." );
			this.socket = new Socket("localhost", 25 );
			
			this.outputStreamWriter = new OutputStreamWriter( this.socket.getOutputStream() );
			this.bufferedReader = new BufferedReader( new InputStreamReader( this.socket.getInputStream() ) );
			
			//System.out.println( "Connected!" );
			//System.out.println( "From server: " + bufferedReader.readLine() );
	
			send( "helo localhost" );
			send( "MAIL FROM:<" + from + ">" );
			send( "RCPT TO:<" + to + ">" );
			send( "DATA" );
			send("Subject:"+subject+"\r\n\r\n"+message + "\r\n.\r\n" );

			this.outputStreamWriter.close();
			this.bufferedReader.close();
			this.socket.close();
		}
		catch( Exception e ) {
			System.err.println( "Error: " + e.getMessage() );
			exp = e.getMessage();
			e.printStackTrace();
		}
	}
	
	private void send( String sendMe ) throws Exception {
		//System.out.println( "To server: " + sendMe );
		this.outputStreamWriter.write( sendMe + "\r\n" );
		this.outputStreamWriter.flush();
		System.out.println( "From server: " + this.bufferedReader.readLine() );

	}
}

Byts däremot:

System.out.println( "From server: " + this.bufferedReader.readLine() );

mot:
//System.out.println( "From server: " + this.bufferedReader.readLine() );

Går inget mail ut. Verkar helskumt.
Jspsidan det sänder från ser ut som följer:


<jsp:useBean id="mailBean" scope="request" class="serverspy.EmailBean2" />

<%

try {
String from = "andreas@digital-network.nu";
String to = "a.gustafsson@visionreklam.se";

String subject = "Myserverspy - Activation";

String emsg = "Dear " + to + ",";

mailBean.start(subject, emsg, from, to);

%>
<%=mailBean.getExp()%><p>
Activated

<%

}
catch(Exception exp){

	System.out.println("Exception: "+exp);
}
%>

Andreas

LimeMedlem sedan sep. 2001837 inlägg
#11

Vad skriver "System.out.println( "From server: " + this.bufferedReader.readLine() );" ut för något?

/Lime

AGMedlem sedan mars 20001 229 inlägg
#12

Nu skickar jag med den i variabeln exp istället.
Värdet:
"354 Enter mail, end with "." on a line by itself"
Nu skickas värdet med i senddelen:
exp = this.bufferedReader.readLine();

Verkar helskumt.

Andreas

138 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
135 ms — hämta tråd, inlägg och bilagor (db)