邮件发送原理和实现

简单邮件:没有附件和图片,纯文本邮件;
复杂邮件:有附件和图片;
要发送邮件,需要获得协议和支持。开启服务pop3/smtp。

发送简单邮件

public class MailDemo01{
	public static void main(String[] args) throws Exception{
		Properties prop = new Properties();
		prop.setProperty("mail.host","smtp.qq.com");	// 设置qq邮箱服务器
		prop.setProperty("mail.transport","smtp");		// 邮件发送协议
		prop.setProperty("mail.smtp.auth","true");		// 需要验证用户名密码

		// 关于QQ邮箱,还需要设置SSL加密,加上以下代码即可
		MailSSLSocketFactory sf = new MailSSLSocketFactory();
		sf.setTrustAllHosts(true);
		prop.put("mail.smtp.ssl.enable","true");
		prop.put("mail.smtp.ssl.socketFactory",sf);

		// 使用JavaMail发送邮件的5个步骤

		// 1. 创建定义整个应用程序所需的环境信息的Session对象
		// QQ才有
		Session.getDefaultInstance(prop, new Authenticator(){
			public PasswordAuthentication getPasswordAuthentication(){
				// 发件人邮件用户名、授权码
				return new PasswordAuthentication("123456@qq.com","授权码");
			}
		});

		// 开启Session的Debug模式,这样就可以查看到程序发送Email的运行状态
		session.setDebug(true);
		// 2. 通过session得到transport对象
		Transport ts = session.getTransport();
		
		// 3. 使用邮箱的用户名和授权码连接上邮件服务器
		ts.connect("smtp.qq.com","123456@qq.com","授权码");

		// 4. 创建邮件
		// 注意需要传递Session
		MimeMessage message = new MimeMessage(session);
		// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己发给自己
		message.setRecipient(Message.RecipientType.To,new InternetAddress("123456@qq.com"));
		// 邮件的标题
		message.setSubject("只包含文本的简单邮件");
		// 邮件的文本内容
		message.setContent("<h1>你好啊</h1>","text/html;charset=UTF-8");

		// 5. 发送邮件
		ts.sendMessage(message,message.getAllRecipients());

		// 6. 关闭连接
		ts.close();
	}
}

发送复杂邮件【加图片】

public class MailDemo01{
	public static void main(String[] args) throws Exception{
		Properties prop = new Properties();
		prop.setProperty("mail.host","smtp.qq.com");	// 设置qq邮箱服务器
		prop.setProperty("mail.transport","smtp");		// 邮件发送协议
		prop.setProperty("mail.smtp.auth","true");		// 需要验证用户名密码

		// 关于QQ邮箱,还需要设置SSL加密,加上以下代码即可
		MailSSLSocketFactory sf = new MailSSLSocketFactory();
		sf.setTrustAllHosts(true);
		prop.put("mail.smtp.ssl.enable","true");
		prop.put("mail.smtp.ssl.socketFactory",sf);

		// 使用JavaMail发送邮件的5个步骤

		// 1. 创建定义整个应用程序所需的环境信息的Session对象
		// QQ才有
		Session.getDefaultInstance(prop, new Authenticator(){
			public PasswordAuthentication getPasswordAuthentication(){
				// 发件人邮件用户名、授权码
				return new PasswordAuthentication("123456@qq.com","授权码");
			}
		});

		// 开启Session的Debug模式,这样就可以查看到程序发送Email的运行状态
		session.setDebug(true);
		// 2. 通过session得到transport对象
		Transport ts = session.getTransport();
		
		// 3. 使用邮箱的用户名和授权码连接上邮件服务器
		ts.connect("smtp.qq.com","123456@qq.com","授权码");

		// 4. 创建邮件
		// 注意需要传递Session
		MimeMessage message = new MimeMessage(session);
		// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己发给自己
		message.setRecipient(Message.RecipientType.To,new InternetAddress("123456@qq.com"));
		// 邮件的标题
		message.setSubject("只包含文本的简单邮件");
		// 邮件内容===================================
		// 准备图片数据
		MimeBodyPart image = new MimeBodyPart();
		// 图片需要经过数据处理。。。  DataHandler:数据处理
		DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg"));
		image.setDataHandler(dh);	// 在Body中放入这个处理的图片数据
		image.setContentID(bz.jpg);		// 给图片设置一个ID,我们在后面可以使用
		// 准备正文数据
		MimeBodyPart text = new MinmeBodyPart();
		text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","text/html;charset=UTF-8");
		// 描述数据关系
		MimeMultipart mm = new MimeBodyPart();
		mm.addBodyPart(text);
		mm.addBodyPart(image);
		mm.setSubType("related");
		// 设置到消息中,保存修改
		message.setContent(mm);		// 把最后编辑好的邮件放在消息中
		message.SaveChanges();		// 保存修改

		// 5. 发送邮件
		ts.sendMessage(message,message.getAllRecipients());

		// 6. 关闭连接
		ts.close();
	}
}

发送复杂邮件【加图片附件】

public class MailDemo01{
	public static void main(String[] args) throws Exception{
		Properties prop = new Properties();
		prop.setProperty("mail.host","smtp.qq.com");	// 设置qq邮箱服务器
		prop.setProperty("mail.transport","smtp");		// 邮件发送协议
		prop.setProperty("mail.smtp.auth","true");		// 需要验证用户名密码

		// 关于QQ邮箱,还需要设置SSL加密,加上以下代码即可
		MailSSLSocketFactory sf = new MailSSLSocketFactory();
		sf.setTrustAllHosts(true);
		prop.put("mail.smtp.ssl.enable","true");
		prop.put("mail.smtp.ssl.socketFactory",sf);

		// 使用JavaMail发送邮件的5个步骤

		// 1. 创建定义整个应用程序所需的环境信息的Session对象
		// QQ才有
		Session.getDefaultInstance(prop, new Authenticator(){
			public PasswordAuthentication getPasswordAuthentication(){
				// 发件人邮件用户名、授权码
				return new PasswordAuthentication("123456@qq.com","授权码");
			}
		});

		// 开启Session的Debug模式,这样就可以查看到程序发送Email的运行状态
		session.setDebug(true);
		// 2. 通过session得到transport对象
		Transport ts = session.getTransport();
		
		// 3. 使用邮箱的用户名和授权码连接上邮件服务器
		ts.connect("smtp.qq.com","123456@qq.com","授权码");

		// 4. 创建邮件
		// 注意需要传递Session
		MimeMessage message = new MimeMessage(session);
		// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己发给自己
		message.setRecipient(Message.RecipientType.To,new InternetAddress("123456@qq.com"));
		// 邮件的标题
		message.setSubject("只包含文本的简单邮件");
		// 邮件内容===================================
		// 准备图片数据
		MimeBodyPart body1 = new MimeBodyPart();
		// 图片需要经过数据处理。。。  DataHandler:数据处理
		DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg"));
		body1.setDataHandler(dh);	// 在Body中放入这个处理的图片数据
		body1.setContentID(bz.jpg);		// 给图片设置一个ID,我们在后面可以使用
		// 准备正文数据
		MimeBodyPart body2 = new MinmeBodyPart();
		body2.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","text/html;charset=UTF-8");
		// 附件
		MimeBodyPart body3 = new MimeBodyPart();
		body3.setDataHandler(new DataHandler(new FileDataSource("src/resources/log4j.properties")));
		body3.setFileName("log4j.properties");	// 设置附件名字
		
		// 拼接邮件正文内容
		MimeMultipart multipart1 = new MimeMultipart();
		multipart1.addBodyPart(body1);
		multipart1.addBodyPart(body2);
		multipart1.setSubType("related");	// 文本和图片内联成功
		// 把拼装好的正文内容设置为主体
		MimeBodyPart contentText = new MimeBodyPart();
		contentText.setContent(multipart1);
		// 拼接附件
		MimeMultipart allFile = new MimeMultipart();
		addFile.addBodyPart(body3);
		addFile.addBodyPart(contentText);
		addFile.setSubType("mixed");	// 正文和附件都存在邮件中,所有类型设置为mixed
		
		// 设置到消息中,保存修改
		message.setContent(addFile);		// 把最后编辑好的邮件放在消息中
		message.SaveChanges();		// 保存修改

		// 5. 发送邮件
		ts.sendMessage(message,message.getAllRecipients());

		// 6. 关闭连接
		ts.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值