失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【JAVA】使用javax.mail发送邮件

【JAVA】使用javax.mail发送邮件

时间:2019-05-04 23:23:35

相关推荐

【JAVA】使用javax.mail发送邮件

本文主要解决以下问题:

1、如何用java实现邮件发送功能?

2、如何发送给多个人、抄送给多个人?

3、如何发送携带附件的邮件?

开始说正文。

首先,发送邮件肯定要有个发件人,所有要有发件人的用户名和密码;然后得有服务器给中转吧,不同的邮箱对应的服务器也不一样,所以有邮件服务器的概念;再然后就是邮件本身,要有主题、收件人、抄送、正文、附件等等。

发件人的邮箱好说,随随便便就能申请到,可是邮件服务器呢?这里列出一些常用的邮件服务器(感谢数据的整理者):

[plain]view :POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25)sinaVIP:POP3服务器:pop3.(端口:110)SMTP服务器:smtp.(端口:25):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25)126邮箱:POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25)139邮箱:POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25)QQ邮箱POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25)QQ企业邮箱POP3服务器地址:pop.(SSL启用端口:995)SMTP服务器地址:smtp.(SSL启用端口:587/465):POP3服务器地址:pop.SMTP服务器地址:smtp.:POP3服务器地址:pop.(端口:995)SMTP服务器地址:smtp.(端口:587HotMailPOP3服务器地址:(端口:995)SMTP服务器地址:(端口:587)gmail()POP3服务器地址:(SSL启用端口:995)SMTP服务器地址:(SSL启用端口:587):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25):POP3服务器地址:.cn(端口:110)SMTP服务器地址:.cn(端口:25):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25)Foxmail:POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25):POP3服务器地址:(端口:110)SMTP服务器地址:(端口:25):POP3服务器地址:SMTP服务器地址:

好嘞,有了这个之后就开始今天的正事,讲讲怎么用java发送邮件,首先上原理(原文在此)。

JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。

JavaMail可以到/technetwork/java/javamail/index-138643.html进行下载,并将mail.jar添加到classpath即可。如果你使用的是JAVA EE SDK,则可以在C:\glassfishv3\glassfish\modules\mail.jar找到所需的jar包,同样需要添加的classpath。

JAVA邮件发送的大致过程是这样的的:

1、构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。

2、构建一个properties文件,该文件中存放SMTP服务器地址等参数。

3、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。

4、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。

5、使用javax.mail.Transport工具类发送邮件。

接下来上干货

[java]view plaincopyimportjava.util.Iterator;importjava.util.LinkedList;importjava.util.List;importjava.util.Properties;importjavax.activation.DataHandler;importjavax.activation.FileDataSource;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;importjavax.mail.internet.MimeUtility;publicclassEmail{privatestaticStringdefaultSenderName="";//默认的发件人用户名,defaultEntity用得到privatestaticStringdefaultSenderPass="";//默认的发件人密码,defaultEntity用得到privatestaticStringdefaultSmtpHost="";//默认的邮件服务器地址,defaultEntity用得到privateStringsmtpHost;//邮件服务器地址privateStringsendUserName;//发件人的用户名privateStringsendUserPass;//发件人密码privateMimeMessagemimeMsg;//邮件对象privateSessionsession;privatePropertiesprops;privateMultipartmp;//附件添加的组件privateList<FileDataSource>files=newLinkedList<FileDataSource>();//存放附件文件privatevoidinit(){if(props==null){props=System.getProperties();}props.put("mail.smtp.host",smtpHost);props.put("mail.smtp.auth","true");//需要身份验证session=Session.getDefaultInstance(props,null);//置true可以在控制台(console)上看到发送邮件的过程session.setDebug(true);//用session对象来创建并初始化邮件对象mimeMsg=newMimeMessage(session);//生成附件组件的实例mp=newMimeMultipart();}privateEmail(StringsmtpHost,StringsendUserName,StringsendUserPass,Stringto,Stringcc,StringmailSubject,StringmailBody,List<String>attachments){this.smtpHost=smtpHost;this.sendUserName=sendUserName;this.sendUserPass=sendUserPass;init();setFrom(sendUserName);setTo(to);setCC(cc);setBody(mailBody);setSubject(mailSubject);if(attachments!=null){for(Stringattachment:attachments){addFileAffix(attachment);}}}/***邮件实体**@paramsmtpHost*邮件服务器地址*@paramsendUserName*发件邮件地址*@paramsendUserPass*发件邮箱密码*@paramto*收件人,多个邮箱地址以半角逗号分隔*@paramcc*抄送,多个邮箱地址以半角逗号分隔*@parammailSubject*邮件主题*@parammailBody*邮件正文*@paramattachmentPath*附件路径*@return*/publicstaticEmailentity(StringsmtpHost,StringsendUserName,StringsendUserPass,Stringto,Stringcc,StringmailSubject,StringmailBody,List<String>attachments){returnnewEmail(smtpHost,sendUserName,sendUserPass,to,cc,mailSubject,mailBody,attachments);}/***默认邮件实体,用了默认的发送帐号和邮件服务器**@paramto*收件人,多个邮箱地址以半角逗号分隔*@paramcc*抄送,多个邮箱地址以半角逗号分隔*@paramsubject*邮件主题*@parambody*邮件正文*@paramattachment*附件全路径*@return*/publicstaticEmaildefaultEntity(Stringto,Stringcc,Stringsubject,Stringbody,List<String>attachments){returnnewEmail(defaultSmtpHost,defaultSenderName,defaultSenderPass,to,cc,subject,body,attachments);}/***设置邮件主题**@parammailSubject*@return*/privatebooleansetSubject(StringmailSubject){try{mimeMsg.setSubject(mailSubject);}catch(Exceptione){returnfalse;}returntrue;}/***设置邮件内容,并设置其为文本格式或HTML文件格式,编码方式为UTF-8**@parammailBody*@return*/privatebooleansetBody(StringmailBody){try{BodyPartbp=newMimeBodyPart();bp.setContent("<metahttp-equiv=Content-Typecontent=text/html;charset=UTF-8>"+mailBody,"text/html;charset=UTF-8");//在组件上添加邮件文本mp.addBodyPart(bp);}catch(Exceptione){System.err.println("设置邮件正文时发生错误!"+e);returnfalse;}returntrue;}/***添加一个附件**@paramfilename*邮件附件的地址,只能是本机地址而不能是网络地址,否则抛出异常*@return*/publicbooleanaddFileAffix(Stringfilename){try{if(filename!=null&&filename.length()>0){BodyPartbp=newMimeBodyPart();FileDataSourcefileds=newFileDataSource(filename);bp.setDataHandler(newDataHandler(fileds));bp.setFileName(MimeUtility.encodeText(fileds.getName(),"utf-8",null));//解决附件名称乱码mp.addBodyPart(bp);//添加附件files.add(fileds);}}catch(Exceptione){System.err.println("增加邮件附件:"+filename+"发生错误!"+e);returnfalse;}returntrue;}/***删除所有附件**@return*/publicbooleandelFileAffix(){try{FileDataSourcefileds=null;for(Iterator<FileDataSource>it=files.iterator();it.hasNext();){fileds=it.next();if(fileds!=null&&fileds.getFile()!=null){fileds.getFile().delete();}}}catch(Exceptione){returnfalse;}returntrue;}/***设置发件人地址**@paramfrom*发件人地址*@return*/privatebooleansetFrom(Stringfrom){try{mimeMsg.setFrom(newInternetAddress(from));}catch(Exceptione){returnfalse;}returntrue;}/***设置收件人地址**@paramto收件人的地址*@return*/privatebooleansetTo(Stringto){if(to==null)returnfalse;try{mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));}catch(Exceptione){returnfalse;}returntrue;}/***设置抄送**@paramcc*@return*/privatebooleansetCC(Stringcc){if(cc==null){returnfalse;}try{mimeMsg.setRecipients(,InternetAddress.parse(cc));}catch(Exceptione){returnfalse;}returntrue;}/***发送邮件**@return*/publicbooleansend()throwsException{mimeMsg.setContent(mp);mimeMsg.saveChanges();System.out.println("正在发送邮件....");Transporttransport=session.getTransport("smtp");//连接邮件服务器并进行身份验证transport.connect(smtpHost,sendUserName,sendUserPass);//发送邮件transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));System.out.println("发送邮件成功!");transport.close();returntrue;}}

我自己写的一个封装的Email类,提供了两个静态的方法获取实体,send方法用来发送邮件,附上测试代码

[java]view plaincopyimportjava.util.Arrays;importjava.util.List;importorg.junit.Test;importsmok.springmvc.model.Email;publicclassEmailTest{@TestpublicvoidsendEmail()throwsException{StringuserName="11111111@";//发件人邮箱Stringpassword="********";//发件人密码StringsmtpHost="";//邮件服务器Stringto="22222222@";//收件人,多个收件人以半角逗号分隔Stringcc="33333333@";//抄送,多个抄送以半角逗号分隔Stringsubject="这是邮件的主题";//主题Stringbody="这是邮件的正文";//正文,可以用html格式的哟List<String>attachments=Arrays.asList("D:\\tmp\\1.png","D:\\tmp\\2.png");//附件的路径,多个附件也不怕Emailemail=Email.entity(smtpHost,userName,password,to,cc,subject,body,attachments);email.send();//发送!}}

直接粘代码可是会报错的,这里边依赖了几个包,我把pom也放上来[html]view plaincopy<spanstyle="white-space:pre"></span><dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.2</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>com.sun.mail</groupId><artifactId>smtp</artifactId><version>1.5.2</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>com.sun.mail</groupId><artifactId>mailapi</artifactId><version>1.5.2</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency>

到这里应该已经解决了开头提到的三个问题了

1、发送邮件,ok

2、发送给多个人,只有以半角逗号分隔收件人就可以了,抄送也是一样的方式

3、发送附件,只要有文件的全路径,发送多个文件也没问题呀~

总算是把发邮件这个事情搞定了,以后遇到cover不到的情况再来补充。

如果觉得《【JAVA】使用javax.mail发送邮件》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。