view src/goodjava/mail/Smtp.java @ 1582:f28cc30d56cb

start goodjava/mail
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 06 Mar 2021 21:13:34 -0700
parents
children 1cc6c7fa803d
line wrap: on
line source

package goodjava.mail;

import java.io.Reader;
import java.io.InputStreamReader;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.net.Socket;
import java.util.Base64;


public class Smtp {
	private final char[] buf = new char[1000];
	private final Socket socket;
	private final Reader reader;
	private final Writer writer;
	public final String ehlo;

	public Smtp(Socket socket) throws IOException, SmtpException {
		this.socket = socket;
		this.reader = new InputStreamReader(socket.getInputStream());
		this.writer = new OutputStreamWriter(socket.getOutputStream());
		String s = read();
		if( !s.startsWith("220") )
			throw new SmtpException(s);
		write( "EHLO\r\n" );
		ehlo = read();
		if( !ehlo.startsWith("250") )
			throw new SmtpException(ehlo);
	}

	public void close() throws IOException, SmtpException {
		write( "QUIT\r\n" );
		String s = read();
		if( !s.startsWith("221") )
			throw new SmtpException(s);
		socket.close();
	}

	public String authenticate(String username,String password) throws IOException, SmtpException {
		String s = "\0" + username + "\0" + password;
		s = Base64.getEncoder().encodeToString(s.getBytes());
		write( "AUTH PLAIN " + s + "\r\n" );
		String r = read();
		if( !r.startsWith("235") )
			throw new SmtpException(r);
		return r;
	}

	public String from(String address) throws IOException, SmtpException {
		write( "MAIL FROM: " + address + "\r\n" );
		String r = read();
		if( !r.startsWith("250") )
			throw new SmtpException(r);
		return r;
	}

	public String to(String address) throws IOException, SmtpException {
		write( "RCPT TO: " + address + "\r\n" );
		String r = read();
		if( !r.startsWith("250") )
			throw new SmtpException(r);
		return r;
	}

	public String data(String text) throws IOException, SmtpException {
		if( !text.endsWith("\r\n") )
			throw new SmtpException("text must end with \\r\\n");
		text = text.replace("\r\n.","\r\n..");
		write( "DATA\r\n" );
		String r = read();
		if( !r.startsWith("354") )
			throw new SmtpException(r);
		write( text + ".\r\n" );
		r = read();
		if( !r.startsWith("250") )
			throw new SmtpException(r);
		return r;
	}

	private String read() throws IOException {
		int n = reader.read(buf);
		return new String(buf,0,n);
	}

	private void write(String s) throws IOException {
		writer.write(s);
		writer.flush();
	}

	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("smtpcorp.com",2525);
		Smtp smtp = new Smtp(socket);
		smtp.authenticate("smtp@luan.software","luanhost");
		smtp.from("smtp@luan.software");
		smtp.to("fschmidt@gmail.com");
		String text = "\r\n"
			+"test2\r\n"
			+".q\r\n"
			+"x\r\n"
		;
		smtp.data(text);
		smtp.close();
	}
}