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
11 svar · 492 visningar · startad av AG
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
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
Tackar
Var en smtp klass jag behövde. Frågan är hur jag skall göra för addera "subject" till klassen.
Andreas
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
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
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
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.
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
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
Vad skriver "System.out.println( "From server: " + this.bufferedReader.readLine() );" ut för något?
/Lime
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