上一次我们使用JavaMail的API编写了一个发邮件的小例子,我们的主要
历程是:
(1)创建代表邮件服务器的网络连接信息的Session对象。
(2)创建代表邮件内容的Message对象
(3)创建Transport对象、连接服务器、发送Message、关闭连接。
我们的邮件发送是比较灵活的,我们之前是在Transport对象中指定smtp服务器的路径和
端口的,其实还可以在Properties中去配置路径。我们设置调试的时候课可以在Session对象
中设置setDebug方法,也可以在Properties中设置一个Debug的相应属性。我们的收件人在
Message对象中指定,但是也可以在Transport发送邮件的时候临时指定。
那么什么时候该将什么样的参数设置在谁的位置上呢?这是要根据情况来判定的,下面我们
通过新的API方法来逐渐向大家说明。
我们之前使用的是transport.sendMessage方法去发送邮件的。实际上Transport还可以使用
它的静态方法send来发送信息,该静态方法会帮助我们做一些操作,以减少开发者的工作了。
我们下面编写一个使用send方法发送邮件的样例代码:
可以看到我们最终使用了Transport的send方法发送的邮件,send方法是Transport的静态方法,其中
实现了:
(1)连接服务器。
(2)发送邮件。
(3)关闭连接。
这里我们由于使用了send方法,就不能在Transport上设置收件人信息了,我们在msg上设置了收件人。
在msg的setRecipients方法上,我们第一个参数是一个RecipientType类的枚举值,分别有“TO”、
“CC”以及“BCC”,分别代表“收件”、“抄送”以及“暗送”的意思。第二个参数可以指定
单个收件人(一个Address对象),和一个Address数组代表群发收件人。在组建收件地址数组的时候,
我们既可以封装一个包含多个InternetAddress地址对象的Address地址数组,也可以使用InternetAddress
的parse方法,将带逗号分隔的邮件字符串转化为一个Address数组。
在上一篇我们的样例代码中,是使用了Transport的connect方法设置的发件人的账号密码来通过
smtp服务器发送前的校验的:
Properties对象中。第二,我们的校验方式改为了使用Authenticator存储用户的验证信息(用户名、密码等信息)。
我们的Transport是通过Session创建的,而Session在创建的时候获取了Authenticator,所以
Session创建的Transport中也包含Authenticator,Transport在使用send方法发送邮件时,
验证信息(用户名、密码等信息)会从Authenticator中取出在发送邮件服务器中进行校验。
还有一点值得我们注意,在msg对象中,可以设置特殊格式的文本信息。在上面的样例中,我们设置
了一段Html格式的代码,可以显示一个红色字体的文本信息,我们就是用msg的setContext方法来设
置的,前面的参数为要发送的文本信息,后面是该文本信息的格式。
运行测试代码,我们得到结果:
总结:
JavaMail的API是比较灵活的,怎么设置相应的参数在哪个对象上,是要根据邮件的发送方式
历程是:
(1)创建代表邮件服务器的网络连接信息的Session对象。
(2)创建代表邮件内容的Message对象
(3)创建Transport对象、连接服务器、发送Message、关闭连接。
我们的邮件发送是比较灵活的,我们之前是在Transport对象中指定smtp服务器的路径和
端口的,其实还可以在Properties中去配置路径。我们设置调试的时候课可以在Session对象
中设置setDebug方法,也可以在Properties中设置一个Debug的相应属性。我们的收件人在
Message对象中指定,但是也可以在Transport发送邮件的时候临时指定。
那么什么时候该将什么样的参数设置在谁的位置上呢?这是要根据情况来判定的,下面我们
通过新的API方法来逐渐向大家说明。
我们之前使用的是transport.sendMessage方法去发送邮件的。实际上Transport还可以使用
它的静态方法send来发送信息,该静态方法会帮助我们做一些操作,以减少开发者的工作了。
我们下面编写一个使用send方法发送邮件的样例代码:
package cn.com.javamail;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class JavaMailTest2 {
public static void main(String[] args) throws MessagingException {
Properties props = new Properties();
//属性mail.smtp.auth设置发送时是否校验用户名和密码
//属性mail.transport.protocol设置要使用的邮件协议
//属性mail.host表示发送服务器的邮件服务器地址
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.sina.com");
//第二个参数为验证信息返回器
//即Authenticator对象会返回验证信息(用户名,密码等信息)
//这里的Authenticator是一个匿名内部类
Session session = Session.getInstance(props,
new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//返回发件人账号与密码信息
return new PasswordAuthentication("emailtest3087@sina.com","123qwe");
}
}
);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("emailtest3087@sina.com"));
msg.setSubject("测试主题");
//Message的setRecipients方法可以指定一个或多个收件人
//这里我们指定多个收件人(即收件人参数数组)
msg.setRecipients(RecipientType.TO,
new Address[]{new InternetAddress("emailtest3842@126.com"),
new InternetAddress("emailtest3087@sina.com")});
msg.setContent("<font color=\"red\">哈哈哈</font>", "text/html;charset=gbk");
//上面邮件数组也可以使用下面InternetAddress的parse方法,
//将带逗号分隔的邮件字符串转化为一个Address数组:
//InternetAddress[] address = InternetAddress.parse("emailtest3842@126.com,emailtest3087@sina.com");
/**
* send静态方法。该方法做了以下操作:
* 1.连接服务器。
* 2.发送邮件。
* 3.关闭连接。
* */
System.out.println("邮件开始发送!");
Transport.send(msg);
System.out.println("邮件发送成功!");
}
}
可以看到我们最终使用了Transport的send方法发送的邮件,send方法是Transport的静态方法,其中
实现了:
(1)连接服务器。
(2)发送邮件。
(3)关闭连接。
这里我们由于使用了send方法,就不能在Transport上设置收件人信息了,我们在msg上设置了收件人。
在msg的setRecipients方法上,我们第一个参数是一个RecipientType类的枚举值,分别有“TO”、
“CC”以及“BCC”,分别代表“收件”、“抄送”以及“暗送”的意思。第二个参数可以指定
单个收件人(一个Address对象),和一个Address数组代表群发收件人。在组建收件地址数组的时候,
我们既可以封装一个包含多个InternetAddress地址对象的Address地址数组,也可以使用InternetAddress
的parse方法,将带逗号分隔的邮件字符串转化为一个Address数组。
在上一篇我们的样例代码中,是使用了Transport的connect方法设置的发件人的账号密码来通过
smtp服务器发送前的校验的:
//连接信息:邮件服务器地址,端口号,用户名,密码
transport.connect("smtp.sina.com",25,"emailtest3087", "xxxxx");
本篇代码中,由于使用了Transport的send方法,第一,我们的邮件服务器地址与端口号改为封装在
Properties对象中。第二,我们的校验方式改为了使用Authenticator存储用户的验证信息(用户名、密码等信息)。
我们的Transport是通过Session创建的,而Session在创建的时候获取了Authenticator,所以
Session创建的Transport中也包含Authenticator,Transport在使用send方法发送邮件时,
验证信息(用户名、密码等信息)会从Authenticator中取出在发送邮件服务器中进行校验。
还有一点值得我们注意,在msg对象中,可以设置特殊格式的文本信息。在上面的样例中,我们设置
了一段Html格式的代码,可以显示一个红色字体的文本信息,我们就是用msg的setContext方法来设
置的,前面的参数为要发送的文本信息,后面是该文本信息的格式。
运行测试代码,我们得到结果:
总结:
JavaMail的API是比较灵活的,怎么设置相应的参数在哪个对象上,是要根据邮件的发送方式
来动态指定的。
转载请注明出处:http://blog.csdn.net/acmman/article/details/71698599