javamail实例
- 格式:docx
- 大小:15.69 KB
- 文档页数:4
SpringBoot整合JavaMail通过阿⾥云企业邮箱发送邮件的实现JavaMail是Java开发中邮件处理的开源类库,⽀持常⽤协议如:SMTP、POP3、IMAP⼀、SpringBoot整合1、需要在pom⽂件中添加依赖spring-boot-starter-mail<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>构建项⽬,加载相关jar包2、在application.yml中配置邮件发送的相关信息spring:mail:host: #阿⾥云发送服务器地址port: 25 #端⼝号username: XXX@ #发送⼈地址password: ENC(Grg2n2TYzgJv9zpwufsf37ndTe+M1cYk) #密码3、编写邮件发送⼯具类MailUtilMailUtil.java/*** @author chenzan* @version V1.0* @description 邮件发送*/@Componentpublic class MailUtil {@AutowiredJavaMailSendermailSender;@AutowiredMailPropertiesmailProperties;/*** 发送邮件测试⽅法*/public void sendMail(MailBean mailBean) {SimpleMailMessage mimeMessage =new SimpleMailMessage();mimeMessage.setFrom(mailProperties.getUsername());mimeMessage.setTo(mailBean.getToAccount());mimeMessage.setSubject(mailBean.getSubject());mimeMessage.setText(mailBean.getContent());mailSender.send(mimeMessage);}/*** 发送邮件-附件邮件* @param boMailBean*/public boolean sendMailAttachment(MailBean mailBean) {try {MimeMessage mimeMessage =mailSender.createMimeMessage();MimeMessageHelper helper =new MimeMessageHelper(mimeMessage, true);helper.setFrom(mailProperties.getUsername());helper.setTo(boMailBean.getToAccount());helper.setSubject(mailBean.getSubject());helper.setText(mailBean.getContent(), true);// 增加附件名称和附件helper.addAttachment(MimeUtility.encodeWord(boMailBean.getAttachmentFileName(), "utf-8", "B"), mailBean.getAttachmentFile());mailSender.send(mimeMessage);return true;}catch (MessagingException e) {e.printStackTrace();return false;}}MailBean.java/*** @author chenzan* @version V1.0*/@Datapublic class MailBean {private Stringsubject;private String content;private String toAccount;private File attachmentFile;private String attachmentFileName;}4.发送String email = "XXX@";String content="测试内容";String subject = "测试主题";MailBean mailBean =new MailBean ();mailBean .setToAccount(email);boMailBean.setSubject(subject );boMailBean.setContent(content);boolean resultSend =mailUtil.sendMailAttachment(boMailBean);⼆、查看阿⾥云邮箱设置⽀持SMTP/POP3/IMAP功能,轻松通过客户端软件(outlook、foxmail等)收发邮件。
邮件客户端使用Java语言和JavaMail库开发的小程序邮件是现代社会中非常重要的通信工具之一,而邮件客户端则是使用邮件的主要方式之一。
为了提供一个便捷的邮件发送和接收工具,本文将介绍如何使用Java语言和JavaMail库开发一个小型的邮件客户端程序。
一、引言随着互联网的普及,电子邮件已经成为人们日常生活中不可或缺的一部分。
邮件客户端是用于发送和接收电子邮件的软件应用程序。
本文将通过使用Java语言和JavaMail库开发一个小型的邮件客户端程序,来演示如何利用编程语言的力量来简化邮件的处理和管理。
二、准备工作在开始开发之前,我们需要准备一些必要的工作。
首先,我们需要安装Java开发环境(JDK)以及支持邮件功能的JavaMail库。
其次,我们需要一个有效的邮件服务器地址、端口号、用户名和密码,这些信息用于程序连接和认证邮件服务器。
三、创建项目使用Java语言和JavaMail库开发邮件客户端的第一步是创建一个新的Java项目。
我们可以使用任何集成开发环境(IDE)来创建和管理项目,比如Eclipse、IntelliJ IDEA等。
创建项目后,我们需要在项目的依赖项中添加JavaMail库,以便在代码中使用该库提供的功能。
四、连接邮件服务器在程序中连接邮件服务器是发送和接收邮件的基础步骤。
我们可以使用JavaMail库中提供的JavaMailSession类来创建一个与邮件服务器的会话连接。
通过设置邮件服务器地址、端口号、用户名和密码,我们可以建立与邮件服务器的连接,并进行后续的邮件处理操作。
五、发送邮件发送邮件是邮件客户端的主要功能之一。
我们可以使用JavaMail库提供的SMTP协议来发送邮件。
首先,我们需要创建一个MimeMessage对象,用于表示要发送的邮件。
然后,我们可以设置邮件的发送人、接收人、主题、内容等信息。
最后,使用JavaMailSession类中的Transport对象发送邮件。
发送邮件—java代码简单实例java某.mail1.准备jar包修改环境变量编辑CLASSPATH,在其后添加:%JAVA_HOME%\lib\mail.jar JAVA_HOME是jdk根目录,这里不做解释。
2.源代码//SendMail.javaimportjava.util.Propertie;importjava某.activation.DataHandler;importjava某.activation.FileDataSource;importjava某.mail.Addre;importjava某.mail.BodyPart;importjava某.mail.Meage;importjava某.mail.Multipart;importjava某.mail.Seion;java某.mailimportjava某.mail.Tranport;importjava某.mail.internet.InternetAddre;importjava某.mail.internet.MimeBodyPart;importjava某.mail.internet.MimeMeage;importjava某.mail.internet.MimeMultipart;importjava某.mail.Authenticator;importjava某.mail.PawordAuthentication;publicclaSendMail{}claMail{privateMimeMeagemimeMg;//MIME邮件对象privateSeioneion;//邮件会话对象privatePropertieprop;//系统属性privatebooleanneedAuth=fale;//mtp是否需要认证//mtp认证用户名和密码privateStringuername;privateStringpaword;privateMultipartmp;//Mu ltipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMeage对象java某.mailjava某.mailjava某.mailjava某.mailtry{mimeMg.etRecipient(,(Addre[])InternetAddre.pare(copyto));returntrue;}catch(E某ceptione){returnfale;}}/某某某发送邮件某/publicbooleanendOut(){try{mimeMg.etContent(mp);mimeMg.aveChange ();Sytem.out.println("正在发送邮件....");SeionmailSeion=Seion.getIntance(prop,null);//Sytem.out. println("111111");Tranporttranport=mailSeion.getTranport("mtp");java某.mailtranport.connect((String)prop.get("mail.mtp.hot"),uername,pa word);//Sytem.out.println("333333");tranport.endMeage(mimeMg,mim eMg.getRecipient(Meage.RecipientType.TO));//Sytem.out.println("4 44444");tranport.endMeage(mimeMg,mimeMg.getRecipient());//tranpo rt.end(mimeMg);Sytem.out.println("发送邮件成功!");tranport.cloe();returntrue;}catch(E某ceptione){Sytem.err.println("邮件发送失败!"+e);returnfale;}}/某某某调用endOut方法完成邮件发送某/publictaticbooleanend(Stringmtp,String content,Stringuername,Stringpaword){ MailtheMail=newMail(mtp);theMail.etNeedAuth(true);//需要验证if(!theMail.etSubject(ubject))returnfale; if(!theMail.etBody(content))returnfale; if(!theMail.etTo(to))returnfale;if(!theMail.etFrom(from))returnfale; theMail.etNamePa(uername,paword);if(!theMail.endOut())returnfale; returntrue;}from,Stringto,Stringubject,Stringjava某.mailpublictaticbooleanendAndCc(Stringmtp,Stringfrom,Stringto,Str ingcopyto,Stringubject,Stringcontent,Stringuername,Stringpaword) {MailtheMail=newMail(mtp);theMail.etNeedAuth(true);//需要验证java某.mailpublictaticbooleanendAndCc(Stringmtp,Stringfrom,Stringto,Str ingcopyto,Stringubject,Stringcontent,Stringuername,Stringpaword, Stringfilename){}MailtheMail=newMail(mtp);theMail.etNeedAuth(true);//需要验证if(!theMail.etSubject(ubject))returnfale;if(!theMail.etBody(cont ent))returnfale;if(!theMail.addFileAffi某(filename))returnfale;if(!theMail.etTo(to))returnfale;if(!theMai l.etCopyTo(copyto))returnfale;if(!theMail.etFrom(from))returnfal e;theMail.etNamePa(uername,paword);if(!theMail.endOut())returnfa le;returntrue;}。
JavaWeb(⼗三)使⽤javamail进⾏发送邮件,(使⽤QQ,163,新浪邮箱服务器) 加油加油。
--WZY⼀、发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协议,默认端⼝,25 POP3:Post Office Protocol 3,即邮局协议,接收邮件的协议,默认端⼝,110 知道了这两个协议,下⾯来说说邮件发送和接收的原理图,分两种,相同邮件(QQ邮箱给QQ邮箱)和不同邮件(QQ邮箱给163邮箱)是不⼀样的。
解释: 为了⽅便起见,将新浪邮箱,list@称为⽤户A,将搜狐邮箱,wangwu@ 称为⽤户B ⽤户A(新浪邮箱,list@)给⽤户B(搜狐邮箱,wangwu@)发送⼀封邮件,那么整个过程就为图中的实线部分,⽤户A通过OutLook(浏览器或者客户端)登录⾃⼰的邮箱帐号,编写邮件,使⽤Smtp协议发送给Sina的邮件服务器中的Smtp服务器(专门⽤来发送的服务器),然后在通过SMTP协议,传输给Sohu的邮件服务器中的Smtp服务器,然后通过Sohu的Smtp服务器将邮件发送给⽤户B的存储设备进⾏存储(每个⽤户都会有⼀个存储空间⽤来存储邮件的),到这⾥,⽤户A就相当于发送成功了,因为已经到达了⽬的地,如果B⽤户需要查看邮件内容,必须通过POP3服务器将从⾃⼰的存储设备中拿到,然后返回到浏览器或者客户端中显⽰。
⽤户B给⽤户A发送⼀封邮件,那么整个过程就为图中的虚线部分,是和A给B发⼀样的步骤 ⽤户A给⼀个同样使⽤新浪邮箱的⽤户C发送⼀封邮件,那么其过程就简单的多了,先通过Smtp服务器,然后smtp服务器会将其发送到⽤户C的存储设备上,A发送邮件就成功了,⽤户C要显⽰⾃⼰邮箱中的邮件,那么就通过POP3服务器从⾃⼰存储设备中拿取所有邮件进⾏查看。
⼆、通过Java代码实现发送邮件 2.1、准备jar包 核⼼:mail.jar 依赖:activation.jar,邮件需要发送附件时使⽤ 2.2、使⽤163邮箱发送邮件 2.2.1、⾸先在163邮箱中注册⼀个帐号。
1.1通过代码实例跟我学JavaMail技术及应用实例(第1部分)1、使用JSP开发WebMail系统(1)WebMail概述电子邮件(E-mail)是Internet上使用最广泛的服务之一,传统的Email应用模式基于C/S结构,即用户使用客户端的邮件收发工具(如Outlook、Foxmail等)与提供邮件服务的服务器(如、、)通信,在使用客户端邮件工具之前,用户要进行一些必要的设置,如指定邮件服务器的主机地址和通信端口等,这些工作对刚开始上网的用户会有一定的困难。
如果把E-mail和Web结合在一起,即通过Web编程和适当的系统设置,使用户仅仅以访问Web的方式就可以得到和使用完整的邮件服务,这样将极大地方便上网用户,这种系统称为WebMail。
WebMail是目前Internet上最受欢迎的服务之一,也是很多网站必备功能之一。
另外WebMail同样也适用于企业或校园网的应用。
(2)实现WebMail的主要功能该系统提供了获取、阅读、书写、转发、回复、打印、删除及用户管理的功能。
考虑到系统的跨平台性,采用Java及相关技术产品为开发工具,特别是采用JSP作为服务程序,这样对客户端也没有其它要求,同时系统的性能在高负荷下得到进一步提高。
整个WebMail系统全部采用纯Java代码,服务器端每响应一个服务请求启动一个线程,而不像CGI那样启动一个进程。
这样能够节省系统资源,提高系统性能。
2、什么是JavaMail(1)Web方式的邮件电子邮件(E-mail)是Internet上使用最广泛的服务之一,传统的Email应用模式基于C/S结构,即用户使用客户端的邮件收发工具(如Outlook、Foxmail等)与提供邮件服务的服务器(如、、)通信,在使用客户端邮件工具之前,用户要进行一些必要的设置,如指定邮件服务器的主机地址和通信端口等,这些工作对刚开始上网的用户会有一定的困难,如果把E-mail和Web结合在一起,即通过Web编程和适当的系统设置,使用户仅仅以访问Web的方式就可以得到和使用完整的邮件服务,这样将极大地方便上网用户,这种系统称为WebMail。
Java-JavaMail邮件开发(3)spring+JavaMail+Velocity 1、spring + Java Mail + Velocity项⽬结构:注意:⽤户包中引⼊各包的顺序问题。
如velocity-2.1。
beans.xml<?xml version="1.0" encoding="UTF-8"?><!-- spring配置⽂件的根元素,使⽤spring-beans-4.0.xsd语义约束 --><beans xmlns:xsi="/2001/XMLSchema-instance"xmlns="/schema/beans"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.0.xsd"><bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations" value="mail.properties"/></bean><bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value="${mail.host}"/><property name="username" value="${er}"/><property name="password" value="${mail.pwd}"/></bean><bean id="javaMailSenderService" class="com.lfy.sendmail.JavaMailSenderService"/><bean id="javaMailSenderImplService" class="com.lfy.sendmail.JavaMailSenderImplService"/><!-- VelocityEngineFactory --><bean id="velocityEngineFactory" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"><property name="velocityProperties"><props><prop key="resource.loader">class</prop><prop key="class.resource.loader.class">org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader</prop></props></property></bean><bean id="velocityEngineService" class="com.lfy.velocity.VelocityEngineService"/></beans>VelocityEngineService.javapackage com.lfy.velocity;import org.apache.velocity.app.VelocityEngine;import org.springframework.beans.factory.annotation.Autowired;public class VelocityEngineService {@Autowiredprivate VelocityEngine velocityEngine;public VelocityEngine getVelocityEngine() {return velocityEngine;}public void setVelocityEngine(VelocityEngine velocityEngine) {this.velocityEngine = velocityEngine;}}JavaMailSenderImplService.javapackage com.lfy.sendmail;import javax.mail.internet.MimeMessage;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.mail.SimpleMailMessage;import org.springframework.mail.javamail.JavaMailSenderImpl;/*** 2、spring⽀持的第⼆种发送器JavaMailSenderImpl* @author lfy**/public class JavaMailSenderImplService {@Autowiredprivate JavaMailSenderImpl javaMailSenderImpl;public JavaMailSenderImpl getJavaMailSenderImpl() {return javaMailSenderImpl;}public void setJavaMailSenderImpl(JavaMailSenderImpl javaMailSenderImpl) {this.javaMailSenderImpl = javaMailSenderImpl;}/*** simple content* @param message*/public void send(SimpleMailMessage message){javaMailSenderImpl.send(message);System.out.println("JavaMailSenderImpl:send silpleMessage successfully.");}/*** Velocity content* @param message*/public void sendWithVelocity(MimeMessage message) {javaMailSenderImpl.send(message);System.out.println("JavaMailSenderImpl:send mimeMessage successfully.");}}index.vm<html><head><style type="text/css">h4{color:red;background:#efefef;}</style></head><body><h4>${user} </h4><p><p><i>${content}</i></body></html>springJavaMailSender.javapackage com.lfy.main;import java.util.HashMap;import java.util.Map;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import org.apache.velocity.app.VelocityEngine;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.mail.javamail.MimeMessageHelper;import org.springframework.ui.velocity.VelocityEngineUtils;import com.lfy.sendmail.JavaMailSenderImplService;import com.lfy.velocity.VelocityEngineService;public class springJavaMailSender {public static void main(String[] agrs) throws MessagingException {//创建spring容器ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");JavaMailSenderImplService javaMailSenderImplService = (JavaMailSenderImplService)ctx.getBean("javaMailSenderImplService");VelocityEngine velocityEngine=(VelocityEngine)((VelocityEngineService)ctx.getBean("velocityEngineService")).getVelocityEngine(); Map<String,Object> model=new HashMap<String,Object>();model.put("user", "Tomcat");model.put("content", "Hello");String emailText=VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "index.vm", "UTF-8", model);MimeMessage msg=javaMailSenderImplService.getJavaMailSenderImpl().createMimeMessage();MimeMessageHelper helper=new MimeMessageHelper(msg,true);helper.setFrom("xxxxxxxxxx@");helper.setTo("xxxxxxxx@");helper.setCc("xxxxxxxx@");helper.setSubject("Velocity模板测试");helper.setText(emailText, true);javaMailSenderImplService.sendWithVelocity(msg);}}运⾏效果:2、使⽤Maven配置使⽤Velocity。
Java基于JavaMail实现向QQ邮箱发送邮件最近项⽬在做新闻爬⾍,想实现这个功能:爬⾍某个页⾯失败后,把这个页⾯的 url 发到邮箱。
最终实现的效果图如下,后期可以加上过滤标签、失败状态码等,⽅便分类搜索异常。
开发⼈员可以根据邮件⾥的 url 和堆栈信息,分析爬⾍失败的原因。
是不是服务器 down 了?还是爬⾍的 Dom 解析没有解析到内容?还是正则表达式对于这个页⾯不适⽤?开启SMTP服务在 QQ 邮箱⾥的设置->账户⾥开启 SMTP 服务注意开启完之后,QQ 邮箱会⽣成⼀个授权码,在代码⾥连接邮箱使⽤这个授权码⽽不是原始的邮箱密码,这样可以避免使⽤明⽂密码。
⽹上查了⼀下例⼦,根据这篇⽂章 Java Mail(⼆):JavaMail介绍及发送⼀封简单邮件的⽰例代码。
Properties props = new Properties();// 开启debug调试props.setProperty("mail.debug", "true");// 发送服务器需要⾝份验证props.setProperty("mail.smtp.auth", "true");// 设置邮件服务器主机名props.setProperty("mail.host", "");// 发送邮件协议名称props.setProperty("mail.transport.protocol", "smtp");Session session = Session.getInstance(props);//邮件内容部分Message msg = new MimeMessage(session);msg.setSubject("seenews 错误");StringBuilder builder = new StringBuilder();builder.append("url = " + "/never_cxb/article/details/50524571");builder.append("页⾯爬⾍错误");builder.append("\n data " + TimeTool.getCurrentTime());msg.setText(builder.toString());//邮件发送者msg.setFrom(new InternetAddress("**发送⼈的邮箱地址**"));//发送邮件Transport transport = session.getTransport();transport.connect("", "**发送⼈的邮箱地址**", "**你的邮箱密码或者授权码**");transport.sendMessage(msg, new Address[] { new InternetAddress("**接收⼈的邮箱地址**") });transport.close();但是报错了DEBUG SMTP: AUTH LOGIN command trace suppressedDEBUG SMTP: AUTH LOGIN failedException in thread "main" javax.mail.AuthenticationFailedException: 530Error: A secure connection is requiered(such as ssl). More information at /cgi-bin/help?id=28因为⽰例代码是⽤的163邮箱,⽽笔者是 QQ 邮箱,看 Log 分析是 QQ 邮箱需要 SSL 加密。
SpringBoot中利⽤JavaMailSender发送邮件的⽅法⽰例(附源码)快速⼊门在Spring Boot的⼯程中的pom.xml中引⼊spring-boot-starter-mail依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>如其他⾃动化配置模块⼀样,在完成了依赖引⼊之后,只需要在application.properties中配置相应的属性内容。
下⾯我们以QQ邮箱为例,在application.properties中加⼊如下配置(注意替换⾃⼰的⽤户名和密码):spring.mail.host=ername=⽤户名spring.mail.password=密码spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=true通过单元测试来实现⼀封简单邮件的发送:@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = Application.class)public class ApplicationTests {@Autowiredprivate JavaMailSender mailSender;@Testpublic void sendSimpleMail() throws Exception {SimpleMailMessage message = new SimpleMailMessage();message.setFrom("dyc87112@");message.setTo("dyc87112@");message.setSubject("主题:简单邮件");message.setText("测试邮件内容");mailSender.send(message);}}到这⾥,⼀个简单的邮件发送就完成了,运⾏⼀下该单元测试,看看效果如何?“由于Spring Boot的starter模块提供了⾃动化配置,所以在引⼊了spring-boot-starter-mail依赖之后,会根据配置⽂件中的内容去创建JavaMailSender实例,因此我们可以直接在需要使⽤的地⽅直接@Autowired来引⼊邮件发送对象。
private void getMailSet(){this.from = IConstants.MAIL_FROM;senderImpl = new JavaMailSenderImpl();senderImpl.setHost(IConstants.MAIL_HOST.trim());senderImpl.setUsername(IConstants.MAIL_USERNAME.trim());senderImpl.setPassword(IConstants.MAIL_PASSWORD.trim());Properties javaMailProperties = new Properties();javaMailProperties.put("mail.smtp.auth", "true");javaMailProperties.put("mail.smtp.timeout", "25000");senderImpl.setJavaMailProperties(javaMailProperties);}public void sendAffixMail(final String pdfUrl,final String pdfname,final String userEmail,final String username){taskExecutor.execute(new Runnable() {public void run() {try{getMailSet();seAffixMail(pdfUrl,pdfname,userEmail,username);}catch (Exception e) {e.printStackTrace();}}});}//发送附件public void seAffixMail(String pdfUrl,String pdfname,String userEmail,String username) throws MessagingException{try{//javaMail方式Mail mail = new Mail();mail.setSmtpServer(IConstants.MAIL_HOST.trim());//服务器mail.setUserName(IConstants.MAIL_USERNAME.trim());//账户mail.setPassword(IConstants.MAIL_PASSWORD.trim());//密码mail.setFrom(IConstants.MAIL_FROM.trim());//发件人账户mail.setDisplayName(IConstants.NICK);//显示发件人别名,如:楷誉金融<xxyin_vip@>mail.setTo(userEmail);//收件人mail.setIfAuth(true);//开启发送账户验证mail.addAttachfile(pdfUrl.trim());//添加附件mail.setSubject("电子协议"); //主题mail.setContent("尊敬的用户:"+username+"您投资借款成功,收到电子协议,请查收!");//内容HashMap map = mail.send();System.out.println("================="+map);}catch (Exception e) {e.printStackTrace();System.out.println("附件发送失败!");}}public class Mail {//定义发件人、收件人、SMTP服务器、用户名、密码、主题、内容等private String displayName;private String to;private String from;private String smtpServer;private String username;private String password;private String subject;private String content;private boolean ifAuth; //服务器是否要身份认证private String filename="";private Vector file = new Vector(); //用于保存发送附件的文件名的集合/*** 设置SMTP服务器地址*/public void setSmtpServer(String smtpServer){this.smtpServer=smtpServer;}/*** 设置发件人的地址*/public void setFrom(String from){this.from=from;}/*** 设置显示的名称*/public void setDisplayName(String displayName){this.displayName=displayName;}/*** 设置服务器是否需要身份认证*/public void setIfAuth(boolean ifAuth){ this.ifAuth=ifAuth;}/*** 设置E-mail用户名*/public void setUserName(String username){ ername=username;}/*** 设置E-mail密码*/public void setPassword(String password){ this.password=password;}/*** 设置接收者*/public void setTo(String to){this.to=to;}/*** 设置主题*/public void setSubject(String subject){ this.subject=subject;}/*** 设置主体内容*/public void setContent(String content){ this.content=content;}/*** 该方法用于收集附件名*/public void addAttachfile(String fname){file.addElement(fname);}//空构造器public Mail(){}/*** 初始化SMTP服务器地址、发送者E-mail地址、用户名、密码、接收者、主题、内容*/public Mail(String smtpServer,String from,String displayName,String username,String password,String to,String subject,String content){this.smtpServer=smtpServer;this.from=from;this.displayName=displayName;this.ifAuth=true;ername=username;this.password=password;this.to=to;this.subject=subject;this.content=content;}/*** 初始化SMTP服务器地址、发送者E-mail地址、接收者、主题、内容*/public Mail(String smtpServer,String from,String displayName,String to,String subject,String content){this.smtpServer=smtpServer;this.from=from;this.displayName=displayName;this.ifAuth=false;this.to=to;this.subject=subject;this.content=content;}/*** 发送邮件*/public HashMap send(){HashMap map=new HashMap();map.put("state", "success");String message="邮件发送成功!";Session session=null;Properties props = System.getProperties();props.put("mail.smtp.host", smtpServer);if(ifAuth){ //服务器需要身份认证props.put("mail.smtp.auth","true");SmtpAuth smtpAuth=new SmtpAuth(username,password);session=Session.getDefaultInstance(props, smtpAuth);}else{props.put("mail.smtp.auth","false");session=Session.getDefaultInstance(props, null);}//session.setDebug(true);Transport trans = null;try {Message msg = new MimeMessage(session);try{Address from_address = new InternetAddress(from, displayName);msg.setFrom(from_address);}catch(java.io.UnsupportedEncodingException e){e.printStackTrace();}InternetAddress[] address={new InternetAddress(to)};msg.setRecipients(Message.RecipientType.TO,address);msg.setSubject(subject);Multipart mp = new MimeMultipart();MimeBodyPart mbp = new MimeBodyPart();mbp.setContent(content.toString(),"text/html;charset=gb2312");mp.addBodyPart(mbp);if(!file.isEmpty()){//有附件Enumeration efile=file.elements();while(efile.hasMoreElements()){mbp=new MimeBodyPart();filename=efile.nextElement().toString(); //选择出每一个附件名FileDataSource fds=newFileDataSource(filename); //得到数据源mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPartmbp.setFileName(fds.getName()); //得到文件名同样至入BodyPartmp.addBodyPart(mbp);}file.removeAllElements();}msg.setContent(mp); //Multipart加入到信件msg.setSentDate(new Date()); //设置信件头的发送日期//发送信件msg.saveChanges();trans = session.getTransport("smtp");trans.connect(smtpServer, username, password);trans.sendMessage(msg, msg.getAllRecipients());trans.close();}catch(AuthenticationFailedException e){map.put("state", "failed");message="邮件发送失败!错误原因:\n"+"身份验证错误!";e.printStackTrace();}catch (MessagingException e) {message="邮件发送失败!错误原因:\n"+e.getMessage();map.put("state", "failed");e.printStackTrace();Exception ex = null;if ((ex = e.getNextException()) != null) { System.out.println(ex.toString());ex.printStackTrace();}}//System.out.println("\n提示信息:"+message);map.put("message", message);return map;}}。
1、首先我们建立一个继承Authenticator的子类。
import java.util.*;
import javax.mail.*;
import javax.swing.*;
public class GUIAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() { String user;
String pwd;
// 弹出输入对话框
String result = JOptionPane.showInputDialog("请输入用户名和
密码,以','隔开!");
StringTokenizer st = new StringTokenizer(result, ",");
user = st.nextToken();
pwd = st.nextToken();
return new PasswordAuthentication(user, pwd);
}
}
作用:这个类的作用是在连接邮件服务器的时候,就会调用这个类的getPasswordAuthentication方法,然后提示输入用户名和密码。
Ps:这个只是一个很简单的类,只作为一个例子给大家参考,真正的邮件认证不
是那么简单的。
2、通过邮件认证发送邮件:
package com.mail;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
/**
* 通过邮件认证发送邮件
* @author sam
*
*/
public class SendMailAuthenticator {
private String smtpServer = "";
private String from = "343820302@";
private String to = "343820302@";
private String subject = "测试使用邮件认证";
private String body = "测试使用邮件认证正文";
public void sendMail(Authenticator auth) throws Exception { // 设置协议、是否身份验证、服务器等信息
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.host", smtpServer);
// 通过传入的参数获得Authenticator子类对象
Session session = Session.getInstance(props, auth);
// 构造信息体
MimeMessage message = new MimeMessage(session);
// 发件地址
Address fromAddress = new InternetAddress(from);
message.setFrom(fromAddress);
// 收件地址
Address toAddress = new InternetAddress(to);
message.setRecipient(MimeMessage.RecipientType.TO, toAddress);
// 主题
message.setSubject(subject);
// 正文
message.setText(body);
message.saveChanges();
session.setDebug(true);
/*
* * 由于Session对象中注册了Authenticator子类对象,因此可以直接 *
* 从该Authenticator子类对象中获取登录的相关信息,故直接使用* Transport 抽象类中静态 send()
* 方法来简化代码编写
*/
Transport.send(message);
}
public static void main(String[] args) throws Exception {
SendMailAuthenticator send = new SendMailAuthenticator();
Authenticator auth = new GUIAuthenticator();
send.sendMail(auth);
}
}
3、通过邮件认证接受邮件
package com.mail;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
/**
* 通过邮件认证接收邮件
* @author sam
*
*/
public class RevMailAuthenticator {
//邮件服务器地址
private String smtpServer = "";
public void sendMails(Authenticator auth) throws Exception { // 设置协议、是否身份验证、服务器等信息
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "pop3");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.host", smtpServer);
// 通过传入的参数获得Authenticator子类对象
Session session = Session.getInstance(props, auth);
/******************************************************************** ***
* 由于Session对象中注册了Authenticator子类对象,因此可以直接
*
* 从该Authenticator子类对象中获取登录的相关信息,故直接使用 *
* store.connect();而不用传递用户名和密码参数
*/
Store store = session.getStore("pop3");
//连接邮件服务器
store.connect();
//返回文件夹对象
Folder folder = store.getFolder("INBOX");
//设置仅读
folder.open(Folder.READ_ONLY);
//获取信息
Message message[] = folder.getMessages();
for(int i=message.length-1; i>0; i--) {
//打印主题
System.out.println(message[i].getSubject());
System.out.println("-----------------------------------------"); }
folder.close(true);
store.close();
}
// 测试
public static void main(String[] args) throws Exception {
RevMailAuthenticator sender = new RevMailAuthenticator();
// 这里体现了使用策略模式的好处,客户端可以选择使用
// 具体的哪一种身份验证方式来提交信息
//对话框方式输入用户名和密码
Authenticator auth = new GUIAuthenticator();
sender.sendMails(auth);
}
}。