有了Mail的理论基础,就可以更容易的理解JavaMail的API了,也能使编写邮件程序时思路清晰。如果要自己动手写程序发送和接收邮件,可以直接采用Socket编程连接远程邮件服务器,然后按收发邮件的协议进行网络通讯就可以了。但是如果是想创建复杂的MIME格式的邮件,则是一件非常复杂的事。JavaMail API不仅封装了与邮件协议相关的底层细节,而且还能够创建简单的创建出各种复杂的MIME格式的邮件。因此,有了JavaMail这套标准,编写邮件程序也和写普通的JAVA程序一样了。
JavaMail API按功能分主要有三大类:一是创建和解析邮件内容的API,即Message类,它是创建和解析邮件的核心API,它的实例对象就代表一封电子邮件。二是发送邮件的Transport类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象。第三个就是接受邮件的API,即Store类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象。另外一个比较重要的类就是Session,它用于定义整个应用程序所需要的环境信息,收集客户端和邮件服务器建立的网络连接的信息。需要注意的是,在使用JavaMail生成邮件时,JavaMail调用了第三方的类库JAF。所谓JFA(JavaBeans Activation Framework)即是JavaBeans激活框架的简称,它是一个专用的数据处理框架,用于封装数据,并为应用程序提供访问和操作数据的接口。JavaMail API可以利用JFA从某种数据源中读取数据和获取数据的MIME类型,并用这些数据生成MIME消息中的消息体和消息类型。接下来的视频中,张老师通过API文档讲述了创建邮件的思路,并写了一个实例:
public static void main(String[] args) throws Exception{
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);
session.setDebug(true);
Message msg = new MimeMessage(session);
msg.setText("你好!");
msg.setFrom(new InternetAddress("test@sina.com"));
Transport transport = session.getTransport();
transport.connect("smtp.sina.com", 25, "test", "123456");
transport.sendMessage(msg, new Address[]{new InternetAddress("test@sohu.com")});
transport.close();
}
正如上面的代码所示,这是发一封简单的邮件给sohu上的test账户,发件人是sina上的test账户(实际写的时候换成真实的收发账户)。代码分三个步骤,首先是创建一个Session,创建Session需要一些环境信息,比如是否需要验证,使用的协议等等。这些信息是通过Properties对象传递进去的。代码中的session.setDebug(true)表示把应用程序发送邮件的全过程打印在控制台上。第二步就是生成一封简单内容的邮件,直接将Session对象传给生成的MimeMessage邮件对象。可以在邮件中设置发件人,主题等等。示例中演示的是一封简单邮件,也就是只含有一段纯文本,所以可以直接调用Message对象的setText方法设置文本内容。第三步就是获取发送邮件的对象,让后把第二步生成的简单邮件发出去。可以通过Session对象的getTransport方法得到发送邮件的Transport对象。然后用Transport对象连接邮件服务器(提供必要的参数,如域名、端口、用户名、密码等)。最后就调用Transport对象的sendMessage对象将邮件发送到目的地。在这里需要注意的是,第三步发送邮件的过程中,如果没有提供收件人的地址的参数,JavaMail API将到Message对象中去查找,如果没有提供邮件服务器的域名和端口,就会到Properties对象中去找。所以JavaMail API自身时相当灵活的。最后不要忘了关闭Transport。由于JavaMail API的灵活性,下面再演示另外一种发送邮件的方法:
public static void main(String[] args) throws Exception{
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.sina.com");
Session session = Session.getInstance(props,
new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("test","123456");
}
}
);
session.setDebug(true);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("itcast_xxx@sina.com"));
msg.setSubject("中文主题");
msg.setRecipients(RecipientType.TO,
InternetAddress.parse("itcast_test@sina.com,itcast_test@sohu.com"));
msg.setContent("<span style='color:red'>中文呵呵</span>", "text/html;charset=gbk");
Transport.send(msg);
//Message msg = new MimeMessage(session,new FileInputStream("...//xxx.eml"));
//Transport.send(msg,InternetAddress.parse("test@sohu.com"));
}
上面的代码就是使用Message类中的静态方法send发送邮件。该静态方法在内部连接邮件服务器,发送邮件和关闭Transport。因为是在静态方法内部做完上一种方式的三个步骤,所以那些需要的参数就只能在外部属性对象配置,或者从Message对象中查找了。与上一种方法相比,需要多配置一个邮件服务器的主机域名,另外一个比较重要的是用户名和密码的传递方式。它是通过在创建Session对象的实例的时候传递一个包装有用户名和密码的Authenticator对象来实现的。代码中是使用匿名内部类实现的。添加了主机,用户名和密码,剩下一个就是收件人了。通过在Message对象中指定,收件人类型以及收件人地址,Transport的静态send方法就能找到收件人的邮件服务器了。这次代码中的邮件正文就不是普通文本了,而是html格式的文本。所以设置内容的时候就需要制定内容的类型和使用的字符集,避免出现解析错误或者乱码。被注释掉的代码是把本地一封写好的邮件发送出去,这也可以算是第三种发简单邮件的方式吧。总的来说,这套JavaMail的API还是相当灵活的,这里只是用到了创建简单邮件,复杂邮件的创建方式稍后介绍。
JavaMail API按功能分主要有三大类:一是创建和解析邮件内容的API,即Message类,它是创建和解析邮件的核心API,它的实例对象就代表一封电子邮件。二是发送邮件的Transport类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象。第三个就是接受邮件的API,即Store类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象。另外一个比较重要的类就是Session,它用于定义整个应用程序所需要的环境信息,收集客户端和邮件服务器建立的网络连接的信息。需要注意的是,在使用JavaMail生成邮件时,JavaMail调用了第三方的类库JAF。所谓JFA(JavaBeans Activation Framework)即是JavaBeans激活框架的简称,它是一个专用的数据处理框架,用于封装数据,并为应用程序提供访问和操作数据的接口。JavaMail API可以利用JFA从某种数据源中读取数据和获取数据的MIME类型,并用这些数据生成MIME消息中的消息体和消息类型。接下来的视频中,张老师通过API文档讲述了创建邮件的思路,并写了一个实例:
public static void main(String[] args) throws Exception{
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);
session.setDebug(true);
Message msg = new MimeMessage(session);
msg.setText("你好!");
msg.setFrom(new InternetAddress("test@sina.com"));
Transport transport = session.getTransport();
transport.connect("smtp.sina.com", 25, "test", "123456");
transport.sendMessage(msg, new Address[]{new InternetAddress("test@sohu.com")});
transport.close();
}
正如上面的代码所示,这是发一封简单的邮件给sohu上的test账户,发件人是sina上的test账户(实际写的时候换成真实的收发账户)。代码分三个步骤,首先是创建一个Session,创建Session需要一些环境信息,比如是否需要验证,使用的协议等等。这些信息是通过Properties对象传递进去的。代码中的session.setDebug(true)表示把应用程序发送邮件的全过程打印在控制台上。第二步就是生成一封简单内容的邮件,直接将Session对象传给生成的MimeMessage邮件对象。可以在邮件中设置发件人,主题等等。示例中演示的是一封简单邮件,也就是只含有一段纯文本,所以可以直接调用Message对象的setText方法设置文本内容。第三步就是获取发送邮件的对象,让后把第二步生成的简单邮件发出去。可以通过Session对象的getTransport方法得到发送邮件的Transport对象。然后用Transport对象连接邮件服务器(提供必要的参数,如域名、端口、用户名、密码等)。最后就调用Transport对象的sendMessage对象将邮件发送到目的地。在这里需要注意的是,第三步发送邮件的过程中,如果没有提供收件人的地址的参数,JavaMail API将到Message对象中去查找,如果没有提供邮件服务器的域名和端口,就会到Properties对象中去找。所以JavaMail API自身时相当灵活的。最后不要忘了关闭Transport。由于JavaMail API的灵活性,下面再演示另外一种发送邮件的方法:
public static void main(String[] args) throws Exception{
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.sina.com");
Session session = Session.getInstance(props,
new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("test","123456");
}
}
);
session.setDebug(true);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("itcast_xxx@sina.com"));
msg.setSubject("中文主题");
msg.setRecipients(RecipientType.TO,
InternetAddress.parse("itcast_test@sina.com,itcast_test@sohu.com"));
msg.setContent("<span style='color:red'>中文呵呵</span>", "text/html;charset=gbk");
Transport.send(msg);
//Message msg = new MimeMessage(session,new FileInputStream("...//xxx.eml"));
//Transport.send(msg,InternetAddress.parse("test@sohu.com"));
}
上面的代码就是使用Message类中的静态方法send发送邮件。该静态方法在内部连接邮件服务器,发送邮件和关闭Transport。因为是在静态方法内部做完上一种方式的三个步骤,所以那些需要的参数就只能在外部属性对象配置,或者从Message对象中查找了。与上一种方法相比,需要多配置一个邮件服务器的主机域名,另外一个比较重要的是用户名和密码的传递方式。它是通过在创建Session对象的实例的时候传递一个包装有用户名和密码的Authenticator对象来实现的。代码中是使用匿名内部类实现的。添加了主机,用户名和密码,剩下一个就是收件人了。通过在Message对象中指定,收件人类型以及收件人地址,Transport的静态send方法就能找到收件人的邮件服务器了。这次代码中的邮件正文就不是普通文本了,而是html格式的文本。所以设置内容的时候就需要制定内容的类型和使用的字符集,避免出现解析错误或者乱码。被注释掉的代码是把本地一封写好的邮件发送出去,这也可以算是第三种发简单邮件的方式吧。总的来说,这套JavaMail的API还是相当灵活的,这里只是用到了创建简单邮件,复杂邮件的创建方式稍后介绍。