Java Email-用Java实现发送电子邮件
首先我们需要了解几个概念
邮件协议
常见的邮件协议有:POP3、SMTP、IMAP。
POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。(与IMAP有什么不同?)
SMTP
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留 在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。
IMAP和POP3的区别
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
用java实现邮件的发送具体操作如下:
一、首先需要创建一个JavaMailUtils类,其中包含返回值是session的createSession()的方法,
目的是方便之后创建session对象
方法主要包含SMTP服务器的连接信息:
SMTP服务器地址、SMTP服务器的连接信息、主机端口号等
和用户认证对象(Authenticator接口的匿名实现类)
其中包含邮箱地址和密码(授权密码)
代码如下:
package com.gjh.demo;import java.util.Properties;import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;public class JavaMailUtils {public static Session createSession() {//SMTP服务器地址String smtp= "smtp.126.com";//邮箱地址和密码(授权密码)String userName="blabalaguo@126.com";String password="CFBZUPMOEAAAAAAA";//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(){ @Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(userName, password);}});//开启调试模式session.setDebug(true);return session;}
}
————————————————————————————————————
二、创建session对象后,进行具体代码的编写,在发送的邮件内容只有文字时,仅需要将session传入创建MimeMessage对象(例如名为msg)方法的参数中,并且msg需要调用四个方法,分别是
msg.setFrom() 传入发件人邮箱
msg.setRecipient(RecipientType.TO, new InternetAddress("1722076119@qq.com")) 传入收件人邮箱
RecipientType.TO表示第二个参数是收件人邮箱
RecipientType.CC表示第二个参数是抄送人邮箱
msg.setSubject() 传入要发送的邮件的标题
msg.setText() 传入要发送的邮件的标题
具体实现代码如下:
package com.gjh.demo;import com.gjh.demo.JavaMailUtils;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;public class Text02 {public static void main(String[] args) {try {//创建Session回话Session session=JavaMailUtils.createSession();MimeMessage msg=new MimeMessage(session);msg.setFrom(new InternetAddress("blabalaguo@126.com"));msg.setRecipient(RecipientType.TO, new InternetAddress("1722076119@qq.com"));msg.setSubject("这是标题","utf-8");msg.setText("这是内容","utf-8");//发送Transport.send(msg);} catch (MessagingException e) {e.printStackTrace();}}
}
——————————————————————————————————————-
三:当我们需要将邮件内容的某些字加粗时,要在需要加粗的文本两边加入标签分别是<b> 和</b>,同时需要加入第三个参数:html,这样才能识别出表示加粗的标签
msg.setText("这是<b>内容</b>","utf-8","html"); //正文
——————————————————————————————————-
四、当我们写的邮件内容不仅包括文本,还包括带有图片的附件时
我们就不能用msg.setText()了,这时我们用的是msg.setContent()方法,在这个方法中要传入的参数是Multipart的对象(例如名为multipart)
并且需要创建两个BodyPart对象(例如名为textPart和imagePart),
顾名思义,textPart调用setContent()方法来添加邮件的文本内容部分,
imagePart调用setFileName()方法来添加附件的名字,调用setDataHandler()方法来添加作为附件的图片
其中MimeMessage、Multipart、BodyPart的关系:msg>multipart>bodyPart
BodyPart的对象在添加内容后被传入multipart的addBodyPart()方法的参数中
接着multipart传入msg的setContent()方法的参数中
在包括附件的情况下,try-catch块需要捕获IOException,否则获得图片的方法调用会报错
代码如下:
package com.gjh.demo;import com.gjh.demo.JavaMailUtils;
import com.sun.xml.internal.ws.util.ByteArrayDataSource;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Enumeration;import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.Header;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;public class Text04 {public static void main(String[] args) {try {//1.创建Session会话Session session=JavaMailUtils.createSession();//2.创建邮件对象(Message抽象类的子类对象)MimeMessage msg=new MimeMessage(session); //传入sessionmsg.setFrom(new InternetAddress("blabalaguo@126.com")); //发件人msg.setRecipient(RecipientType.TO, new InternetAddress("1722076119@qq.com")); //收件人 msg.setSubject("这是标题","utf-8"); //标题//3.邮件内容“复合”对象Multipart multipart=new MimeMultipart();//正文BodyPart textPart=new MimeBodyPart();textPart.setContent("嘿嘿", "text/html;charset=utf-8");//附件BodyPart imagePart=new MimeBodyPart();imagePart.setFileName("shou.jpg");imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\86178\\Pictures\\Camera Roll\\151-1G204103113.jpg")), "applicationg/octet-stream")));//添加至邮件内容multipart.addBodyPart(textPart);multipart.addBodyPart(imagePart);//设置邮件内容msg.setContent(multipart);//发送Transport.send(msg);} catch (MessagingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}
}
——————————————————————————————————————-
五、当需要把图片放入邮件的内容,而不是附件的时候
用StringBuilder创建str数组来放置textBody中的文本内容
StringBuilder str=new StringBuilder();
str.append("<h1>嘿嘿</h1>");
str.append("<img src=\"cid:xiao\"/>");
textBodyPart.setContent(str.toString(), "text/html;charset=utf-8");
imagBodyPart调用setHeader()的方法时,第一个参数是指定的
具体代码如下:
package com.gjh.demo;import java.io.IOException;
import java.net.InetAddress;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;import com.sun.xml.internal.ws.util.ByteArrayDataSource;public class Text05 {public static void main(String[] args) {try {Session session=JavaMailUtils.createSession();MimeMessage msg=new MimeMessage(session);msg.setFrom(new InternetAddress("blabalaguo@126.com"));msg.setRecipient(RecipientType.TO, new InternetAddress("1722076119@qq.com"));msg.setSubject("这是标题", "utf-8");BodyPart textBodyPart=new MimeBodyPart();StringBuilder str=new StringBuilder();str.append("<h1>嘿嘿</h1>");str.append("<img src=\"cid:xiaoguoguo\"/>");textBodyPart.setContent(str.toString(), "text/html;charset=utf-8");//邮件附件部分BodyPart imagBodyPart=new MimeBodyPart();imagBodyPart.setFileName("biu.jpg");imagBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("C:\\Users\\86178\\Pictures\\Camera Roll\\151-1G204103113.jpg")),"application/octet-stream")));imagBodyPart.setHeader("Content-ID", "xiaoguoguo");Multipart multipart=new MimeMultipart();multipart.addBodyPart(textBodyPart);multipart.addBodyPart(imagBodyPart);msg.setContent(multipart);Transport.send(msg);} catch (MessagingException | IOException e) {e.printStackTrace();}}}
Java Email-用Java实现发送电子邮件相关推荐
- Java 使用JavaMail通过Gmail发送电子邮件
JavaMail提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API可以方便地执行一些常用的邮件传输.可以基于JavaMail开发出类似于Microsoft Outloo ...
- java使用javax.mail包发送电子邮件:设置账号、密码、主题、文本、附件
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 docker/kubernetes入门视频教程 全栈工程师开发手册 (作者:栾鹏) java ...
- Java中使用SMTP协议发送电子邮件
Java中使用SMTP协议发送电子邮件的具体的步骤: 1.首先需要获取发送邮件的Session对象 Session session = Session.getDefaultInstance(prope ...
- SpringBoot整合:Druid、MyBatis、MyBatis-Plus、多数据源、knife4j、日志、Redis,Redis的Java操作工具类、封装发送电子邮件等等
SpringBoot笔记 一.SpringBoot 介绍 1.1.SpringBoot简介 SpringBoot 是一个快速开发的框架, 封装了Maven常用依赖.能够快速的整合第三方框架:简化XML ...
- JAVA Email——利用java完成发送电子邮件(包括附件)
考虑这个问题之前我们先来看一下传统的邮件是如何发送的.传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱.电子邮件的发送过程也是类似 的,只不过是电子邮件是从用户电脑的邮件软件, ...
- java email qq邮箱 与 阿里企业邮箱/个人邮箱
贴一个例子仅供参考 QQ邮箱 import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail. ...
- nodemailer使用_如何使用Nodemailer使用HTML作为内容发送电子邮件 Node.js
nodemailer使用 Prerequisite: 先决条件: How to send emails using Nodemailer | Node.js 如何使用Nodemailer发送电子邮件. ...
- spring smtp_使用Spring使用Java发送电子邮件– GMail SMTP服务器示例
spring smtp 对于使用Java发送电子邮件, JavaMail API是标准解决方案. 如官方网页所述," JavaMail API提供了独立于平台和协议的框架来构建邮件和消息传递 ...
- 使用Spring使用Java发送电子邮件– GMail SMTP服务器示例
对于使用Java发送电子邮件, JavaMail API是标准解决方案. 如官方网页所述," JavaMail API提供了独立于平台和协议的框架来构建邮件和消息传递应用程序". ...
- java 使用 Amazon SES 发送电子邮件
java 使用 Amazon SES发送电子邮件,有三种方式,具体哪三种请移步这里. 这里只介绍一种:利用Amazon SES 的 SMTP 服务,javax.mail发送邮件.此方法也可以直接用于1 ...
最新文章
- C#使用 SharpSSH
- SAP MM MB5L事务代码'仅总计'选项初探
- C++ 继承和派生 及 学生管理范例
- ZooKeeper布式集群安装及使用
- 【转载】SAP参数文件简介
- JavaScript学习(十)
- golang处理kill命令总结
- Spring+jpaNo transactional EntityManager available
- mysql mongodb插件_FLinkX的Mongodb插件优化(三)
- linux 驱动读写文件,Linux下读写寄存器
- linux中删除mysql用户_linux系统下mysql添加用户、删除用户、授权、修改密码等sql命令使用...
- 《恋上数据结构第1季》红黑树(未完)
- Linq之动态条件(1)
- 项目组织结构以及模块规划
- 小型bbs论坛系统开发1 需求分析
- web前端网页界面/css 仿微软官网界面
- 多层次细节(Level of detail)
- HUAWEI 机试题:工厂流水线调度
- 勾股定理用计算机怎用,勾股定理公式计算器
- 41份艾媒舆情-舆情相关行业报告