import java.util.StringTokenizer;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.swing.JOptionPane;
public class MyAuthenticator extends Authenticator{
String username = null;
String password = null;
// 通过MyAuthenticator类的构造方法接受外部传入的用户信息
public MyAuthenticator (String user, String pass) {
username = user;
password = pass;
}
//覆盖Authenticator类中的getPasswordAuthentication方法
public PasswordAuthentication getPasswordAuthentication() {
String username ,password;
String result =
JOptionPane.showInputDialog("请输入用户名和密码,中间用‘,’分割");
StringTokenizer st = new StringTokenizer(result, ",");
username = st.nextToken();
password = st.nextToken();
//使用外部传入的用户名和密码创建PasswordAuthentication对象
return new PasswordAuthentication(username, password);
}
}
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class AuthenticatorDemo {
public static void main(String[] args) throws Exception {
String smtpServer = "smtp.sina.com"; //邮件服务器主机名
String protocol = "smtp"; //邮件传输协议
String username = "xxxxxxxxxxxx"; //登录用户名
String password = "xxxxxxxxxxxx用授权码代替密码";
String from = "xxxxxxxxxxx@sina.com";
String to = "xxxxxxxxx@qq.com";
String subject = "authenticator demo"; //邮件主题
String body = "authenticator demo"; //邮件内容
//创建Session对象
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol);
props.setProperty("mail.host", smtpServer);
props.put("mail.smtp.auth", "true");
MyAuthenticator authenticator = new MyAuthenticator(username, password);
Session session = Session.getInstance(props,authenticator);
/*使用Authenticator类向邮件服务器提交认证信息可以提高程序的可扩展性,使程序的认证方式变的
* 更加灵活,应用程序可以用过查询数据库,或者弹出认证对话框,甚至从一个加密的文件中读取
* 用户的认证信息,当应用程序的开发者想改变程序的认证信息获取方式时,只需要重新编写一个Authenticator
* 类的子类,并将子类的实例对象注册到Session对象中即可。实际上是设计模式策略,主程序将获取用户认证的
* 信息的方式委托给了另外一个对象来完成,当获取用户认证信息的方式发生改变时,不用修改主程序,只需要
* 编写一个新的策略对象
*/
session.setDebug(true);
//创建代表邮件的MimeMessage对象
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setSentDate(new Date());
msg.setSubject(subject);
msg.setText(body);
//保存并生成最终的邮件内容
msg.saveChanges();
/*由于Session对象中注册了Authenticator对象,
* 从Authenticator对象中可以获得用户认证信息,所以,这里可以直接调用
* Transport类的静态send方法发送邮件
*/
Transport.send(msg);
/*也可以使用下面的代码先获得Transport对象后,在使用无参数的connect方法连接邮件服务器和发送邮件
*
*/
// Transport transport = session.getTransport();
// transport.connect();
// transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
// transport.close();
}
}