天天看点

Mime协议发送邮件

在myeclipse中的java程序如果要想发送一个邮件的话就必须导入mail.jar与activation.jar。但是在javaee中的13中技术就集成了这两个jar包。所以不用导入。

public class JavaMailDemo1 {
	//使用 javamail  通过 mime 协议发送邮件
	public static void main(String[] args) throws Exception {
		// 编写配置
		Properties props = new Properties();
		//指定传输协议
		props.setProperty("mail.transport.protocol", "smtp");
		//指定主机名
		props.setProperty("mail.host", "localhost");
		// 创建与邮件服务器的对话
		Session session = Session.getInstance(props);
		// 创建  message 代表一封电子邮件  MimeMessage叫做mime消息
		MimeMessage message = new MimeMessage(session);
		// 设置邮件头
		message.setFrom(new InternetAddress("[email protected]"));
		//setRecipient为发送方法,类型一共有三种为枚举类型,有TO(直接发送)、CC(抄送)、BCC(密抄)
message.setRecipient(Message.RecipientType.TO,
 new InternetAddress("[email protected]"));
		//设置主题
		message.setSubject("这是一封电子邮件");
		// 封装邮件体,列举了四种形式
		纯文本的
		// MimeMultipart multipart = createTextMail();
		文本加图片的
		// MimeMultipart multipart = createTextImageMail();
		文本加附件的
		// MimeMultipart multipart = createTextAttachMail();
		文本加图片加附件的
		MimeMultipart multipart = createTextImageAttachMail();
		message.setContent(multipart);	
		// 发送邮件   通过session会话来获取Transport的对象
		Transport transport = session.getTransport();
		//输入用户名与密码
		transport.connect("zhangsan", "123456");
		transport.send(message);
		//关闭对象
		transport.close();
	}

	// 纯文本的邮件
	private static MimeMultipart createTextMail() throws MessagingException {
		// 创建BodyPart
		MimeBodyPart bodyPart = new MimeBodyPart();
		//发送内容,设置编码放乱码
		bodyPart.setContent("hello", "text/html;charset=utf-8");
		// 将 BodyPart 存入 Multipart,此处不用描述关系,默认就为正文跟文本的关系mixed
		MimeMultipart multipart = new MimeMultipart();
		multipart.addBodyPart(bodyPart);
		return multipart;
	}
	
	// 文本加图片的邮件
	private static MimeMultipart createTextImageMail() throws MessagingException {
		// 创建一个BodyPart封装文本信息
		MimeBodyPart text = new MimeBodyPart();
		//将图片直接写到内容中,记住要给图片添加一个ID,src中加入cid:指定是哪个图片
		text.setContent("aaaaaaaaaaaaaaaaaaa<br><img width='500px' src='cid:myimg' /><br>bbbbbbbbbbbbbbbbbb", "text/html");
		// 创建一个BodyPart封装图片信息
		MimeBodyPart image = new MimeBodyPart();
		// 类加载文件  获得url
		URL url = JavaMailDemo1.class.getClassLoader().getResource("a.jpg");
		//javamail没法吧图片转成mime类型的 image/jpeg,对于图片要用到数据处理器,创建 DataHandler 对象数据处理器
		DataHandler dh = new DataHandler(url);
		// 将 DataHandler 设置给 BodyPart
		image.setDataHandler(dh);	
		// 为图片制定内容id
		image.setContentID("myimg");
		// 将上面的两个BodyPart存入一个Multipart
		MimeMultipart multipart = new MimeMultipart();
		multipart.addBodyPart(text);
		multipart.addBodyPart(image);
		// 描述关系为引用关系
		multipart.setSubType("related");
		// 返回 Multipart
		return multipart;
	}
	
	// 文本加附件
	private static MimeMultipart createTextAttachMail() throws MessagingException {
		// 创建一个BodyPart封装文本信息
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("aaaaaaaaaa", "text/html;charset=utf-8");
		// 创建一个BodyPart封装附件信息
		MimeBodyPart attach = new MimeBodyPart();
		//获取到附件路径
String path = JavaMailDemo1.class.getClassLoader().getResource("a.mp3").getPath();
		File file = new File(path);
		//这个是创建DataHandler的另一种方法,需要传入DataSource的接口实现类FileDataSource,需要一个文件对象
		DataHandler dh = new DataHandler(new FileDataSource(file));
		attach.setDataHandler(dh);
		// 作为附件的文件   最终会显示文件名
		attach.setFileName(file.getName());
		// 将上面的两个BodyPart存入一个Multipart
		MimeMultipart multipart = new MimeMultipart();
		multipart.addBodyPart(text);
		multipart.addBodyPart(attach);
		// 描述关系
		multipart.setSubType("mixed");
		return multipart;
	}
	
	// 文本加图片加附件(最复杂的)
	private static MimeMultipart createTextImageAttachMail() throws Exception {
		// 创建一个BodyPart封装文本信息
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("这是一封邮件,有个美女,还有附件哦<br><img width='500px' src='cid:myimg' /><br>bbbbbbbbbbbbbbbbbb", "text/html;charset=utf-8");
		// 创建一个BodyPart封装图片信息
		MimeBodyPart image = new MimeBodyPart();
		// 类加载文件  获得url
		URL url = JavaMailDemo1.class.getClassLoader().getResource("一个美女.jpg");
		// 创建 DataHandler 对象   数据处理器
		DataHandler dh = new DataHandler(url);
		// 将 DataHandler 设置给 BodyPart
		image.setDataHandler(dh);	
		// 为图片制定内容id
		image.setContentID("myimg");			
		// 创建一个BodyPart封装附件信息
		MimeBodyPart attach = new MimeBodyPart();
		String path = JavaMailDemo1.class.getClassLoader().getResource("一首歌.mp3").getPath();
		// 由于是url 中文会进行url编码    path中中文会出现 %... 的形式
		path = URLDecoder.decode(path, "utf-8");
		File file = new File(path);
		dh = new DataHandler(new FileDataSource(file));
		attach.setDataHandler(dh);
		// 作为附件的文件   最终会显示文件名,文件名为中文的时候就要用到MimeUtility的encodeText方法,否则就乱码 了
		String filename = MimeUtility.encodeText(file.getName());
		attach.setFileName(filename);
		// 将上面的三个BodyPart存入一个Multipart
		// 先将前两个组合  描述关系
		MimeMultipart multipart1 = new MimeMultipart();
		multipart1.addBodyPart(text);
		multipart1.addBodyPart(image);
		multipart1.setSubType("related");
		// 将 组合的 MimeMultipart1 封装为一个bodypart,再与另一个进行组合
		MimeBodyPart textImage = new MimeBodyPart();
		//设置图片和文本的内容
		textImage.setContent(multipart1);
		// 将组合的 和 attach 加入一个 multipart
		MimeMultipart multipart2 = new MimeMultipart();
		multipart2.addBodyPart(textImage);
		multipart2.addBodyPart(attach);
		return multipart2;
	}
}