关于javamail的使用心得

         最近做项目用到了javamail,特此讲一下实现流程和自己在做项目的时候遇到的一些问题.

   1.准备条件:在开发javamail的时候你首先需要mail包,javaee.jar里面已经包含了mail.jar包。此包自行上网下载,网上很多。

   2.基本介绍:

     我的理解是javamail其实也是借助其他邮件平台来进行收发邮件的(起初我以为javamail是可以自定义邮件密码的)。

 JavaMail是SUN提供给开发人员在应用程序中实现“邮件发送和接收功能”的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP。

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;

  • POP3:邮局协议,用于接收电子邮件的标准协议;

  • IMAP:互联网消息访问协议,是POP3的替代协议。

    (这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAP3)。

  • MIME:多用途因特网邮件扩展别准,它不是邮件传输消息,但对传输内容的消息、附件及其他的内容定义了格式。

   

   开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket),JavaMail也提供了能够创建出各种复杂MIME格式的邮件内容的API。使用JavaMail,我们可以实现类似OutLook、FoxMail的软件。虽然JavaMail(仅支持JDK4及以上)也是Java的API之一,但是却没有直接加入到JDK中,所以我们需要另行下载。另外,JavaMail依赖JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容(如MIME多用途互联网邮件扩展、URL页面和文件附件等内容),JAF在Java6之后已经合并到JDK中,而JDK5之前需要另外下载JAF的类库。

      JAF:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jaf-1.1.1-fcs-oth-JP 

 JavaMail包含两部分内容,一部分是JavaMail API,定义了一组平台无关、独立于通讯协议的邮件程序框架,该部分称为应用级接口,也就是供我们调用的部分,另一部分是service provider,该部分使用特定的协议语言来实现第一部分定义的抽象类和接口,这些协议包括:SMTP、NNTP、POP3、IMAP,如果让JavaMail与邮件服务器通信,就需要相应的协议支持,该部分称为服务提供者接口,也就是JavaMail自身需要的协议支持。在使用JavaMail时,通常我们只需将mail.jar放在classpath下使用,它包含了JavaMail API部分和SUN自己实现的service provider部分。可能也有特殊的时候,我们应用程序中需要自己实现service provider部分,那我们只需要mailapi.jar。下面通过几个类来简单认识下JavaMail API:

    javax.mail.Session:上下文环境信息,如服务器的主机名、端口号、协议名称等
    javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等
    javax.mail.Transport:连接邮件SMTP服务器,发送邮件
    javax.mail.Store:连接邮件POP3、IMAP服务器,收取邮件

   3.进入主题看如何发送邮件吧。

//发送邮件
		public boolean sendEventMail() throws AddressException, MessagingException{
			//创建属性对象
			Properties props = new Properties();
			//指定SMTP服务�?  
			props.put("mail.smtp.host", SMTPHost);
			props.put("mail.smtp.port",String.valueOf(25));  
			props.put("mail.smtp.localhost","localhost");
			//指定是否需要SMTP验证		
			props.put("mail.smtp.auth", "true");
				//创建授权验证对象
				SmtpAuth auth = new SmtpAuth();
				auth.setAccount(user,password);
				//创建Session对象
				Session mailSession = Session.getDefaultInstance(props,auth);
				mailSession.setDebug(true);
				//创建Message对象
				Message message=new MimeMessage(mailSession);
				//指定发件人邮箱
				message.setFrom(new InternetAddress(from));
				//群发邮件的实现
		        final int num=recipients.length;
		        InternetAddress[] addresses = new InternetAddress[num];
		        for(int i=0;i<num;i++){
		        	addresses[i] = new InternetAddress(recipients[i]);
		        }
				//指定收件人邮箱
		        if(!"".equals(to)&&to!=null){
		        		message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
		        }else if(recipientsArr.length!=0){
		        	 final int recipientsNum=recipientsArr.length;
				        InternetAddress[] addressors = new InternetAddress[recipientsNum];
				        for(int i=0;i<recipientsNum;i++){ 	
				        	addressors[i] = new InternetAddress(recipientsArr[i].trim());
				        }
		        	message.setRecipients(Message.RecipientType.TO,addressors);
		        }
				
		        message.setRecipients(Message.RecipientType.CC,addresses);
				//指定邮件主题
				message.setSubject(subject);
				//指定邮件内容
				message.setContent(content,"text/html;charset=utf-8");
				//指定邮件发送日期
				message.setSentDate(new Date());
				
				//指定邮件优先级1:紧急3:普通5:缓慢
				//message.setHeader("X-Priority","3");
				//message.saveChanges();
							
				//创建Transport对象
				Transport transport = mailSession.getTransport("smtp");
				//连接SMTP服务器
				transport.connect(SMTPHost, user, password);
				//发送邮件
				transport.sendMessage(message, message.getAllRecipients());
				transport.close();
				return true;
			
		}

//定义SMTP授权验证    user  password   自己在目标服务器的邮箱帐号和密码//
	public static class SmtpAuth extends Authenticator{
		String user,password;
		//设置帐号信息
		void setAccount(String user,String password){
			this.user = user;
			this.password = password;
		}
		//取得PasswordAuthentication对象
		protected PasswordAuthentication getPasswordAuthentication(){
			return new PasswordAuthentication(user,password);
		}
	}

/**
	 * 获取邮件内容并发送邮件
	 */
	public void sendMail() {
		HttpServletRequest request = ServletActionContext.getRequest();
		try {
			request.setCharacterEncoding("utf-8");
		} catch (UnsupportedEncodingException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		// 1.收件人,抄送人,邮件主题,邮件内容,发件人邮箱 发件人密码
		SendMailUtil sendMailUtil = new SendMailUtil();
		sendMailUtil.setSMTPHost("smtp.evsny.com");
		sendMailUtil.setUser(addressor);
		sendMailUtil.setPassword(addressorPassword);
		sendMailUtil.setFrom(addressor);
		/* sendMailUtil.setTo(recipients); */
		// 当是单个收件人的时候
		if (recipients != null && !("").equals(recipients)) {
			String[] recipientsArr = recipients.toString().trim().split(",");
			if (recipientsArr.length == 1) {
				sendMailUtil.setTo(recipients);
			} else if (recipientsArr.length > 1) {
				// 当是多个收件人的时候
				for (int i = 0; i < recipientsArr.length; i++) {
					recipientsArr[i] = '"' + recipientsArr[i] + '"';
				}
				sendMailUtil.setRecipientsArr(recipientsArr);
			}
		}
		copyToMan = copyToMan.trim();
		if (copyToMan != null && !("").equals(copyToMan)) {
			/* String copyToMan1 = (('"'+copyToMan+'"')); */
			String[] copyToManArr = copyToMan.split(",");
			String[] mailManArr = new String[1];
			mailManArr[0] = "";
			int copyToManLength = copyToManArr.length;
			for (int i = 0; i < copyToManLength; i++) {
				copyToManArr[i] = ('"' + copyToManArr[i] + '"');
			}
			sendMailUtil.setCC(copyToManArr);
		}
		sendMailUtil.setSubject('"' + mailTheme + '"');
		sendMailUtil.setContent('"' + mailContent + '"');
		try {
			sendMailUtil.sendEventMail();
		} catch (AddressException e) {
			e.printStackTrace();
			// 邮箱帐号或密码错误
			reponseViewInfo("addressError");
		} catch (MessagingException e) {
			e.printStackTrace();
			// 发件人或抄送人错误
			reponseViewInfo("messageError");
		}
		// 发送成功
		reponseViewInfo("sendMessageSuccess");
	}
值得提醒的是:1.上面的代码并不能直接拷贝使用,因为邮件内容,邮件地址,抄送人地址收件人地址都没有,需要大家自己去填写(上面的有很多只是属性而已)。

             2.讲一下如果有多个收件人和抄送人的话上面代码也是满足的,多个地址必须以数组形式存在,比如 mailArr["2444244@qq.com","2242144@qq.com"],但是需要注意的是在编写java程序的时候数组元素一定要看起来是有两个双引号在外面才满足

    (""24442444@qq.com""),这点是为什么我也没有理解到,在我做项目的时候也让我费了很大的劲。

     3.以上代码并没有解决部分地址不存在导致全部邮件发送不成功的问题。

        4.以上代码有一个问题是在处理异常的时候只能抓取两个异常,导致对异常的处理有限制,不能全面反应具体的错误。

             5.以上代码对空字符串都做了处理。

             6.抄送人是可以为空的。

             7.代码不能直接拷贝使用,给大家带来的麻烦请谅解。希望大家花点时间看,并且把值补全,有什么不对的地方还需大家指教,谢谢。


 

   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值