Java如何编写代码实现电子邮箱发送功能?

2026-05-22 06:311阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2055个文字,预计阅读时间需要9分钟。

Java如何编写代码实现电子邮箱发送功能?

邮件发送服务器与传输协议+需在网络上实现邮件功能,须有专业的邮件服务器。这些邮件服务器类似现实生活中的邮局,主要责任是接收用户投递的邮件,并将邮件投递出去。

邮件发送 邮件服务器与传输协议

要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

SMTP协议:

Java如何编写代码实现电子邮箱发送功能?

通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

POP3协议:

通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

工作原理:

步骤:

①发信人调用用户代理来撰写和编辑要发送的邮件。用户代理用SMTP协议把邮件传送给发送方邮件服务器
发送方邮件服务器将邮件放入邮件缓存队列中,等待发送
③运行在发送方邮件服务器的SMTP客户进程,发现邮件缓存中有待发送的邮件,就向运行在接收方邮件服务器的SMTP服务器进程发起建立TCP连接
TCP连接建立后,SMTP客户进程开始向远程SMTP服务器进程发送邮件。当所有待发送邮件发完后,SMTP就关闭所建立的TCP连接。
⑤运行在接收方邮件服务器中的SMTP服务器进程收到邮件后,将邮件放入收信人的用户邮箱,等待收信人在方便时进行读取。
收信人打算收信时,调用用户代理,使用POP3(或IMAP)协议将自己的邮件从接收方邮件服务器的用户邮箱中取回(如果邮箱中有来信的话)。

邮箱提供的支持:

我们需要到邮箱设置中开开启POP3/SMTP服务 , 获取授权码 , 如下以QQ邮箱为例,

QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)

Java第三方库

我们可以调用activation-1.1.1.jar , mail-1.4.7.jar 第三方库使用java实现发送邮箱功能

Maven导入:

<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <!-- mvnrepository.com/artifact/javax.mail/javax.mail-api --> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.2</version> </dependency> </dependencies> 工作流程:

代码实现: 普通文本邮件发送:

import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class Demo1 { public static void main(String[] args) throws MessagingException { Properties properties = new Properties(); properties.setProperty("mail.host","smtp.qq.com");///设置QQ邮件SMTP服务器 properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议 properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication //以前QQ邮箱需要设置SSL加密 , 现在不需要了 // MailSSLSocketFactory sf=new MailSSLSocketFactory(); // sf.setTrustAllHosts(true); // properties.put("mail.smtp.ssl.enable","true"); // properties.put("mail.smtp.ssl.socketFactory",sf); //1.创建定义整个应用程序所需要的环境信息的session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 设置链接SMTP服务器的用户邮箱,即发送者的邮箱 return new PasswordAuthentication("318482536@qq.com","邮箱厂商提供的校验码"); } }); //开启session的debug模式,这样可以查看到程序发送Email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport ts=session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com","318482536@qq.com","邮箱厂商提供的校验码"); //4.创建邮件:写文件 //注意需要传递session MimeMessage message=new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("318482536@qq.com")); //指明邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("318482536@qq.com")); //邮件标题 message.setSubject("邮件标题"); //邮件的文本内容 message.setContent("文件内容","text/html;charset=UTF-8"); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); } } 文本内嵌图片邮件发送:

多用途互联网邮件扩展(英语:Multipurpose Internet Mail Extensions,缩写:MIME)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:

  • 非ASCII字符文本;
  • 非文本格式附件(二进制、声音、图像等);
  • 由多部分(multiple parts)组成的消息体;
  • 包含非ASCII字符的头信息(Header information)。这个标准被定义在 RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049 等RFC中。

在上面普通文本文件的基础上,在设置邮件内容时,追加如下代码即可

//设置邮件的文本内容 //=================================准备图片数据======================================= MimeBodyPart image=new MimeBodyPart(); //图片需要经过数据化的处理 DataHandler dh=new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg")); //在part中放入这个处理过图片的数据 image.setDataHandler(dh); //给这个part设置一个ID名字 image.setContentID("bz.jpg"); //准备正文的数据 MimeBodyPart text=new MimeBodyPart(); text.setContent("这是一张正文<img src='cid:bz.jpg'>","text/html;charset=UTF-8"); //描述数据关系 MimeMultipart mm=new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //设置消息内容, 并且保存数据关系 message.setContent(mm); message.saveChanges(); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); 附件邮件发送:

在普通本文邮件的基础上添加如下内容即可:

/*************设置邮件的文本内容***********************/ //正文 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封带有附件的邮件","text/html;charset=utf-8"); //附件 MimeBodyPart appendix = new MimeBodyPart(); appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg"))); appendix.setFileName("附件文件名.jpeg"); // 拼接邮件内容 MimeMultipart allContent = new MimeMultipart(); allContent.addBodyPart(appendix);//附件 allContent.addBodyPart(text);//正文 allContent.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed message.setContent(allContent); message.saveChanges(); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); 封装好的工具类:

import javax.mail.*; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class MailUtil { public String addresser; //发送者邮箱名 public String hostName; // 邮箱主机名 private String checkCode; // 校验码 private Properties properties; // 配置 private Session session; private Transport transport; private boolean isDebug = false; // 默认用QQ发送 public void properties(){ properties("smtp.qq.com"); } //配置需要发送的邮箱类型,QQ ,163等 public void properties(String mailHost){ this.hostName = mailHost; properties = new Properties(); properties.setProperty("mail.host",mailHost);///设置QQ邮件SMTP服务器 properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议 properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication } //设置发送者的邮箱信息,如邮箱名, 校验码,是否打印deBug日志 public void senderInfo(String addresser,String checkCode,boolean isDebug) throws MessagingException { this.addresser = addresser; this.checkCode = checkCode; this.session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(addresser,checkCode); } }); this.transport = session.getTransport(); this.transport.connect(addresser,checkCode); } // 发送普通文本邮件 public void sendTextMailMessage(String recipients,String mailTitle,String mailContent) throws MessagingException { MimeMessage message=new MimeMessage(this.session); //设置邮件的发件人 message.setFrom(new InternetAddress(this.addresser)); //设置邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(recipients)); //邮件标题 message.setSubject(mailTitle); //邮件的文本内容 message.setContent(mailContent,"text/html;charset=UTF-8"); //5.发送邮件 this.transport.sendMessage(message,message.getAllRecipients()); //6.关闭连接 this.transport.close(); } }

通过工具类使用:

// 1.创建工具类对象 MailUtil mailUtil = new MailUtil(); // 2.设置服务器主机名 mailUtil.properties(); //默认用QQ邮箱发送,也可以通过有参方法设置别的邮箱发送,设置成别的邮箱服务器主机名即可 //mailUtil.properties("服务器主机名"); // 3.设置发送邮件的相关信息 mailUtil.senderInfo("发送者的邮箱名","邮箱服务厂商提供的校验码",true); //设置发送者的信息 mailUtil.sendTextMailMessage("收件人的邮箱名","邮件标题","邮件内容"); // 设置需要发送的内容标题等信息

本文共计2055个文字,预计阅读时间需要9分钟。

Java如何编写代码实现电子邮箱发送功能?

邮件发送服务器与传输协议+需在网络上实现邮件功能,须有专业的邮件服务器。这些邮件服务器类似现实生活中的邮局,主要责任是接收用户投递的邮件,并将邮件投递出去。

邮件发送 邮件服务器与传输协议

要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

SMTP协议:

Java如何编写代码实现电子邮箱发送功能?

通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

POP3协议:

通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

工作原理:

步骤:

①发信人调用用户代理来撰写和编辑要发送的邮件。用户代理用SMTP协议把邮件传送给发送方邮件服务器
发送方邮件服务器将邮件放入邮件缓存队列中,等待发送
③运行在发送方邮件服务器的SMTP客户进程,发现邮件缓存中有待发送的邮件,就向运行在接收方邮件服务器的SMTP服务器进程发起建立TCP连接
TCP连接建立后,SMTP客户进程开始向远程SMTP服务器进程发送邮件。当所有待发送邮件发完后,SMTP就关闭所建立的TCP连接。
⑤运行在接收方邮件服务器中的SMTP服务器进程收到邮件后,将邮件放入收信人的用户邮箱,等待收信人在方便时进行读取。
收信人打算收信时,调用用户代理,使用POP3(或IMAP)协议将自己的邮件从接收方邮件服务器的用户邮箱中取回(如果邮箱中有来信的话)。

邮箱提供的支持:

我们需要到邮箱设置中开开启POP3/SMTP服务 , 获取授权码 , 如下以QQ邮箱为例,

QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)

Java第三方库

我们可以调用activation-1.1.1.jar , mail-1.4.7.jar 第三方库使用java实现发送邮箱功能

Maven导入:

<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <!-- mvnrepository.com/artifact/javax.mail/javax.mail-api --> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.2</version> </dependency> </dependencies> 工作流程:

代码实现: 普通文本邮件发送:

import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class Demo1 { public static void main(String[] args) throws MessagingException { Properties properties = new Properties(); properties.setProperty("mail.host","smtp.qq.com");///设置QQ邮件SMTP服务器 properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议 properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication //以前QQ邮箱需要设置SSL加密 , 现在不需要了 // MailSSLSocketFactory sf=new MailSSLSocketFactory(); // sf.setTrustAllHosts(true); // properties.put("mail.smtp.ssl.enable","true"); // properties.put("mail.smtp.ssl.socketFactory",sf); //1.创建定义整个应用程序所需要的环境信息的session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 设置链接SMTP服务器的用户邮箱,即发送者的邮箱 return new PasswordAuthentication("318482536@qq.com","邮箱厂商提供的校验码"); } }); //开启session的debug模式,这样可以查看到程序发送Email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport ts=session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com","318482536@qq.com","邮箱厂商提供的校验码"); //4.创建邮件:写文件 //注意需要传递session MimeMessage message=new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("318482536@qq.com")); //指明邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("318482536@qq.com")); //邮件标题 message.setSubject("邮件标题"); //邮件的文本内容 message.setContent("文件内容","text/html;charset=UTF-8"); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); } } 文本内嵌图片邮件发送:

多用途互联网邮件扩展(英语:Multipurpose Internet Mail Extensions,缩写:MIME)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:

  • 非ASCII字符文本;
  • 非文本格式附件(二进制、声音、图像等);
  • 由多部分(multiple parts)组成的消息体;
  • 包含非ASCII字符的头信息(Header information)。这个标准被定义在 RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049 等RFC中。

在上面普通文本文件的基础上,在设置邮件内容时,追加如下代码即可

//设置邮件的文本内容 //=================================准备图片数据======================================= MimeBodyPart image=new MimeBodyPart(); //图片需要经过数据化的处理 DataHandler dh=new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg")); //在part中放入这个处理过图片的数据 image.setDataHandler(dh); //给这个part设置一个ID名字 image.setContentID("bz.jpg"); //准备正文的数据 MimeBodyPart text=new MimeBodyPart(); text.setContent("这是一张正文<img src='cid:bz.jpg'>","text/html;charset=UTF-8"); //描述数据关系 MimeMultipart mm=new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //设置消息内容, 并且保存数据关系 message.setContent(mm); message.saveChanges(); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); 附件邮件发送:

在普通本文邮件的基础上添加如下内容即可:

/*************设置邮件的文本内容***********************/ //正文 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封带有附件的邮件","text/html;charset=utf-8"); //附件 MimeBodyPart appendix = new MimeBodyPart(); appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg"))); appendix.setFileName("附件文件名.jpeg"); // 拼接邮件内容 MimeMultipart allContent = new MimeMultipart(); allContent.addBodyPart(appendix);//附件 allContent.addBodyPart(text);//正文 allContent.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed message.setContent(allContent); message.saveChanges(); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); 封装好的工具类:

import javax.mail.*; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class MailUtil { public String addresser; //发送者邮箱名 public String hostName; // 邮箱主机名 private String checkCode; // 校验码 private Properties properties; // 配置 private Session session; private Transport transport; private boolean isDebug = false; // 默认用QQ发送 public void properties(){ properties("smtp.qq.com"); } //配置需要发送的邮箱类型,QQ ,163等 public void properties(String mailHost){ this.hostName = mailHost; properties = new Properties(); properties.setProperty("mail.host",mailHost);///设置QQ邮件SMTP服务器 properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议 properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication } //设置发送者的邮箱信息,如邮箱名, 校验码,是否打印deBug日志 public void senderInfo(String addresser,String checkCode,boolean isDebug) throws MessagingException { this.addresser = addresser; this.checkCode = checkCode; this.session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(addresser,checkCode); } }); this.transport = session.getTransport(); this.transport.connect(addresser,checkCode); } // 发送普通文本邮件 public void sendTextMailMessage(String recipients,String mailTitle,String mailContent) throws MessagingException { MimeMessage message=new MimeMessage(this.session); //设置邮件的发件人 message.setFrom(new InternetAddress(this.addresser)); //设置邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(recipients)); //邮件标题 message.setSubject(mailTitle); //邮件的文本内容 message.setContent(mailContent,"text/html;charset=UTF-8"); //5.发送邮件 this.transport.sendMessage(message,message.getAllRecipients()); //6.关闭连接 this.transport.close(); } }

通过工具类使用:

// 1.创建工具类对象 MailUtil mailUtil = new MailUtil(); // 2.设置服务器主机名 mailUtil.properties(); //默认用QQ邮箱发送,也可以通过有参方法设置别的邮箱发送,设置成别的邮箱服务器主机名即可 //mailUtil.properties("服务器主机名"); // 3.设置发送邮件的相关信息 mailUtil.senderInfo("发送者的邮箱名","邮箱服务厂商提供的校验码",true); //设置发送者的信息 mailUtil.sendTextMailMessage("收件人的邮箱名","邮件标题","邮件内容"); // 设置需要发送的内容标题等信息