关于邮件MIME协议和java mail 发送邮件

关于邮件MIME协议和java mail 发送邮件 写这篇博客主要是由于前两天上线一个邮箱的代码,接收方一直解析不了。由于对MIME协议这一块不是很了解,比对了很长时间才发现从我们程序传过去的MimeMessage是符合MIME规范的,接收方无法解析是由于提供邮件服务的smtp在给通过程序发送的邮件写入内容无received域,还有一些内容不符合MIME规范,无法通过接收方domino服务器的解析规则。一MIME协议1.介绍MIM…

大家好,欢迎来到IT知识分享网。

  写这篇博客主要是由于前两天上线一个邮箱的代码,接收方一直解析不了。由于对MIME协议这一块不是很了解,比对了很长时间才发现从我们程序传过去的MimeMessage是符合MIME规范的,接收方无法解析是由于提供邮件服务的smtp在给通过程序发送的邮件写入内容无received域,还有一些内容不符合MIME规范,无法通过接收方domino服务器的解析规则。

一 MIME协议

1.介绍

MIME, 全称为“Multipurpose Internet Mail Extensions”, 比较确切的中文名称为“多用途互联网邮件扩展”。它是当前广泛应用的一种电子邮件技术规范,基本内容定义于RFC 2045-2049(注意RFC1521和RFC1522是它的过时版本)。

2.MIME邮件头的域

关于邮件MIME协议和java mail 发送邮件

 

3.中文转码

    在邮件里写入的值如果是中文的话是需要进行转码的,比如说Subject域写入的主题,有附件的话filename的值,由于我这边使用的是java mail的方式发送邮件,使用的是MimeUtility的encodeText方法自动转码的,这种方法可以在2,3参数指定使用的文字编码和使用BASE 64还是QP进行转码。不指定的话转码方式会根据参数1的字符转成ascii码去判断使用BASE 64还是QP进行转码。

   转码后出来的是=?UTF-8?B?heWuuS5kb2M=?= 这样的一个格式。UTF-8是文字的编码,B指BASE 64,如果是Q的话就是指QP。=?UTF-8?B?之后的内容就是你文字的内容,比如说主题名,附件名。

 

二 java mail 发送邮件

 这里直接贴代码上来吧,java mail的写法还是很清晰的

public static void sendMail(
			String sendSMTPHost,
			String sendSMTPPort,
			String sendMailAccount,
			String sendMailPass,
			List<String> recipients,
			String subject,
			String content,
			List<String> attachmentNames)throws Exception{
		//1.创建用于连接服务器的参数配置
		Properties props = new Properties();
		props.put("mail.transport.protocol", "smtp");//使用的协议(JavaMail规范要求)
		props.put("mail.smtp.host",sendSMTPHost);//发件人邮箱的SMTP服务器地址
		props.put("mail.smtp.auth", "true");//需要请求认证
		
		//2.根据配置创建会话对象,用于和邮件服务器交互
		Session session = Session.getInstance(props);
		session.setDebug(true);//设置为debug模式,可以查看详细的发送log
		
		//3.创建一封邮件
		MimeMessage message = createMimeMessage(session,sendMailAccount,recipients,subject,content,attachmentNames);
		
		//4.根据Session获取邮件传输对象
		Transport transport = session.getTransport();
		
		//5.使用邮箱账号和密码连接邮件服务器,这里认证的邮箱必须与message中发件人邮箱一致
		transport.connect(sendMailAccount, sendMailPass);
		
		//6.发送邮件,发到所有收件地址
		transport.sendMessage(message, message.getAllRecipients());
		
		//7.关闭连接
		transport.close();
	}


private static MimeMessage createMimeMessage(
			Session session,
			String sendMailAccount, 
			List<String> recipients, 
			String subject,
			String content, 
			List<String> attachmentNames)throws Exception{
		
		//1.创建一封邮件
		MimeMessage message = new MimeMessage(session);
		
		//2.From:发件人
		message.setFrom(new InternetAddress(sendMailAccount));
		
		//3.TO:收件人 (CC:代表抄送。BCC:代表暗送接收者。)
		String toAddressStr = JavaStringUtil.connectListToString(recipients, ",");
		InternetAddress[] toAddressList = new InternetAddress().parse(toAddressStr);
		message.setRecipients(MimeMessage.RecipientType.TO,toAddressList);
		
		//4.Subject:主题
		message.setSubject(MimeUtility.encodeText(subject, "UTF-8","B"));
		
		//5.Content:正文
		Multipart multipart = new MimeMultipart();//创建正文"节点"
		MimeBodyPart text = new MimeBodyPart();
		text.setContent(content,"text/plain;charset=UTF-8");
		multipart.addBodyPart(text);
		
		//6.附件
		for(String fileName : attachmentNames){
			MimeBodyPart adjunct = new MimeBodyPart();
			DataHandler dh = new DataHandler(new FileDataSource(fileName));//读取集合中的文件
			adjunct.setDataHandler(dh);//将附件数据添加到"节点"
			if(dh.getName().contains("txt")){
				adjunct.setHeader("Content-Type", "text/plain; charset=UTF-8");
				}else if(dh.getName().contains("doc")){
					adjunct.setHeader("Content-Type", "application/msword; charset=UTF-8");

				}
			
			
			adjunct.setFileName(MimeUtility.encodeText(dh.getName()));//设置附件的文件名
		
			multipart.addBodyPart(adjunct);
		}
		
		message.setContent(multipart);//设置正文
		
		//7.设置发件时间
		message.setSentDate(new Date());
		
		//8.保存设置
		message.saveChanges();
		
		return message;
	}
	

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12842.html

(0)
上一篇 2024-03-10 14:26
下一篇 2024-03-10 17:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信