java邮件功能需要什么包?java 发送邮件 需要哪些jar包
大家好,今天小编来为大家解答以下的问题,关于java邮件功能需要什么包,java 发送邮件 需要哪些jar包这个很多人还不知道,现在让我们一起来看看吧!
java 发送邮件 需要哪些jar包
使用JavaMail发送邮件需要用到mail.jar和activtion.jar两个包。
该类实现了较完整的邮件发送功能,包括以HTML格式发送,添加附件和抄送人。下面是具体的代码:
packagecn.cgw.util.mail;
importjava.util.Properties;
importjavax.activation.DataHandler;
importjavax.activation.FileDataSource;
importjavax.mail.Address;
importjavax.mail.BodyPart;
importjavax.mail.Message;
importjavax.mail.Multipart;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
publicclassMail{
privateMimeMessagemimeMsg;//MIME邮件对象
privateSessionsession;//邮件会话对象
privatePropertiesprops;//系统属性
privatebooleanneedAuth=false;//smtp是否需要认证
//smtp认证用户名和密码
privateStringusername;
privateStringpassword;
privateMultipartmp;//Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
/**
*Constructor
*@paramsmtp邮件发送服务器
*/
publicMail(Stringsmtp){
setSmtpHost(smtp);
createMimeMessage();
}
/**
*设置邮件发送服务器
*@paramhostNameString
*/
publicvoidsetSmtpHost(StringhostName){
System.out.println("设置系统属性:mail.smtp.host="+hostName);
if(props==null)
props=System.getProperties();//获得系统属性对象
props.put("mail.smtp.host",hostName);//设置SMTP主机
}
/**
*创建MIME邮件对象
*@return
*/
publicbooleancreateMimeMessage()
{
try{
System.out.println("准备获取邮件会话对象!");
session=Session.getDefaultInstance(props,null);//获得邮件会话对象
}
catch(Exceptione){
System.err.println("获取邮件会话对象时发生错误!"+e);
returnfalse;
}
System.out.println("准备创建MIME邮件对象!");
try{
mimeMsg=newMimeMessage(session);//创建MIME邮件对象
mp=newMimeMultipart();
returntrue;
}catch(Exceptione){
System.err.println("创建MIME邮件对象失败!"+e);
returnfalse;
}
}
/**
*设置SMTP是否需要验证
*@paramneed
*/
publicvoidsetNeedAuth(booleanneed){
System.out.println("设置smtp身份认证:mail.smtp.auth="+need);
if(props==null)props=System.getProperties();
if(need){
props.put("mail.smtp.auth","true");
}else{
props.put("mail.smtp.auth","false");
}
}
/**
*设置用户名和密码
*@paramname
*@parampass
*/
publicvoidsetNamePass(Stringname,Stringpass){
username=name;
password=pass;
}
/**
*设置邮件主题
*@parammailSubject
*@return
*/
publicbooleansetSubject(StringmailSubject){
System.out.println("设置邮件主题!");
try{
mimeMsg.setSubject(mailSubject);
returntrue;
}
catch(Exceptione){
System.err.println("设置邮件主题发生错误!");
returnfalse;
}
}
/**
*设置邮件正文
*@parammailBodyString
*/
publicbooleansetBody(StringmailBody){
try{
BodyPartbp=newMimeBodyPart();
bp.setContent(""+mailBody,"text/html;charset=GBK");
mp.addBodyPart(bp);
returntrue;
}catch(Exceptione){
System.err.println("设置邮件正文时发生错误!"+e);
returnfalse;
}
}
/**
*添加附件
*@paramfilenameString
*/
publicbooleanaddFileAffix(Stringfilename){
System.out.println("增加邮件附件:"+filename);
try{
BodyPartbp=newMimeBodyPart();
FileDataSourcefileds=newFileDataSource(filename);
bp.setDataHandler(newDataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
returntrue;
}catch(Exceptione){
System.err.println("增加邮件附件:"+filename+"发生错误!"+e);
returnfalse;
}
}
/**
*设置发信人
*@paramfromString
*/
publicbooleansetFrom(Stringfrom){
System.out.println("设置发信人!");
try{
mimeMsg.setFrom(newInternetAddress(from));//设置发信人
returntrue;
}catch(Exceptione){
returnfalse;
}
}
/**
*设置收信人
*@paramtoString
*/
publicbooleansetTo(Stringto){
if(to==null)returnfalse;
try{
mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
returntrue;
}catch(Exceptione){
returnfalse;
}
}
/**
*设置抄送人
*@paramcopytoString
*/
publicbooleansetCopyTo(Stringcopyto)
{
if(copyto==null)returnfalse;
try{
mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));
returntrue;
}
catch(Exceptione)
{returnfalse;}
}
/**
*发送邮件
*/
publicbooleansendOut()
{
try{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在发送邮件....");
SessionmailSession=Session.getInstance(props,null);
Transporttransport=mailSession.getTransport("smtp");
transport.connect((String)props.get("mail.smtp.host"),username,password);
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));
//transport.send(mimeMsg);
System.out.println("发送邮件成功!");
transport.close();
returntrue;
}catch(Exceptione){
System.err.println("邮件发送失败!"+e);
returnfalse;
}
}
/**
*调用sendOut方法完成邮件发送
*@paramsmtp
*@paramfrom
*@paramto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@returnboolean
*/
publicstaticbooleansend(Stringsmtp,Stringfrom,Stringto,Stringsubject,Stringcontent,Stringusername,Stringpassword){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要验证
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
/**
*调用sendOut方法完成邮件发送,带抄送
*@paramsmtp
*@paramfrom
*@paramto
*@paramcopyto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@returnboolean
*/
publicstaticbooleansendAndCc(Stringsmtp,Stringfrom,Stringto,Stringcopyto,Stringsubject,Stringcontent,Stringusername,Stringpassword){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要验证
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setCopyTo(copyto))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
/**
*调用sendOut方法完成邮件发送,带附件
*@paramsmtp
*@paramfrom
*@paramto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@paramfilename附件路径
*@return
*/
publicstaticbooleansend(Stringsmtp,Stringfrom,Stringto,Stringsubject,Stringcontent,Stringusername,Stringpassword,Stringfilename){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要验证
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.addFileAffix(filename))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
/**
*调用sendOut方法完成邮件发送,带附件和抄送
*@paramsmtp
*@paramfrom
*@paramto
*@paramcopyto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@paramfilename
*@return
*/
publicstaticbooleansendAndCc(Stringsmtp,Stringfrom,Stringto,Stringcopyto,Stringsubject,Stringcontent,Stringusername,Stringpassword,Stringfilename){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要验证
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.addFileAffix(filename))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setCopyTo(copyto))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
}
用java来发送带附件的邮件
邮件发送也是一个老生常谈的问题了,代码虽然简单,但是许多小伙伴对过程不太理解,所以还是打算和各位小伙伴聊聊这个话题。
邮件协议
我们经常会听到各种各样的邮件协议,比如 SMTP、POP3、IMAP,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题。
SMTP是一个基于 TCP/IP的应用层协议,江湖地位有点类似于 HTTP,SMTP服务器默认监听的端口号为 25。看到这里,小伙伴们可能会想到既然 SMTP协议是基于 TCP/IP的应用层协议,那么我是不是也可以通过 Socket发送一封邮件呢?回答是肯定的。
生活中我们投递一封邮件要经过如下几个步骤:
深圳的小王先将邮件投递到深圳的邮局
深圳的邮局将邮件运送到上海的邮局
上海的小张来邮局取邮件
这是一个缩减版的生活中邮件发送过程。这三个步骤可以分别对应我们的邮件发送过程,假设从 aaa@qq.com发送邮件到 111@163.com:
aaa@qq.com先将邮件投递到腾讯的邮件服务器
腾讯的邮件服务器将我们的邮件投递到网易的邮件服务器
111@163.com登录网易的邮件服务器查看邮件
邮件投递大致就是这个过程,这个过程就涉及到了多个协议,我们来分别看一下。
SMTP协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件于 SMTP服务器之间,以及 SMTP服务器与 SMTP服务器之间的通信规则。
也就是说 aaa@qq.com用户先将邮件投递到腾讯的 SMTP服务器这个过程就使用了 SMTP协议,然后腾讯的 SMTP服务器将邮件投递到网易的 SMTP服务器这个过程也依然使用了 SMTP协议,SMTP服务器就是用来收邮件。
而 POP3协议全称为 Post Office Protocol,译作邮局协议,它定义了邮件客户端与 POP3服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP服务器之后, 111@163.com用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3邮件服务器来完成。
最后,可能也有小伙伴们听说过 IMAP协议,这个协议是对 POP3协议的扩展,功能更强,作用类似,这里不再赘述。
发送QQ邮件准备工作
首先我们需要先登录 QQ邮箱网页版,点击上方的设置按钮:
然后点击账户选项卡:
在账户选项卡中找到开启POP3/SMTP选项,如下:
点击开启,开启相关功能,开启过程需要手机号码验证,按照步骤操作即可,不赘述。开启成功之后,即可获取一个授权码,将该号码保存好,一会使用。
然后我们需要 JavaxMail这个 jar包,小伙伴可以直接去Maven中央仓库下载,这里不再赘述。
发送
简单邮件
如果我们只发送一个简单的文本,发送方式就比较简单,整个过程可以分为三步如下:
第一步:构造 SMTP邮件服务器的基本环境
Properties properties= new Properties();
properties.setProperty("mail.host","smtp.qq.com");
properties.setProperty("mail.transport.protocol","smtp");
properties.setProperty("mail.smtp.auth","true");
properties.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
properties.setProperty("mail.smtp.port","465");
Session session= Session.getDefaultInstance(properties);
session.setDebug(true);
第二步:构造邮件
MimeMessage mimeMessage= new MimeMessage(session);
mimeMessage.addRecipients(Message.RecipientType.TO,"111@qq.com");//设置收信人
mimeMessage.addRecipients(Message.RecipientType.CC,"222@qq.com");//抄送
mimeMessage.setFrom("1510161612@qq.com");//邮件发送人
mimeMessage.setSubject("测试邮件主题");//邮件主题
mimeMessage.setContent("Hello,这是一封测试邮件","text/html;charset=utf-8");//正文
第三步:发送邮件
Transport transport= session.getTransport();
transport.connect("smtp.qq.com","333@qq.com","刚刚申请到的授权码");
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());//发送邮件,第二个参数为收件人
transport.close();
复杂邮件
发送复杂邮件,第一步和第三步也是一样的,只有第二步构造邮件的过程比较麻烦,那么接下来给小伙伴们演示一个发送一封图文+两个附件的邮件。要发送复杂邮件,得先熟悉三个概念,如下:
MimeMessage:该类是个能理解MIME类型和头的电子邮件消息
MimeMultipart:该类定义了增加、删除以及获取邮件不同部分内容的方法
MimeBodyPart:该对象代表一个MimeMessage对象内容的一部分。每个MimeBodyPart被认为有两部分:MIME类型和匹配这个类型的内容
完整的邮件生成过程如下(第一步和第三步参考上文):
MimeMessage mimeMessage= new MimeMessage(session);
mimeMessage.addRecipients(Message.RecipientType.TO,"111@qq.com");//设置收信人
mimeMessage.addRecipients(Message.RecipientType.CC,"222@qq.com");//抄送
mimeMessage.setFrom("333@qq.com");//邮件发送人
mimeMessage.setSubject("测试邮件主题");//邮件主题
MimeMultipart mixed= new MimeMultipart("mixed");
mimeMessage.setContent(mixed);//设置整封邮件的MIME消息体为混合的组合关系
MimeBodyPart attach1= new MimeBodyPart();//创建附件1
MimeBodyPart attach2= new MimeBodyPart();//创建附件2
MimeBodyPart content= new MimeBodyPart();//创建邮件正文
mixed.addBodyPart(attach1);//将附件一添加到MIME消息体中
mixed.addBodyPart(attach2);//将附件二添加到MIME消息体中
mixed.addBodyPart(content);//将正文添加到消息体中
FileDataSource fds1= new FileDataSource(new File("C:\Users\sang\Desktop\1.png"));//构造附件一的数据源
DataHandler dh1= new DataHandler(fds1);//数据处理
attach1.setDataHandler(dh1);//设置附件一的数据源
attach1.setFileName("1.png");//设置附件一的文件名
//附件二的操作与附件一类似,这里就不一一注释了
FileDataSource fds2= new FileDataSource(new File("C:\Users\sang\Desktop\博客笔记.xlsx"));
DataHandler dh2= new DataHandler(fds2);
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText("博客笔记.xlsx"));//设置文件名时,如果有中文,可以通过MimeUtility类中的encodeText方法进行编码,避免乱码
MimeMultipart bodyMimeMultipart= new MimeMultipart("related");//设置正文的MIME类型
content.setContent(bodyMimeMultipart);//将bodyMimeMultipart添加到正文消息体中
MimeBodyPart bodyPart= new MimeBodyPart();//正文的HTML部分
bodyPart.setContent("<h1>Hello大家好,这是一封测试邮件<img src='cid:2.png'/></h1>","text/html;charset=utf-8");
MimeBodyPart picPart= new MimeBodyPart();//正文的图片部分
DataHandler dataHandler= new DataHandler(new FileDataSource("C:\Users\sang\Desktop\2.png"));
picPart.setDataHandler(dataHandler);
picPart.setContentID("2.png");
//将正文的HTML和图片部分分别添加到bodyMimeMultipart中
bodyMimeMultipart.addBodyPart(bodyPart);
bodyMimeMultipart.addBodyPart(picPart);
mimeMessage.saveChanges();
OK,Java Mail发送 QQ邮件就是这么简单,至于其他的如 163,sina等,写法类似,这里我就不赘述了。
昨天跟大家分享了Java极客技术知识星球的第一篇设计模式,作者就是今天文章的作者松哥,设计模式的分享文章下面已经展开了激烈的讨论,所以你还在等什么呢?欢迎到知识星球来,我们一起讨论,一起学习,一起进步。
Java收发邮件过程中具体的功能是怎么实现的
1.SMTP协议
用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
2.POP3协议
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
下图用于演示两帐户相互发送邮件的过程
3.1JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API:Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
3.2发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
3.3Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
4.邮件组织结构相关的API
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
5.具体的例子程序
packagecn.edu.dlmu.send;
importjava.util.Properties;
importjavax.activation.DataHandler;
importjavax.activation.FileDataSource;
importjavax.mail.Message;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
importjavax.mail.internet.MimeUtility;
publicclassSendMail{
publicstaticvoidmain(String[]args)throwsException{
Propertiesprop=newProperties();
//连接的邮件服务器的主机名
prop.setProperty("mail.smtp.host","smtp.sina.com.cn");
//发送邮件的协议
prop.setProperty("mail.transport.protocol","smtp");
//是否向邮件服务器提交认证
prop.setProperty("mail.smtp.auth","true");
//创建session
Sessionsession=Session.getInstance(prop);
session.setDebug(true);
//得到transport
Transportts=session.getTransport();
//连接邮件服务器
ts.connect("smtp.sina.com.cn","xxxx@sina.com","xxxxx");
//发送邮件
MimeMessagemessage=createMessage(session);
ts.sendMessage(message,message.getAllRecipients());
ts.close();
}
publicstaticMimeMessagecreateMessage(Sessionsession)throwsException{
MimeMessagemessage=newMimeMessage(session);
//设置邮件的基本信息
message.setFrom(newInternetAddress("xxxx@sina.com"));
message.setRecipient(Message.RecipientType.TO,newInternetAddress("1219070362@qq.com"));
message.setSubject("test");
//正文
MimeBodyParttext=newMimeBodyPart();
//设置charaset可以解决中文正文的乱码问题,内嵌可下载的图片
text.setContent("你好xxx,<imgsrc='c:/dog.jpg'/>测试成功!<br/><imgsrc='cid:aaa.jpg'/>","text/html;charset=gbk");
//图片1
MimeBodyPartimage=newMimeBodyPart();
image.setDataHandler(newDataHandler(newFileDataSource("src/88.jpg")));
image.setContentID("aaa.jpg");
//附件
MimeBodyPartattach=newMimeBodyPart();
DataHandlerdh=newDataHandler(newFileDataSource("src/javamail架包.jar"));
attach.setDataHandler(dh);
//解决文件中文乱码问题
attach.setFileName(MimeUtility.encodeText(dh.getName()));
//描述正文和图片的关系
MimeMultipartmp=newMimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(image);
mp.setSubType("related");
//描述正文和附件
MimeMultipartmp2=newMimeMultipart();
mp2.addBodyPart(attach);
//将正文封装为一个body
MimeBodyPartcontent=newMimeBodyPart();
content.setContent(mp);
mp2.addBodyPart(content);
mp2.setSubType("mixed");
message.setContent(mp2);
message.saveChanges();
returnmessage;
}
}
关于java邮件功能需要什么包的内容到此结束,希望对大家有所帮助。