用Java实现发送邮件——Java Email

这篇具有很好参考价值的文章主要介绍了用Java实现发送邮件——Java Email。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        众所周知,Email就是邮件,在科技高速发展的今天我们也使用了非常之久的电子邮件,我们熟知的邮件有自己的QQ邮箱、网易邮箱大师还有Outlook等都是用来发送邮件的,而用Java程序也是可以用来发送邮件的。

邮件

首先我们先对比一下传统的邮件信息是如何发送的:传统邮件是将邮件放入到邮箱中,再通过邮局发往目的地所在的邮局,再由邮递员送到收件人的手中。这和我们现在的快递是同样的道理。

用Java实现发送邮件——Java Email

而电子邮件的原理也是类似的,只不过是把普通邮局换成了电子的,先发送到邮件服务器中,再经过若干个邮件服务器的中转之后,最后发送到收件人的邮箱中。效果类似上图。

邮件协议

1.SMTP

        SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的准备规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的发送地。SMTP 服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。可增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。

2.POP3

        POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Intenet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

3.IMAP

        IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

4.了解POP3与IMAP之间的不同?

        POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。
        IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

以126邮件为例,相应的协议会有相关的协议端口

服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
SMTP smtp.126.com 993 143
IMAP imap.126.com 465/994 25
POP3 pop.126.com 995 110

发送邮件的准备工作

        本文使用的是网易邮箱126,可以以自行申请,在使用之前要在网易邮箱的设置里的"POP3/SMTP/IMAP"里开启服务,二者选一即可。

用Java实现发送邮件——Java Email

 还要在下拉界面开启授权密码管理,点击"新增授权密码",界面会显示你的密码,为了更好的记住,可以选择文本进行保存,当你不再使用时,可以点击删除按钮,之后此密码将会失效,不能再进行登录。用Java实现发送邮件——Java Email

 代码实现邮件发送

public class Demo01 {
	public static void main(String[] args) {
		// SMTP服务器地址
		String smtp = "stmp.126.com";
		
		// 邮箱账号和密码(授权密码)
		String userName = "*********";
		String password = "*********";
		
		// SMTP服务器的连接信息
		Properties props = new Properties();
		props.put("mail.smtp.host", smtp); // SMTP主机号
		props.put("mail.smtp.port", "25"); // 主机端口号
		props.put("mail.smtp.auth", "true"); // 是否需要认证
		props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
		
		// 创建Session
		// 参数1:SMTP服务器的连接信息
		// 参数2:用户认证对象(Authenticator接口的匿名实现类)
		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);
			}
		});
		
		// 开启调试模式
		session.setDebug(true);
		
		System.out.println(session);
	}
}

当发送邮件时,我们每次都要先创建Session,再输入邮箱的账号密码,建立连接信息,过于繁琐,所以我们可以在这里创建一个JavaMailUtils类,每次创建连接时,只需要调用JavaMailUtils类里的createsession()方法即可,大大减少了代码的冗余。

public class JavaMailUtils {

	public static Session createsession() {
		// SMTP服务器地址
		String smtp = "smtp.126.com";
		
		// 邮箱账号和密码(授权密码)
		String userName = "**********";
		String password = "**********";
		
		// SMTP服务器的连接信息
		Properties props = new Properties();
		props.put("mail.smtp.host", smtp); // SMTP主机号
		props.put("mail.smtp.port", "25"); // 主机端口号
		props.put("mail.smtp.auth", "true"); // 是否需要认证
		props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
		
		// 创建Session
		// 参数1:SMTP服务器的连接信息
		// 参数2:用户认证对象(Authenticator接口的匿名实现类)
		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);
			}
		});
		
		// 开启调试模式
		session.setDebug(true);
		
		return session;
	}
}

 发送普通邮件

        首先,我们还是要创建Session,当然这次我们只需调用JavaMailUtils的createsession()方法 就行。然后创建Message对象,因为Message类是一个抽象类,所以我们只能创建其子类对象,然后将session传入。

接着调用setFrom()方法选择发件人,setRecipient()方法选择收件人,setSubject()方法选择输入邮件的标题,setText()方法输入邮件的正文,最后通过Transport的send()方法完成发送邮件。

在setRecipient()这个方法中,我们可以通过RecipientType枚举类提供的常量进行选择,RecipientType.TO代表收件人,RecipientType.CC代表抄送人。

注意:登录名和发送人的邮件保持一致,否则可能会使得邮件发送失败。

public class Demo02 {
	public static void main(String[] args) {
		try {
			// 1.创建Session
			Session session = JavaMailUtils.createsession();
			
			// 2.创建邮件对象(Message抽象类的子类对象)
			MimeMessage msg = new MimeMessage(session); // 传入session
			msg.setFrom(new InternetAddress("*********")); // 发件人
			msg.setRecipient(RecipientType.TO, new InternetAddress("*********")); // 收件人
            msg.setRecipient(RecipientType.CC, new InternetAddress("*********")); // 抄送人
			msg.setSubject("这是一封来自好友的邮件","utf-8"); // 标题
			msg.setText("愿世界和平!","utf-8"); // 正文
			
			// 3.发送
			Transport.send(msg);
			
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
}

发送正文带有"html"标签的邮件

可以在需要修改的内容前后加上html的修饰符进行修改。

例:<b>世界</b> 可以让"世界"两个字加粗。

public class Demo03 {
	public static void main(String[] args) {
		try {
			// 1.创建Session
			Session session = JavaMailUtils.createsession();
			
			// 2.创建邮件对象(Message抽象类的子类对象)
			MimeMessage msg = new MimeMessage(session); // 传入session
			msg.setFrom(new InternetAddress("*********")); // 发件人
			msg.setRecipient(RecipientType.TO, new InternetAddress("*********")); // 收件人
            msg.setRecipient(RecipientType.CC, new InternetAddress("*********")); // 抄送人
			msg.setSubject("这是一封来自好友的邮件","utf-8"); // 标题

			// 邮件正文中包含有“html”标签(控制文本的格式)
			msg.setText("<b>世界</b>和平!","utf-8","html"); // 正文
			
			// 3.发送
			Transport.send(msg);
			
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
}

发送带有附件的邮件

想发送带有附件的邮件,我们还要创建邮件内容"复合"对象,Multipart类的MimeMultipart实现类,然后再创建BodyPart类的MimeBodyPart实现类,textPart用于存储正文内容,调用setContent()方法,参数1为正文内容,参数2为内容类型;字符编码集。imagePart用于存储附件(本文的附件以图片为例),先调用setFileName()方法设置附件文件的显示名称(显示名称可以与图片原名不一致),再调用setDataHandler(),其中添加一个DataHandler()方法,使用Files工具类的readAllBytes()方法,可以把文件读取成字节数据, 最后,通过setContent()把Multipart添加到Message中,即可发送邮件。

如果我们需要抄送多个人一起发送时,可以选择通过创建一个InternetAddress[]数组把多个抄送人存入。

public class Demo04 {
	public static void main(String[] args) {
		try {
			// 1.创建Session
			Session session = JavaMailUtils.createsession();
			
			// 2.创建邮件对象(Message抽象类的子类对象)
			MimeMessage msg = new MimeMessage(session); // 传入session
			msg.setFrom(new InternetAddress("*********")); // 发件人
			msg.setRecipient(RecipientType.TO, new InternetAddress("*********")); // 发送人
			msg.setRecipients(RecipientType.CC, new InternetAddress[] {
					new InternetAddress("*********"),
					new InternetAddress("*********"),
					new InternetAddress("*********"),
			});

			msg.setSubject("这是一封来自好友的邮件","utf-8"); // 标题
			
			// 3.邮件内容"复合"对象
			Multipart multipart = new MimeMultipart();
			
			// 正文
			BodyPart textPart = new MimeBodyPart();
			// 参数1:正文内容
			// 参数2:内容类型;字符编码集
			textPart.setContent("<b>世界</b>和平!!!", "text/html;charset=utf-8");
			
			// 附件
			BodyPart imagePart = new MimeBodyPart();
			imagePart.setFileName("look.jpg"); // 设置附件文件的显示名称
			// 数据处理对象(读取附件文件从本地磁盘进行读取)
			imagePart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("D:\\net\\2.jpg")), 
									"application/octet-stream")));
			
			// 添加至邮件内容
			multipart.addBodyPart(textPart); // 添加正文
			multipart.addBodyPart(imagePart); // 添加附件
			
			// 设置邮件内容
			msg.setContent(multipart);
			
			// 3.发送
			Transport.send(msg);
			
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

发送正文带有内嵌的邮件

我们可以选择在邮件正文部分中用<img src=" cid=附属名">,附件名通过.setHeader("Content-ID", "<别名>")的方法设置。文章来源地址https://www.toymoban.com/news/detail-448217.html

public class Demo05 {
	public static void main(String[] args) {
		try {
			// 创建Session
			Session session = JavaMailUtils.createsession();
			
			// 创建邮件
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("*********"));
			msg.setRecipient(RecipientType.TO, new InternetAddress("*********"));
			msg.setRecipients(RecipientType.CC, new InternetAddress[] {
					new InternetAddress("*********"),
					new InternetAddress("*********"),
					new InternetAddress("*********"),
			});
			msg.setSubject("爱永不凋零!","utf-8");
			
			// 邮件正文部分
			BodyPart textBodyPart = new MimeBodyPart();
			StringBuilder body = new StringBuilder();
			body.append("<h1>世界和平</h1>");
			body.append("<img src=\"cid:jue\"/>"); // 通过内容ID引用附件图片
			textBodyPart.setContent(body.toString(), "text/html;charset=utf-8");
			
			// 邮件附件部分
			BodyPart imageBodyPart = new MimeBodyPart();
			imageBodyPart.setFileName("son.jpg"); // 读取名称
			imageBodyPart.setDataHandler( // 读取附件内容
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("D:\\net\\1.jpg")),
									"application/octet-stream")));
			imageBodyPart.setHeader("Content-ID", "<jue>");
			
			// 组合正文+附件
			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(textBodyPart); // 添加正文部分
			multipart.addBodyPart(imageBodyPart); // 添加附件部分
			
			// 设置邮件内容
			msg.setContent(multipart);
			
			// 发送
			Transport.send(msg);
			
		} catch (MessagingException | IOException e) {
			e.printStackTrace();
		}
		
	}
}

到了这里,关于用Java实现发送邮件——Java Email的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 100天精通Python丨办公效率篇 —— 11、Python自动化操作 Email(发送邮件、收邮件、邮箱客户端)

    大家好,我是你们的好朋友西红柿!今天咱们聊一聊关于Python怎么操作邮件的问题。这可是十分有用的技能啊,偏偏很多小伙伴们并不知道,还得费尽周折地查找资料呢。幸好我这个聪明伶俐的小家伙会给你们支招,让你们又快又好地掌握这门技能! 首先,你要掌握以SMTP协

    2023年04月17日
    浏览(41)
  • 邮件处理控件 Aspose.Email For Java 授权须知

    Aspose.Email 是用于轻松的开发 email 功能的应用程序的一组控件,基于  ASP.NET 的Web应用、Web服务和Windows 应用。支持 Outlook PST, EML, MSG, and MHT 格式. 允许开发者直接与 SMTP, POP, FTP, 和 MS Exchange 服务器进行工作。支持邮件合并、行事历、定制邮件标题和内容、嵌入文

    2024年02月16日
    浏览(46)
  • java实现发送邮件

    本文介绍下java实现邮件的发送,意在网站用户评论时能够及时通知站长和用户评论被回复后能够及时通知用户。 下文介绍下具体实现。 java实现 首先引入springboot的邮箱依赖 配置邮箱参数,这里以 qq邮箱 作为示例 此时就差不多了,接下来实现邮箱工具类 此时调用 MailUtil 里

    2024年02月16日
    浏览(46)
  • springboot(java)使用javamail实现邮件的接收、转发、发送、清除

    最近在弄邮件相关的功能,被搞的头大,很多找的方法根本不知道该怎么往下走,就目前为止, 经过各种的碰壁和失败,就整理出来如何使用javamail实现邮件的接收、转发、发送、清除 不单单是分享,也为我后续查找更方便做一个记录 在正式发送邮件之前,我们应该对邮件

    2024年02月04日
    浏览(43)
  • ews java + Oauth2实现office 365发送邮件

    引入maven包: com.microsoft.ews-java-api ews-java-api 2.0 使用office 365邮箱服务收发邮件有两种校验方式,一种是老的basic authentication, 这种方式目前已不建议使用,如下使用的是userName, password进行验证的方式。 public static boolean sendExchange(MailConfig mailInfo) { // The Exchange Server Version. 最新推

    2024年02月09日
    浏览(48)
  • JAVA之发送邮件

    一、导入依赖 二、发送普通文本 三、发送附件 一、导入依赖 二、发送普通文本 三、发送附件 方法一:通过POI读取数据库的数据,并生成excel,但不保存在本地文件,通过流的方式,作为附件并发送邮件 主要的代码如下: 全部代码如下: 方法二:将导出的数据生成文件,

    2024年02月13日
    浏览(40)
  • Java发送邮件 启用SSL

    使用的maven依赖: 配置文件 mail.properties 如下: 在Foxmail的配置如下: 代码如下:

    2024年04月26日
    浏览(39)
  • java ssl加密发送邮件

    通过25端口发送邮件不安全,改为ssl加密方式发送邮件,比较常见的2中实现类发送邮件如下所示。 使用该实现类发送邮件,ssl加密使用端口号为465,借助Properties类设置ssl的各种配置。 网上资料较少,自己记录一下。 修改application.yml文件配置 至于能否都采用第二种方式来实

    2024年02月12日
    浏览(53)
  • Java发送邮件一行代码解决

    今天博主带来一期超详细的邮件发送实操内容,希望能get到您的点赞!话不多说,直接进入正题。 在实践开始前,这里需要提到 Hutool ,Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率的工具类。 那么现在正式进入实战!首先创

    2024年02月02日
    浏览(53)
  • java 发送html 格式的邮件

    在 Java 中,可以使用 JavaMail API 来发送 HTML 格式的邮件。下面是一个简单的示例代码: 在上面的代码中,首先设置了收件人、发件人、发件人密码和邮件服务器的信息。然后设置了系统属性,包括邮件服务器、SMTP 认证、SMTP 端口和 SSL 连接。接着创建一个默认的 Session 对象,

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包