【Java邮件开发】6.使用Authenticator和send静态方法

上一次我们使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值