📄 mailmanager.java
字号:
// 儊乕儖憲庴怣僾儘僌儔儉MMGui.java梡僼傽僀儖MailManager.java
// 偙偺僼傽僀儖偵偼,儊乕儖偺憲庴怣婡擻傪幚尰偡傞僋儔僗偑奿擺偝傟偰偄傑偡
// MMGui.java偺僐儞僷僀儖偵偼,MailManager.java僼傽僀儖偑昁梫偱偡
// 儔僀僽儔儕偺棙梡
import java.util.*;
import java.io.*;
import java.net.*;
// MailManager僋儔僗
public class MailManager {
// MailManager偺婡擻傪娔帇偡傞debug婡擻傪巊偆応崌偵偼
// 曄悢debug傪true偵僙僢僩偟偰偔偩偝偄
static boolean debug = true;
// 儊乕儖憲庴怣偵昁梫側僆僽僕僃僋僩偺愰尵
Properties property;
String home;
String cf;
File mailDir;
String fsep;
String username;
String password;
String fromString;
String popServ;
String smtpServ;
boolean keepmail = false;
String codeNet;
String codeFile;
int lastMail_NO = 0;
// 僐儞僗僩儔僋僞
// 僒乕僶偺愝掕傗儐乕僓柤偺愝掕側偳,儊乕儖僋儔僀傾儞僩偱昁梫偲側傞
// 奺庬偺愝掕傪峴偄傑偡
public MailManager ()
{
Properties prop = System.getProperties();
home = prop.getProperty("user.home");
fsep = prop.getProperty("file.separator");
cf = home + fsep + "jet.cf";
property = new Properties();
try {
property.load(new FileInputStream(cf));
}catch (FileNotFoundException ex){
System.err.println("file not found:" + cf);
System.exit(1);
}catch (IOException ex){
ex.printStackTrace();
System.exit(1);
}
username = property.getProperty("username");
password = property.getProperty("password");
popServ = property.getProperty("popserver");
smtpServ = property.getProperty("smtpserver");
fromString = property.getProperty("from");
if (fromString == null){
fromString = username + "@" + popServ;
}
String dummy = property.getProperty("keepmail");
keepmail =
((dummy == null)? false:
(("off".equalsIgnoreCase(dummy))? false: true));
codeNet = property.getProperty("code.net", "JIS");
codeFile = property.getProperty("code.file", "SJIS");
String propMailDir = property.getProperty("maildir");
mailDir = new File(propMailDir);
if (!mailDir.isAbsolute()){
mailDir = new File(home + fsep + propMailDir);
}
if (mailDir.exists()){
if (!mailDir.isDirectory()){
System.err.println("not a directory:"
+ mailDir.toString());
System.exit(1);
}
}else{
System.err.println("not found mail directory:"
+ mailDir.toString());
System.err.println("and create it.");
mailDir.mkdir();
}
String[] files = mailDir.list();
for (int i = 0; i < files.length; i++){
try {
int num = Integer.parseInt(files[i]);
if (lastMail_NO < num){
lastMail_NO = num;
}
}catch (NumberFormatException ex){
;
}
}
}
// list儊僜僢僪
// 庴怣嵪傒偺儊乕儖堦棗傪昞帵偟傑偡
public String[] list(){
Vector v = new Vector();
for (int i = 1; i <= lastMail_NO; i++){
try {
if (debug){
System.out.println("MM.list: scan file " + i);
}
Mail mail = new Mail(i);
String space10 = " ";
String from = mail.from + space10 + space10;
from = from.substring(0, 20);
String subject =
mail.subject + space10 + space10 + space10 + space10;
subject = subject.substring(0, 40);
String num = i + space10;
v.addElement(
num.substring(0, 8) + "[" + from + "]" + subject);
}catch (FileNotFoundException ex){
}
}
String[] res = new String[v.size()];
v.copyInto(res);
return res;
}
// readMail儊僜僢僪
// 儊僢僙乕僕偺杮暥傪曉偟傑偡
public String readMail(int i){
try {
Mail mail = new Mail(i);
return mail.message;
}catch (FileNotFoundException ex){
return null;
}
}
// sendmail儊僜僢僪
// SmtpClient僋儔僗偺僆僽僕僃僋僩傪巊偭偰儊乕儖傪憲怣偟傑偡
public void sendmail(
String to, String subject, String message){
SmtpClient smtp = new SmtpClient(smtpServ, codeNet);
String[] dummy = new String[1];
dummy[0] = to;
smtp.sendmail(fromString, dummy, subject, message);
}
// getmail儊僜僢僪
// PopClient僋儔僗偺僆僽僕僃僋僩傪巊偭偰pop 僒乕僶偐傜儊乕儖傪庴怣偟傑偡
public int getmail(){
int n = 0;
PopClient pop = new PopClient(popServ, username, password,
codeNet);
pop.login();
String res = pop.stat();
StringTokenizer st = new StringTokenizer(res);
if ("+OK".equals(st.nextToken())){
n = Integer.parseInt(st.nextToken());
for (int i = 1; i <= n; i++){
try {
new Mail(pop.retr(i));
if (!keepmail){
pop.dele(i);
}
}catch (IOException ex){
ex.printStackTrace();
System.exit(1);
}
}
}
pop.quit();
return n;
}
// Mail僋儔僗
// 儊乕儖娗棟偺偨傔偺婡擻傪採嫙偟傑偡
public class Mail {
String message;
String subject;
String to;
String from;
String replyto;
File file;
// 僐儞僗僩儔僋僞
// 儊僢僙乕僕傪堷悢偲偟偰Mail僋儔僗偺僆僽僕僃僋僩傪嶌惉偟傑偡
// pop3 僒乕僶偐傜庴怣偟偨儊僢僙乕僕偺張棟偵巊偄傑偡
Mail(String msg) throws IOException{
message = msg;
lastMail_NO++;
file = new File(mailDir.getPath() + fsep +
lastMail_NO);
PrintWriter mail =
new PrintWriter(new OutputStreamWriter
(new FileOutputStream(file), codeFile));
mail.print(msg);
mail.flush();
mail.close();
parse();
}
// 僐儞僗僩儔僋僞
// 庴怣嵪傒僼傽僀儖偵懳墳偡傞斣崋傪堷悢偲偟偰
// Mail僋儔僗偺僆僽僕僃僋僩傪嶌惉偟傑偡
Mail(int i) throws FileNotFoundException{
try {
file = new File(mailDir.getPath() + fsep + i);
InputStreamReader mailIn =
new InputStreamReader(new FileInputStream(file),
codeFile);
char[] cbuf = new char[1024];
StringBuffer sb = new StringBuffer();
while (true){
int n = mailIn.read(cbuf, 0, 1024);
if (n == -1){
break;
}
sb.append(cbuf, 0, n);
}
message = sb.toString();
}catch (IOException ex){
if (ex instanceof FileNotFoundException){
throw (FileNotFoundException) ex;
}else{
ex.printStackTrace();
System.exit(1);
}
}
parse();
}
// parse儊僜僢僪
// parseHeader儊僜僢僪傪梡偄偰儊僢僙乕僕偺僿僢僟傪夝愅偟傑偡
void parse(){
from = parseHeader("From:");
to = parseHeader("To:");
subject = parseHeader("Subject:");
replyto = parseHeader("Reply-To:");
}
// parseHeader儊僜僢僪
// 儊僢僙乕僕偺拞偐傜巜掕偝傟偨僿僢僟偺忣曬傪扵偟弌偟傑偡
String parseHeader(String header){
int begin = 0;
int end = 0;
for (end = message.indexOf("\n", begin); end >= 0 &&
begin >= 0; begin = end + 1, end
= message.indexOf("\n", begin)){
String line = message.substring(begin, end);
if ("".equals(line)){
break;
}
if (line.startsWith(header))
return line.substring(header.length());
}
return null;
}
}
}
// NetClient僋儔僗
// SmtpClient僋儔僗偲PopClient僋儔僗偺嫟捠晹暘傪梌偊傑偡
class NetClient {
static boolean debug = MailManager.debug;
Socket s;
BufferedReader from_server;
PrintWriter to_server;
String encode = "JIS";
// 僐儞僗僩儔僋僞
// 暥帤僐乕僪傪巜掕偡傞応崌
NetClient(String enc){
encode = enc;
if (debug) {
System.out.println("NetClient.encode:" + encode);
}
}
// 僐儞僗僩儔僋僞
// 暥帤僐乕僪偑僨僼僅儖僩偺応崌
NetClient(){
this("JIS");
}
// connect儊僜僢僪
// 僒乕僶偲偺愙懕梡僜働僢僩偲僗僩儕乕儉傪嶌惉偟傑偡
public void connect(String server, int port){
try {
s = new Socket(server, port);
from_server = new BufferedReader(
new InputStreamReader(s.getInputStream(),encode));
to_server = new PrintWriter(
new OutputStreamWriter(s.getOutputStream(),encode));
}catch (IOException e){
e.printStackTrace();
System.exit(1);
}
}
// disconnect儊僜僢僪
// 僒乕僶偲偺愙懕傪愗抐偟傑偡
public void disconnect(){
try {
s.close();
}catch (IOException e){
e.printStackTrace();
System.exit(1);
}
}
// receive儊僜僢僪
// 僒乕僶偐傜峴傪撉傒庢傝傑偡
public String receive(){
String res = null;
try {
res = from_server.readLine();
if (debug) {
System.out.println("RECV> " + res);
}
}catch (IOException e){
e.printStackTrace();
System.exit(1);
}
return res;
}
// send儊僜僢僪
// 僒乕僶偵侾峴僨乕僞傪憲傝傑偡
public void send(String msg){
to_server.println(msg);
to_server.flush();
if (debug) {
System.out.println("SEND> " + msg);
}
}
}
// PopClient僋儔僗
// NetClient傪宲彸偟偰,Pop3 庴怣婡擻傪幚尰偟傑偡
class PopClient extends NetClient{
static final int POP3_PORT = 110;
String server;
String username;
String password;
boolean loginFlag = false;
// 僐儞僗僩儔僋僞
// 庴怣偵昁梫側忣曬傪僙僢僩偟傑偡
PopClient(String serv, String user, String pass, String enc){
super(enc);
username = user;
password = pass;
server = serv;
}
// login儊僜僢僪
// POP3 僒乕僶偵login偟傑偡
public boolean login(){
if (loginFlag)
return loginFlag;
connect(server, POP3_PORT);
String res = receive();
if (res.startsWith("-ERR")){
System.err.println("connect failed.:" + res);
disconnect();
return false;
}
send("user " + username);
res = receive();
if (res.startsWith("-ERR")){
System.err.println("login user failed.:" + res);
disconnect();
return false;
}
send("pass " + password);
res = receive();
if (res.startsWith("-ERR")){
System.err.println("login pass failed.:" + res);
disconnect();
return false;
}
return loginFlag = true;
}
// stat儊僜僢僪
// 僒乕僶偵stat僐儅儞僪傪憲晅偟傑偡
public String stat(){
send("stat");
String res = "";
res = receive();
if (res.startsWith("-ERR")){
System.err.println(res);
}
return res;
}
// list儊僜僢僪
// 僒乕僶偵list僐儅儞僪傪憲晅偟傑偡
public String list(){
String res = "";
send("list");
String line = receive();
if (line.startsWith("-ERR")){
System.err.println(line);
res = line;
}else{
while (true){
line = receive();
if (".".equals(line)){
break;
}
res += line + "\n";
}
}
return res;
}
// retr儊僜僢僪
// 僒乕僶偵retr僐儅儞僪傪憲晅偟傑偡
public String retr(int i){
String res = "";
send("retr " + i);
String line = receive();
if (line.startsWith("-ERR")){
System.err.println(line);
res = line;
}else{
while (true){
line = receive();
if (".".equals(line)){
break;
}
res += line + "\n";
}
}
return res;
}
// dele儊僜僢僪
// 僒乕僶偵dele僐儅儞僪傪憲晅偟傑偡
public String dele(int i){
send("dele " + i);
String res = receive();
if (res.startsWith("-ERR")){
System.err.println(res);
}
return res;
}
// quit儊僜僢僪
// 僒乕僶偵quit僐儅儞僪傪憲晅偟傑偡
public void quit(){
if (loginFlag){
send("quit");
loginFlag = false;
}
}
}
// SmtpClient僋儔僗
// NetClient傪宲彸偟偰,SMTP 庴怣婡擻傪幚尰偟傑偡
class SmtpClient extends NetClient{
int SMTP_PORT = 25;
String server;
// 僐儞僗僩儔僋僞
SmtpClient(String serv, String enc){
super(enc);
server = serv;
}
// sendCommandAndResultCheck儊僜僢僪
// 僒乕僶偵僐儅儞僪傪憲晅偟,偦偺寢壥傪resultCheck儊僜僢僪偱僠僃僢僋偟傑偡
void sendCommandAndResultCheck(String command, int successCode){
send(command);
resultCheck(successCode);
}
// resultCheck儊僜僢僪
// 僒乕僶偐傜偺曉摎僐乕僪傪夝愅偟,僄儔乕側傜捠怣傪廔椆偟傑偡
void resultCheck(int successCode){
String res = receive();
if (Integer.parseInt(res.substring(0,3)) != successCode){
disconnect();
throw new RuntimeException(res);
}
}
// sendmail儊僜僢僪
// SMTP傪梡偄偰,僒乕僶偵儊僢僙乕僕傪憲怣偟傑偡
public void sendmail(String from, String[] to,
String subject, String message){
// CONNECT
connect(server, SMTP_PORT);
resultCheck(220);
// HELO
try {
String myname = InetAddress.getLocalHost().getHostName();
sendCommandAndResultCheck("HELO " + myname, 250);
}catch (UnknownHostException ex){
ex.printStackTrace();
System.exit(1);
}
// MAIL FROM
sendCommandAndResultCheck("MAIL FROM: " + from, 250);
// RCPT TO
for (int i = 0; i < to.length; i++){
sendCommandAndResultCheck("RCPT TO: " + to[i], 250);
}
// DATA
sendCommandAndResultCheck("DATA", 354);
send("Subject: " + subject);
send("From: " + from);
String toString = to[0];
for (int i = 1; i < to.length; i++){
toString += "," + to[i];
}
send("To: " + toString);
send("");
send(message);
send(".");
resultCheck(250);
// QUIT
sendCommandAndResultCheck("QUIT", 221);
// CLOSE
disconnect();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -