view src/goodjava/mail/Smtp.java @ 1583:1cc6c7fa803d

mail work
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 07 Mar 2021 02:22:09 -0700
parents f28cc30d56cb
children d3728e3e5af3
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.Map;
import goodjava.util.GoodUtils;


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 String authenticate(String username,String password) throws IOException, SmtpException {
		String s = "\0" + username + "\0" + password;
		s = GoodUtils.base64Encode(s);
		write( "AUTH PLAIN " + s + "\r\n" );
		String r = read();
		if( !r.startsWith("235") )
			throw new SmtpException(r);
		return r;
	}

	public void send(Message msg) throws IOException, SmtpException {
		for( Map.Entry<String,String> entry : msg.headers.entrySet() ) {
			String name = entry.getKey();
			String value = entry.getValue();
			if( name.equalsIgnoreCase("from") ) {
				from(value);
			}
			if( name.equalsIgnoreCase("to")
				|| name.equalsIgnoreCase("cc")
				|| name.equalsIgnoreCase("bcc")
			) {
				for( String s : value.split(",") ) {
					to(s);
				}
			}
		}
		data( msg.toText() );
	}

	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 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"
			+"test3\r\n"
			+".q\r\n"
			+"x\r\n"
			+"rg; ;lrg dsl rgj errlgerrg neskrjg skrg rdsg drskrg sd;gr s;kgr skrg skrg sdg ds fg;ks gegr erg ;sg sd; g;sdr gsklrg sg s;kkrg s;hg ;slrg ;elrg ;reg r;g ;r g;er g;ler g;e g; g;r g rg; srkd fjl kj kklsjrg lsk gskdf;rs gkrj glj grekjs lksjgkjn kjslg rklrg ;rsd; kj drsg akrglk kalrgklrsdnrgkgj;r ;s ns b;n;sn ;njslk r;n\r\n"
		;
		smtp.data(text);
		smtp.close();
	}
}