创建包含内嵌图片的邮件

邮件可以抽象为信封、邮件和邮件体。

 

RFC822文档规定了如何编写一封简单邮件
邮件头和邮件体,两者使用空行分隔
邮件头
from字段
to字段
subject字段
ccbcc字段
邮件体
邮件内容
冒充邮箱,编写欺骗邮件

 

MIME协议规定了如何编写一封复杂邮件,MIME协议是对RFC822文档的升级和补充。
对于包含不同类型数据的复杂邮件,MIME协议对不同数据进行分隔,并使用Content-Type头字段描述数据类型、以及不同数据之间的关系。
数据类型
主类型/子类型的形式出现,主类型有textimageaudiovideoapplicationmultipartmessage等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text主类型包plainhtmlxmlcss等子类型。
数据的关系
multipart/mixedmultipart/relatedmultipart/alternative    MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据也称之为MIME消息。
Content-Disposition 头字段
Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inlineattachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,如下所示:

Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名1.bmp Content-ID 头字段
Content-ID头字段用于为multipart/related组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID
头字段设置为如下形式:
Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML 语句来引用该图片资源:
<img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上cid:,以说明要采用唯一标识号对资源进行引用。
 
JavaMail API 按其功能划分通常可分为如下三大类:
创建和解析邮件内容的 API Message 是创建和解析邮件的核心 API ,它的实例对象代表一封电子邮 件。
发送邮件的 API Transport 是发送邮件的核心 API 类,它的实例对象代表实现了某个邮件发送协议的邮 件发送对象,例如 SMTP 协议。
接收邮件的 API Store 是接收邮件的核心 API 类,它的实例对象代表实现了某个邮件接收协议的邮件接 收对象,例如 POP3 协议。
Session
Session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信 息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。 Session 对象根据这些信息构建用于 邮件收发的 Transport Store 对象,以及为客户端创建 Message 对象时提供信息支持。

 

public String[] sendHtmlWithImg(String subject, String htmlText, ArrayList imgs, String[] mails) {
		String[] result = {"", ""};		
		Session session = null;
		Message message = null;
		MimeMultipart multipart = null;
		Transport transport = null;
		props = new Properties();
		//props.put("mail.transpost.protocol", "smtp");
		props.put("mail.smtp.port", "25");
		props.put("mail.smtp.auth", "false");
		try
		{
			session = Session.getDefaultInstance(props, null);
			session.setDebug(false);
			message = new MimeMessage(session);
			message.setSubject(subject);
			String[] tempArray = mails[0].split("`");
			String fromMail = tempArray[0];
			String fromPerson = tempArray[1];
			String feedback = tempArray[2];
			message.setFrom(new InternetAddress(fromMail, fromPerson));
			//是否要求回执
			if(feedback.equals("on.")) {
				message.setHeader("Disposition-Notification-To", fromMail);
			}
			tempArray = mails[1].split(";");			
			for(int i=0;i<tempArray.length;i++) {
				if (tempArray[i].length()<=3 || tempArray[i].indexOf("@")==-1)
				{
					continue;
				}
				message.addRecipient(Message.RecipientType.TO,   
					new InternetAddress(tempArray[i]));
			}
			tempArray = mails[2].split(";");			
			for(int i=0;i<tempArray.length;i++) {
				if (tempArray[i].length()<=3 || tempArray[i].indexOf("@")==-1)
				{
					continue;
				}
				message.addRecipient(Message.RecipientType.CC,   
					new InternetAddress(tempArray[i]));
			}
			tempArray = mails[3].split(";");			
			for(int i=0;i<tempArray.length;i++) {
				if (tempArray[i].length()<=3 || tempArray[i].indexOf("@")==-1)
				{
					continue;
				}
				message.addRecipient(Message.RecipientType.BCC,   
					new InternetAddress(tempArray[i]));
			}

			BodyPart messageBodyPart = new MimeBodyPart();
			messageBodyPart.setContent(htmlText, "text/html;charset=GBK");
			multipart = new MimeMultipart("related");
			multipart.addBodyPart(messageBodyPart);
			result[0] = "ok";
			for(int i=0;i<imgs.size();i++) {
				String[] temp = (String[])imgs.get(i);
				String f = temp[0];
				if (new File(f).exists())
				{
					try{
						DataSource fds = new FileDataSource(f);
						messageBodyPart = new MimeBodyPart();
						messageBodyPart.setDataHandler(new DataHandler(fds));
						messageBodyPart.setHeader("Content-ID","<"+temp[1]+">");
						multipart.addBodyPart(messageBodyPart);	
					} catch (Exception e) {
						System.out.println(e);
						result[0] = "no";
						result[1] = ("未知错误!"+e.getMessage()).replaceAll("\r", "").replaceAll("\n", "").replaceAll("'", "  ");
						break;
					}
				}
				else {
					result[1] = ("系统找不到指定的文件:"+f).replaceAll("\r", "  ").replaceAll("\n", "  ").replaceAll("'", "  ");
				}
			}
			message.setContent(multipart);
			message.saveChanges();
			transport = session.getTransport("smtp");
			transport.connect(currentMailServer, null, null);
			transport.sendMessage(message, message.getAllRecipients());
			transport.close();
		} catch (AddressException e) {
			System.out.println(e);
			result[0] = "no";
			result[1] = ("无效邮件地址!"+e.getMessage()).replaceAll("\r", "").replaceAll("\n", "").replaceAll("'", "  ");
		} catch (MessagingException e) {
			System.out.println(e);
			currentMailServer = MAIL_SMTP_HOST[1];
			try {
				transport.connect(currentMailServer, null, null);
				transport.sendMessage(message, message.getAllRecipients());
				transport.close();
				result[0] = "ok";
			}
			catch (MessagingException ex) {
				System.out.println(ex);
				currentMailServer = MAIL_SMTP_HOST[2];
				try {
					transport.connect(currentMailServer, null, null);
					transport.sendMessage(message, message.getAllRecipients());
					transport.close();
					result[0] = "ok";
				}
				catch (Exception ex2) {
					System.out.println(ex2);
					result[0] = "no";
					result[1] = "邮件服务器繁忙,请稍候再试!";
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			result[0] = "no";
			result[1] = ("未知错误!"+e.getMessage()).replaceAll("\r", "").replaceAll("\n", "").replaceAll("'", "  ");
		}
		multipart = null;
		message = null;
		session = null;
		transport = null;
		//System.out.println("currentMailServer="+currentMailServer);
		return result;
	}

 

 

你可能感兴趣的:(数据结构,应用服务器,css,网络应用,网络协议)