您的位置:首页 > 编程语言 > Java开发

使用telnet登陆smtp服务发邮件(带身份验证)和Base64加密算法源码(java版)

2007-10-24 09:58 706 查看

转载:使用telnet登陆smtp服务发邮件(带身份验证)。

昨天,公司的合作伙伴新增了一台 FC4 ,(Apache1 + php5 + mysql +exim)的服务器,要把一个PHP程序挂到新增的服务器上,程序在新增的服务器上不能发信,我是使用比较简单的方法 mail() 函数来发信的,配置了 php.ini 里面的 sendmail_path=/usr/sbin/exim -t -i 还是不能发信,请高人指点。无奈之下,打算使用 socket 登陆 smtp 的服务器来发信。经过一个晚上的研究,终于找出了 telnet 登陆带身份认证的SMTP服务器。具体过程如下:
[root@newsclub east]# telnet smtp.163.com 25 //登陆 smtp.163.com 端口号为 25
Trying 202.108.44.205...
Connected to smtp.163.com (202.108.44.205).
Escape character is '^]'.
220 163.com Coremail SMTP(Anti Spam) System
HELO localhost // 与服务器打招呼,并告知客户端使用的机器名字,可以随便填写
250 OK
AUTH LOGIN //使用身份认证登陆指令
334 dXNlcm5hbWU6
cmVkc29zMw== //输入已经base64_encode()过的用户名.
334 UGFzc3dvcmQ6
MbM2MDQ3NQ== //输入已经base64_encode()过的密码
235 Authentication successful
MAIL FROM:<redsos3@163.com> //告诉服务器发信人的地址
250 Mail OK
RCPT TO:<yourframe@21cn.com> //告诉服务器收信人的地址
250 Mail OK
DATA //正面开始传输信件的内容,且最后要以只含有 . 的特殊行结束。
354 End data with <CR><LF>.<CR><LF>
To:yourframe@21cn.com
From:redsos3@163.com
Subject:test mail
From:redsos3@163.com
test body

//结束传输信件
250 Mail OK queued as smtp14,F0CPBFsuzUOvoDwE.41582S2
QUIT //断开连接
221 Bye
Connection closed by foreign host.

状态码说明:
220 : 服务就绪
250 :请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT 指令执行成功会返回此信息)
235 :认证通过
221 :正在处理
354 :开始发送数据,结束以 .(DATA指令执行成功会返回此信息)
500 :语法错误,命令不能识别
550 :命令不能执行,邮箱无效
552 :中断处理:用户超出文件空间
转自:http://2design.spaces.live.com/blog/cns!BCAF80BA63B7B2A3!153.entry

Base64加密算法源码(java版)




public class Base64 ...{




private static final byte[] encodingTable = ...{


(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E',


(byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J',


(byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O',


(byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T',


(byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',


(byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd',


(byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',


(byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n',


(byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's',


(byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x',


(byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2',


(byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',


(byte) '8', (byte) '9', (byte) '+', (byte) '/'


};


private static final byte[] decodingTable;






static ...{


decodingTable = new byte[128];






for (int i = 0; i < 128; i++) ...{


decodingTable[i] = (byte) -1;


}






for (int i = 'A'; i <= 'Z'; i++) ...{


decodingTable[i] = (byte) (i - 'A');


}






for (int i = 'a'; i <= 'z'; i++) ...{


decodingTable[i] = (byte) (i - 'a' + 26);


}






for (int i = '0'; i <= '9'; i++) ...{


decodingTable[i] = (byte) (i - '0' + 52);


}




decodingTable['+'] = 62;


decodingTable['/'] = 63;


}






public static byte[] encode(byte[] data) ...{


byte[] bytes;




int modulus = data.length % 3;






if (modulus == 0) ...{


bytes = new byte[(4 * data.length) / 3];




} else ...{


bytes = new byte[4 * ((data.length / 3) + 1)];


}




int dataLength = (data.length - modulus);


int a1;


int a2;


int a3;






for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) ...{


a1 = data[i] & 0xff;


a2 = data[i + 1] & 0xff;


a3 = data[i + 2] & 0xff;




bytes[j] = encodingTable[(a1 >>> 2) & 0x3f];


bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f];


bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f];


bytes[j + 3] = encodingTable[a3 & 0x3f];


}




int b1;


int b2;


int b3;


int d1;


int d2;






switch (modulus) ...{




case 0: /**//* nothing left to do */


break;




case 1:


d1 = data[data.length - 1] & 0xff;


b1 = (d1 >>> 2) & 0x3f;


b2 = (d1 << 4) & 0x3f;




bytes[bytes.length - 4] = encodingTable[b1];


bytes[bytes.length - 3] = encodingTable[b2];


bytes[bytes.length - 2] = (byte) '=';


bytes[bytes.length - 1] = (byte) '=';




break;




case 2:


d1 = data[data.length - 2] & 0xff;


d2 = data[data.length - 1] & 0xff;




b1 = (d1 >>> 2) & 0x3f;


b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f;


b3 = (d2 << 2) & 0x3f;




bytes[bytes.length - 4] = encodingTable[b1];


bytes[bytes.length - 3] = encodingTable[b2];


bytes[bytes.length - 2] = encodingTable[b3];


bytes[bytes.length - 1] = (byte) '=';




break;


}




return bytes;


}






public static byte[] decode(byte[] data) ...{


byte[] bytes;


byte b1;


byte b2;


byte b3;


byte b4;




data = discardNonBase64Bytes(data);






if (data[data.length - 2] == '=') ...{


bytes = new byte[(((data.length / 4) - 1) * 3) + 1];




} else if (data[data.length - 1] == '=') ...{


bytes = new byte[(((data.length / 4) - 1) * 3) + 2];




} else ...{


bytes = new byte[((data.length / 4) * 3)];


}






for (int i = 0, j = 0; i < (data.length - 4); i += 4, j += 3) ...{


b1 = decodingTable[data[i]];


b2 = decodingTable[data[i + 1]];


b3 = decodingTable[data[i + 2]];


b4 = decodingTable[data[i + 3]];




bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));


bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));


bytes[j + 2] = (byte) ((b3 << 6) | b4);


}






if (data[data.length - 2] == '=') ...{


b1 = decodingTable[data[data.length - 4]];


b2 = decodingTable[data[data.length - 3]];




bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));




} else if (data[data.length - 1] == '=') ...{


b1 = decodingTable[data[data.length - 4]];


b2 = decodingTable[data[data.length - 3]];


b3 = decodingTable[data[data.length - 2]];




bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));


bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));




} else ...{


b1 = decodingTable[data[data.length - 4]];


b2 = decodingTable[data[data.length - 3]];


b3 = decodingTable[data[data.length - 2]];


b4 = decodingTable[data[data.length - 1]];




bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));


bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));


bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);


}




return bytes;


}






public static byte[] decode(String data) ...{


byte[] bytes;


byte b1;


byte b2;


byte b3;


byte b4;




data = discardNonBase64Chars(data);






if (data.charAt(data.length() - 2) == '=') ...{


bytes = new byte[(((data.length() / 4) - 1) * 3) + 1];




} else if (data.charAt(data.length() - 1) == '=') ...{


bytes = new byte[(((data.length() / 4) - 1) * 3) + 2];




} else ...{


bytes = new byte[((data.length() / 4) * 3)];


}






for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) ...{


b1 = decodingTable[data.charAt(i)];


b2 = decodingTable[data.charAt(i + 1)];


b3 = decodingTable[data.charAt(i + 2)];


b4 = decodingTable[data.charAt(i + 3)];




bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));


bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));


bytes[j + 2] = (byte) ((b3 << 6) | b4);


}






if (data.charAt(data.length() - 2) == '=') ...{


b1 = decodingTable[data.charAt(data.length() - 4)];


b2 = decodingTable[data.charAt(data.length() - 3)];




bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));




} else if (data.charAt(data.length() - 1) == '=') ...{


b1 = decodingTable[data.charAt(data.length() - 4)];


b2 = decodingTable[data.charAt(data.length() - 3)];


b3 = decodingTable[data.charAt(data.length() - 2)];




bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));


bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));




} else ...{


b1 = decodingTable[data.charAt(data.length() - 4)];


b2 = decodingTable[data.charAt(data.length() - 3)];


b3 = decodingTable[data.charAt(data.length() - 2)];


b4 = decodingTable[data.charAt(data.length() - 1)];




bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));


bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));


bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);


}




return bytes;


}






private static byte[] discardNonBase64Bytes(byte[] data) ...{


byte[] temp = new byte[data.length];


int bytesCopied = 0;






for (int i = 0; i < data.length; i++) ...{




if (isValidBase64Byte(data[i])) ...{


temp[bytesCopied++] = data[i];


}


}




byte[] newData = new byte[bytesCopied];




System.arraycopy(temp, 0, newData, 0, bytesCopied);




return newData;


}






private static String discardNonBase64Chars(String data) ...{


StringBuffer sb = new StringBuffer();




int length = data.length();






for (int i = 0; i < length; i++) ...{




if (isValidBase64Byte((byte) (data.charAt(i)))) ...{


sb.append(data.charAt(i));


}


}




return sb.toString();


}






private static boolean isValidBase64Byte(byte b) ...{




if (b == '=') ...{


return true;




} else if ((b < 0) || (b >= 128)) ...{


return false;




} else if (decodingTable[b] == -1) ...{


return false;


}




return true;


}






public static void main(String[] args) ...{


String data = "1";


byte[] result = Base64.encode(data.getBytes());


System.out.println(data);


System.out.println(new String(result));


System.out.println(new String(Base64.decode(new String(result))));


}


}





转自:http://blog.csdn.net/zyg158/archive/2007/06/26/1667531.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: