java实现发送邮件

1.概述:SMTP协议为邮件发送协议,在java应用程序中,可以使用SMTP协议实现发送邮件的功能。

2.创建Session会话

在使用SMTP协议之前,需要导入扩展包javax.mail。

下载地址:https://mvnrepository.com/artifact/com.sun.mail/javax.mail

还要在自己邮箱的设置页面开启SMTP服务和获取授权码

 注意:授权密码只出现一次,获取后保存下来。

public static void main(String[] args) {
		
		//封装服务器连接信息
		Properties pros=new Properties();
		pros.put("mail.smtp.host", "smtp.163.com");
		pros.put("mail.smtp.port", "25");
		pros.put("mail.smtp.auth", "true");
		pros.put("mail.smtp.starttls.enable","true" );
		
		//创建Session会话
		//参数一:服务器连接信息
		//参数二:账号密码校验对象(用户认证对象)
		Session session=Session.getInstance(pros, new Authenticator() {
            String userName="邮箱账号";
		    String password="授权码";
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);
			}
		});
		System.out.println(session);
	}

在上面的代码中,我们将与服务器连接的信息封装在Properties对象中,在创建Session对象时,需要传入两个参数 ,第一个参数就是我们封装的服务器连接信息,第二个参数为用户认证对象,因为Authenticator为抽象类,所以创建一个匿名子类对象并将邮箱账号和授权码传入。

运行结果:

 如果我们可以正常的输出Session对象,则我们与服务器连接成功。为了以后开发方便,我们将创建Session对象的过程封装到成一个工具类的静态方法,如下图所示:

public final class JavaMailUtils {
	 private JavaMailUtils() {
	}
	 
	 public static Session createSession() {
		 Properties pros=new Properties();
			pros.put("mail.smtp.host", "smtp.163.com");
			pros.put("mail.smtp.port", "25");
			pros.put("mail.smtp.auth", "true");
			pros.put("mail.smtp.starttls.enable","true" );
			
			//创建Session
			Session session=Session.getInstance(pros, new Authenticator() {
                String userName="邮箱账号";
		        String password="授权码";
				@Override
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(userName, password);
				}
			});
			session.setDebug(true);
			return session;
	 }
}

3.发送普通文本邮件

与服务器连接成功后,接下来就需要写邮件了,java中一封邮件就是一个MimeMessage对象 ,通过MimeMessage对象设置收件人,发件人,主题以及邮件内容等等。最后使用Transport.send()方法发送邮件。

public static void main(String[] args) {
		//1.创建Session
		try {
			Session session=JavaMailUtils.createSession();
			System.out.println(session);
			
			//2.创建邮件对象
			MimeMessage message=new MimeMessage(session);
            //设置邮件主题
			message.setSubject("这是一个测试邮件");
            //设置邮件内容
			message.setText("测试邮件");
            //设置发件人
			message.setFrom(new InternetAddress("邮箱账号"));
            //设置收件人
			message.setRecipient(RecipientType.TO, new InternetAddress("邮件账号"));
			
			//3.发送邮件
			Transport.send(message);
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

执行上述代码后,就可以在收件人的邮箱中收到邮件。

 邮箱内容:

4.发送带有附件的邮件

在生活中,我们经常会发送带有附件的邮件,接下来,我们就通过java程序发送带有附件的邮件,要发送带有附件的邮件,不能直接设置正文内容,需要用到BodyPart的子类对象分别设置正文和附件的内容,然后整合后一起添加到MimeMessage对象中。

public static void main(String[] args) {
		try {
			//1.创建Session会话
			Session session=JavaMailUtils.createSession();
			
			//2.创建邮件对象
			MimeMessage message=new MimeMessage(session);
			message.setSubject("这是一个带有附件的测试邮件");
			message.setFrom(new InternetAddress("发件人邮箱账号"));
			message.setRecipient(RecipientType.TO,new InternetAddress("收件人邮箱账号") );
			
			//设置正文
			BodyPart textPart=new MimeBodyPart();
            //设置正文内容并标明含有html标签
			textPart.setContent("带有<b>附件</b>的邮件", "text/html;charset=utf-8");
			
			//设置附件
			BodyPart filePart=new MimeBodyPart();
			filePart.setFileName("四级成绩.jpg");
			filePart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("附件文件路径")), "application/octet-stream")));
			
			
			//整合正文和附件
			Multipart part=new MimeMultipart();
			part.addBodyPart(textPart);
			part.addBodyPart(filePart);
			
			//添加正文和邮件
			message.setContent(part);
			//3.发送邮件
			Transport.send(message);
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

上面的代码中,在设置正文内容的时候还标明了含有html标签,这样我们就可以在内容中使用html标签了。

执行上述代码得到:

 5.发送在正文嵌套图片的邮件

我们有时候需要在邮件的正文中嵌套图片,那么这个功能在java程序中如何实现呢?

在发送带有附件的邮件时,我们将邮件分为了两个BodyPart对象,整合后直接添加到MimeMessage中,在正文嵌套图片中,也是将正文和图片创建为两个BodyPart对象,只不过这次需要在正文里通过img标签引用图片。

            //1.创建Session会话
			Session session=JavaMailUtils.createSession();
			
			//2.创建邮件对象
			MimeMessage message=new MimeMessage(session);
			message.setSubject("这是一个正文嵌套图片的测试邮件");
			message.setFrom(new InternetAddress("发件人邮箱账号"));
			message.setRecipient(RecipientType.TO,new InternetAddress("主收件人邮箱账号") );

			message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("抄送人邮箱账号1"),
					new InternetAddress("抄送人邮箱账号2")});
			
			//设置正文
			BodyPart textPart=new MimeBodyPart();
			StringBuilder text=new StringBuilder();
			text.append("<h1>测试邮件</h1>");

            //cid:zjb表示引用编号为zjb的BodyPart对象
			text.append("<img src=\"cid:zjb\"/>");
			
			textPart.setContent(text.toString(), "text/html;charset=utf-8");
			
			//设置图片
			BodyPart imagePart=new MimeBodyPart();
			imagePart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("图片路径")),
									"application/octet-stream")));
			
            //设置图片编号,便于设置正文时引用
			imagePart.setHeader("Content-ID", "zjb");
			
			Multipart part=new MimeMultipart();
			part.addBodyPart(textPart);
			part.addBodyPart(imagePart);
			
			message.setContent(part);
			
			//3.发送邮件
			Transport.send(message);

 我们除了设置一个主收件人,还可以设置多个抄送人,因为抄送人可以设置多个(可以实现群发),所以设置抄送人的时候为一个InternetAddress类型数组,RecipientType.TO表示该收件人为主收件人,RecipientType.CC表示该收件人为抄送人。

执行代码得到:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值