⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smtpserverthread.java

📁 基于java的电子邮件群发系统,基于java的电子邮件群发系统
💻 JAVA
字号:
package com.cwq.batchmail.mail;


/*
 * Copyright (c) 1998 Computer Mutter All Rights Reserved.
 */

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

import com.cwq.batchmail.DetailPacket;
import com.cwq.batchmail.log.Logger;
import com.cwq.batchmail.util.NSLookup;


/**
 * Smtp3Connection Every connection to the smtp server is hidden by an
 * SmtpConnection. The server create for every request an Thread and starts an
 * Smtp3Connection class.
 * 
 * (c) 1998 Computer Mutter computer@mutter.com
 */

public class SmtpServerThread extends Thread {

	private Socket pClient;

	private BufferedReader pIn;

	private PrintWriter pOut;

	private String pDomain;

	private String pFrom;

	private Vector pVector;
	
	private NSLookup nsLookup;
	
	private Logger logger = null;

	public Logger getLogger() {
		return logger;
	}

	public void setLogger(Logger logger) {
		this.logger = logger;
	}

	/**
	 * MailConnection constructor comment.
	 */
	public SmtpServerThread(String domain, Socket s, NSLookup nsLookup) {
		super();
		setVector(new Vector());
		setDomain(domain);
		
		this.nsLookup = nsLookup;

		setSocket(s);

		try {
			setInputStream(new BufferedReader(new InputStreamReader(getSocket()
					.getInputStream())));
			setOutputStream(new PrintWriter(new OutputStreamWriter(getSocket()
					.getOutputStream())));
		} catch (Exception exp) {
			handleException(exp);
			try {
				getSocket().close();
			} catch (Exception exp2) {
				return;
			}
		}

		// System.out.println("make connection to " + getSocket());
	}

	/**
	 * This method was created by a SmartGuide.
	 * 
	 * @return boolean
	 * @param adr
	 *            java.lang.String
	 */
	public void cmdDATA() {
		println("354 send the mail data, end with .");

		String input;
		StringBuffer msg = new StringBuffer();
		// msg.setLength(1024*1000);
		try {
			for (;;) {
				input = getInputStream().readLine();
				if (input.equals(".") == true) {
					writeMsg(msg.toString());
					println("250 OK");
					return;
				}
				msg.append(input + "\n");
				// System.out.println("readLine: "+input);
			}
		} catch (Exception exp) {
			handleException(exp);
		}
		return;
	}

	public void run() {
		println("220 Java SMTP Server MailSrv ready.");
		
		//System.out.println("-------segseg---ffffffffffffffffffffff");
		for (;;) {
			String input, command;
			StringTokenizer tokens;

			// System.out.println("read cmd from " + getSocket() );

			try {
				input = getInputStream().readLine();
				if (input == null) {
					break;
				}
				
				tokens = new StringTokenizer(input, " ;");
				try {
					command = tokens.nextToken();
					command = command.toUpperCase();
				} catch (Exception exp) {
					continue;
				}

				if (command.compareTo("DATA") == 0) {
					cmdDATA();
					continue;
				}
				if (command.compareTo("RCPT") == 0) {
					int idx = input.lastIndexOf('<');
					String rcpt = input.substring(idx).replaceAll("<", "").replaceAll(">", "");
					getVector().addElement(rcpt);
					println("250 OK " + rcpt);
					continue;
				}
				if (command.compareTo("MAIL") == 0) {
					int idx = input.lastIndexOf('<');
					String from = input.substring(idx).replaceAll("<", "").replaceAll(">", "");
					setFrom(from);
					println("250 OK " + getFrom());
					continue;
				}
				if (command.compareTo("HELO") == 0) {
					getVector().removeAllElements();
					println("250 MailSrv");
					continue;
				}
				if (command.compareTo("EHLO") == 0) {
					getVector().removeAllElements();
					println("250 MailSrv");
					continue;
				}
				if (command.compareTo("RSET") == 0) {
					getVector().removeAllElements();
					println("250 MailSrv");
					continue;
				}
				if (command.compareTo("AUTH") == 0) {
					getVector().removeAllElements();
					println("250 MailSrv");
					continue;
				}
				if (command.compareTo("QUIT") == 0) {
					println("221 Service closing transmission channel");
					break;
				}

				println("-Err unknown command.");
				//System.out.println("Unknown command: " + command);
			
			} catch (Exception exp) {
				//System.out.println(getSocket() + ": " + exp.toString());
				println(exp.toString());
				break;
			}
		}

		try {
			//System.out.println("ending serverThread: " + getSocket().hashCode());
			getSocket().close();
		} catch (Exception exp) {
			handleException(exp);
		}

	}
	
	// 这里收到信后,链接到每个接收者的邮件服务器,并发送邮件
	// nslookup -qt=mx 163.com
	public void writeMsg(String msg) {
		try {
			
			Iterator<String> rcpts = (Iterator<String>) getVector().iterator();
			SmtpConnection smtpConn = null;
			String smtpMXRecord = null;
			for ( ; rcpts.hasNext(); ) {
				String rcpt = rcpts.next();
				//System.out.println(rcpt);
				
				StringTokenizer tok = new StringTokenizer(rcpt, "<@>");
				String email_f = tok.nextToken(); // email前部分
				String email_e = tok.nextToken(); // email后部分
				
				///*
				try {
					smtpMXRecord = this.nsLookup.getMXRecord(email_e);
					smtpConn = new SmtpConnection(smtpMXRecord, 25);
					smtpConn.debugname = "s2";
					//if(logger != null) logger.info("MXRecord: " + smtpMXRecord);
					//System.out.println("MXRecord: " + smtpMXRecord);
					int state = smtpConn.open(email_f + "@" + email_e, "", false);
					if( state == SmtpConnection.STATE_AUTH_SUCC) {
						state = smtpConn.sendMessage(new Message(
								getFrom(),
								email_f + "@" + email_e,
								DetailPacket.mailContentType,
								DetailPacket.mailSubject,
								DetailPacket.mailBody,
								null
								));
						if( state != SmtpConnection.STATE_SEND_OK) {
							throw new IOException("Send email fail .");
						}
					}
					else {
						throw new IOException("Connection to " + smtpMXRecord + " fail .");
					}
					smtpConn.finalize();
					smtpConn = null;
					//System.out.println("send end.");
				} catch (IOException ex) {
					println(ex.toString());
					if(logger != null) logger.info(ex.getMessage());
				}
				//*/
			}

		} catch (Exception exp) {
			if(logger != null) logger.info(exp.getMessage());
		}
		
	}
	
	
	public void setDomain(String domain) {
		pDomain = domain;
	}

	public void setFrom(String from) {
		pFrom = from;
	}

	public void setInputStream(BufferedReader in) {
		pIn = in;
	}

	public void setOutputStream(PrintWriter out) {
		pOut = out;
	}

	public void setSocket(Socket s) {
		pClient = s;
	}

	public void setVector(Vector v) {
		pVector = v;
	}
	
	public String getDomain() {
		return pDomain.toLowerCase();
	}

	public String getFrom() {
		return pFrom;
	}

	public BufferedReader getInputStream() {
		return pIn;
	}

	public PrintWriter getOutputStream() {
		return pOut;
	}

	public Socket getSocket() {
		return pClient;
	}

	public Vector getVector() {
		return pVector;
	}

	private void handleException(Throwable exp) {
		exp.printStackTrace();
	}

	/**
	 * This method was created in VisualAge.
	 * 
	 * @param str
	 *            java.lang.String
	 */
	private void println(String str) {
		PrintWriter p = getOutputStream();

		p.println(str); // include '\r'
		p.flush();
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -