JavaMail API 是一个用于阅读、编写和发送电子消息的可选包(标准扩展),可以用来建立基于标准的电子邮件客户机,它配置了各种因特网邮件协,包括 SMTP 、 POP 、 IMAP 和 MIME ,还包括相关的 NNTP 、 S/MIME 及其它协议。通常开发 JavaMail 程序还需要有 Sun 的 JavaBeans Activation Framework ( JAF )。 JavaBeans Activation Framework 的运行很复杂,这里简单的说就是 JavaMail 的运行必须得依赖于它的支持,比如 JavaMail 利用 JavaBeans Activation Framework 来处理 MIME 编码的邮件附件。 JavaMail 接口包含在 javax.mail 及其子包中, JavaBeans Activation Framework 接口包含在 javax.activation 包中, JAF 规范是 "Glasgow" JavaBeans 规范的一部分,关于 JAF 的更多细节,请参考 JAF 指南:
http://java.sun.com/beans/glasgow/jaf.html
核心JavaMail API 由七个类组成:Session 、Message 、Address 、Authenticator 、Transport 、Store 及 Folder ,它们都来自javax.mail 、即JavaMail API 顶级包。可以用这些类完成大量常见的电子邮件任务,包括发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML文件格式的消息以及搜索或过滤邮件列表。有关JavaMail 的更多信息,请参考JavaMail 指南:
http://java.sun.com/products/javamail/
类似的用javamail实现的sendmail程序,网上有很多。但笔者发现大都有一点问题。我的code在下面。调式前请确定您的机子已经安装好JDK1.4 javamial1.3.2 和JAF。如果没有安装请按如下步骤安装:
1 从www.java.sun.com 网站上获取最新的JDK。然后设置java环境变量。
如果是Win95/98,在/autoexec.bat的最后面添加如下3行语句:
JAVA_HOME=c:/j2sdk1.4.2
PATH=%JAVA_HOME%/bin;%PATH%
CLASSPATH=.;%JAVA_HOME%/lib
看好了CLASSPATH中第一个“.”,这个代表当前目录,很多人HelloWorld没有运行起来大多是这个原因。
如果是Win2000或者XP,使用鼠标右击“我的电脑”->属性->高级->环境变量
系统变量->新建->变量名:JAVA_HOME 变量值:c:/j2sdk1.4.2
系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%/bin;
系统变量->新建->变量名:CLASSPATH 变量值:.;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar;
CLASSPATH前面的那个"."和上面的意义是一样的。
请调式一个helloworld来验证安装是否成功?
2 http://java.sun.com/products/javamail/ 下载最新的javamail。
set CLASSPATH=%CLASSPATH%;c:/download/javamail-1.3.2/mail.jar;.
3 http://java.sun.com/products/javabeans/glasgow/jaf.html下载JAF 。
set CLASSPATH=%CLASSPATH%;c:/download/activation/activation.jar
4 ok。终于可以先喘口气了。 接下来开始程序部分。把if(themail.setTo("########") == false) return;中的#####号改为你自己的邮箱。 再把if(themail.addFileAffix("#######") == false) return; 中#####写为本地的一个文件路径。也可空着。为了更多的人学习,请大家不要修改sendMail@163.com 密码:sendcode 本邮箱只在程序测试中使用!!
然后,在DOS中
javac sendMail.java
java sendMail
呵呵 成功!!!我的主机DOS显示
D:/>java sendMail
设置系统属性:mail.smtp.host = smtp.163.com
准备获取邮件会话对象!
准备创建MIME邮件对象!
设置smtp身份认证:mail.smtp.auth = true
设置邮件主题!
设置邮件体格式
设置收信人
设置发信人!
增加邮件附件:D:/sendMail.java
程序得到用户名与密码
正在发送邮件....
发送邮件成功!
*************************************************************************
/**
* @author kangkang
* http://corncc.ikdiy.com
* 2005.4.14
*/
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Date;
import javax.activation.*;
import java.io.*;
public class sendMail
{
// 21-30行把本程序所用变量进行定义。 具体在main中对它们赋植。
private MimeMessage mimeMsg; //MIME邮件对象
private Session session; //邮件会话对象
private Properties props; //系统属性
private boolean needAuth = false; //smtp是否需要认证
private String username = ""; //smtp认证用户名和密码
private String password = "";
private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成//MimeMessage对象
public sendMail(String smtp)
{
setSmtpHost(smtp);
createMimeMessage();
}
/**
* @param hostName String
*/
public void setSmtpHost(String hostName)
{
System.out.println("设置系统属性:mail.smtp.host = "+hostName);
if(props == null)props = System.getProperties(); //获得系统属性对象
props.put("mail.smtp.host",hostName); //设置SMTP主机
}
/**
* @return boolean
*/
public boolean createMimeMessage()
{
try{
System.out.println("准备获取邮件会话对象!");
session = Session.getDefaultInstance(props,null); //获得邮件会话对象
}
catch(Exception e)
{
System.err.println("获取邮件会话对象时发生错误!"+e);
return false;
}
System.out.println("准备创建MIME邮件对象!");
try{
mimeMsg = new MimeMessage(session); //创建MIME邮件对象
mp = new MimeMultipart(); //mp 一个multipart对象
//Multipart is a container that holds multiple body parts.
return true;
}
catch(Exception e)
{
System.err.println("创建MIME邮件对象失败!"+e);
return false;
}
}
/**
* @param need boolean
*/
public void setNeedAuth(boolean need) {
System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);
if(props == null)props = System.getProperties();
if(need){
props.put("mail.smtp.auth","true");
}else{
props.put("mail.smtp.auth","false");
}
}
/**
* @param name String
* @param pass String
*/
public void setNamePass(String name,String pass)
{
System.out.println("程序得到用户名与密码");
username = name;
password = pass;
}
/**
* @param mailSubject String
* @return boolean
*/
public boolean setSubject(String mailSubject) {
System.out.println("设置邮件主题!");
try{
mimeMsg.setSubject(mailSubject);
return true;
}
catch(Exception e) {
System.err.println("设置邮件主题发生错误!");
return false;
}
}
/**
* @param mailBody String
*/
public boolean setBody(String mailBody)
{
try
{
System.out.println("设置邮件体格式");
BodyPart bp = new MimeBodyPart();
bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"
+mailBody,"text/html;charset=GB2312");
mp.addBodyPart(bp);
return true;
}
catch(Exception e)
{
System.err.println("设置邮件正文时发生错误!"+e);
return false;
}
}
/**
* @param name String
* @param pass String
*/
public boolean addFileAffix(String filename) {
System.out.println("增加邮件附件:"+filename);
try{
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(filename);
bp.setDataHandler(new DataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
return true;
}
catch(Exception e){
System.err.println("增加邮件附件:"+filename+"发生错误!"+e);
return false;
}
}
/**
* @param name String
* @param pass String
*/
public boolean setFrom(String from) {
System.out.println("设置发信人!");
try{
mimeMsg.setFrom(new InternetAddress(from)); //设置发信人
return true;
}
catch(Exception e)
{ return false; }
}
/**
* @param name String
* @param pass String
*/
public boolean setTo(String to)
{
System.out.println("设置收信人");
if(to == null)return false;
try
{
mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
return true;
}
catch(Exception e)
{ return false; }
}
/**
* @param name String
* @param pass String
*/
public boolean setCopyTo(String copyto)
{
System.out.println("发送附件到");
if(copyto == null)return false;
try{
mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));
return true;
}
catch(Exception e)
{ return false; }
}
/**
* @param name String
* @param pass String
*/
public boolean sendout()
{
try
{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在发送邮件....");
Session mailSession = Session.getInstance(props,null);
Transport transport = mailSession.getTransport("smtp"); //???
transport.connect((String)props.get("mail.smtp.host"),username,password);
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
//transport.send(mimeMsg);
System.out.println("发送邮件成功!");
transport.close();
return true;
}
catch(Exception e)
{
System.err.println("邮件发送失败!"+e);
return false;
}
}
/**
* Just do it as this
*/
public static void main(String[] args)
{
String mailbody = "hello. This is a testing.";
sendMail themail = new sendMail("smtp.163.com");
themail.setNeedAuth(true);
if(themail.setSubject("dkjjf") == false) return;
if(themail.setBody(mailbody) == false) return;
if(themail.setTo("########") == false) return;
if(themail.setFrom("senfMail@163.com") == false) return;
if(themail.addFileAffix("#######") == false) return; //附件在本地机子上的绝对路径
themail.setNamePass("sendMail","javacode"); //用户名与密码
if(themail.sendout() == false) return;
}
}
*************************************************************************
TIPS:
A程序前部只是一个抽象的定义。在main函数中给出了具体的参数。
B 好好利用System.out.println观察程序的执行过程。
C 阅读javamaill/docs/javadocs/index.html