前言如果你还不知道什么是JavaEE,可以先看这里:什么是JavaEE?发邮件是企业级应用开发的刚性需求,比如:每晚定时任务运行后,自动发邮件到领导邮箱获取结果数据。电子邮件虽然“老”了,但与IM消息相比,它有许多不可替代的优势:更正式:比较重要的场合/数据更适合使用电子邮件内容大:一封电子邮件的文本字符数理论上是无限的格式丰富:它可以由附件、图片、文字组成。支持HTML排版丰富的发送形式:除了收件人,还可以复制、盲复制既然发邮件的场景如此普遍,但根据我的经验,同事在发邮件遇到问题时,往往会“头疼”。你有没有类似的情况?这篇文章会讲JavaMail的开发,然后给出一些代码示例。另外,这篇文章也会讲到比较重要的JDBC,经常出现在各种面试场合。是考验求职者基本技术水平的重要知识点,也是流行框架MyBatis的基石。所属专栏【方向盘】-JavaEE相关下载【本专栏源码】:https://github.com/yourbatman/FXP-java-ee【NuwaKnife-Initializr项目】访问地址:http://152.136。106.14:8761【程序员专用网盘】公益上线,注册送1G超小容量,帮你练减法:https://wangpan.yourbatman.cn【Java开发软件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0提取码:javakitversionconventionJavaEE:6,7,8JakartaEE:8,9,9.1TextJavaMailJavaMailAPI提供了一个独立于平台和协议的框架来构建邮件和消息传递应用程序。JavaMailAPI作为与JavaSE平台一起使用的可选包提供,也包含在JavaEE平台中。JavaMail是sun公司为方便Java开发人员在应用程序中实现邮件收发功能而提供的一套标准开发包。它支持一些常用的邮件协议,如SMTP、POP3、IMAP、MIME(发送附件)等。当我们使用JavaMailAPI写邮件时,不需要考虑邮件的底层实现细节,只需要调用JavaMail开发包中相应的API类即可。1.6.7本版本命名空间同javax-->javax.mailjavax。mail-api1.6.2jakarta.mailjakarta.mail-api2.0.1版本历史JavaMail最新版本为1.6.2,2018.08发布。javax.mail-api.jar是JavaMail的API,一般不需要单独导入。即使需要引入,scope也可以使用provide。com.sun.mail:javax.mail.jar是JavaMail的参考实现,包括SMTP、IMAP、POP3等常用协议的实现。说明:从“自古”发送邮件需要导入两个jar包。里面的activation.jar不是必须的,大部分情况下一个mail.jar就够了。值得注意的是:用Spring发送邮件没有spring-mail独立模块(相关类在spring-context-support模块中),只有SpringBoot提供的spring-boot-starter-mail独立启动器。存在的现状是必不可少的,而且已经确立。com.sun.mail:javax.mail或com.sun.mail:jakarta.mail的实现(框架)是官方的参考实现,SpringBoot也用它来发送邮件。代码示例生产环境当然,推荐使用Spring(或SpringBoot)提供的邮件能力发送邮件,非常简单方便。为本文添加一些材料并直接使用底层API进行尝试。JavaMailAPI按功能可分为以下三类:用于创建和解析邮件的API用于发送邮件的API用于接收邮件的API这三类涉及的门类很多,但只有四个核心,即俗称的JavaMail类的四个核心。如下图所示:大多数情况下,我们只需要使用JavaMail来发送邮件,即三个类:Session:用于定义整个应用程序所需的环境信息。如主机名、端口、邮件协议等。Message:邮件内容。通常使用它的子类javax.mail.internet.MimeMessage类。还有SMTPMessage、SMTPMessage等。Transport:发送邮件的核心API类。下面,我使用JavaMailAPI发送邮件到我的邮箱:yourbatman@aliyun.com。代码如下。准备基本的发件人和收件人信息://=====发件人信息======publicstaticfinalStringSENDER_ADDRESS="641385712@qq.com";publicstaticfinalStringSENDER_ACCOUNT="641385712@qq.com";publicstaticfinalStringSENDER_PASSWORD="xxxxxxxxxxxx";//这里的QQ邮箱是用授权码登录的,不是密码。publicstaticfinalStringSENDER_QQ_SMTP_SERVER="smtp.qq.com";//=====收件人信息======publicstaticfinalStringRECIPIENT_ADDRESS="yourbatman@aliyun.com";QQ邮箱登录授权码是多少?就是这个东东(怎么获取,谷歌百度一下):调用API,写发送邮件的代码:/***sendemail*@paramargs*@throwsException*/publicstaticvoidmain(String[]args)throwsException{Propertiesprops=newProperties();props.setProperty("mail.smtp.auth","true");//用户认证方式props.setProperty("mail.transport.protocol","smtp");//传输protocolprops.setProperty("mail.smtp.host",SENDER_QQ_SMTP_SERVER);//发件人的SMTP服务器地址Sessionsession=Session.getInstance(props);session.setDebug(true);//在控制台打印调试信息//======创建邮件======Messagemsg=createMimeMessage(session);//======准备发送======Transporttransport=session.getTransport();transport.connect(SENDER_ACCOUNT,SENDER_PASSWORD);transport.sendMessage(msg,msg.getAllRecipients());//发送邮件(包括)//如果只想发送给指定的人,可以这样写//transport.sendMessage(msg,newAddress[]{newInternetAddress("xxx@qq.com")});transport.close();}privatestaticMimeMessagecreateMimeMessage(Sessionsession)throwsException{MimeMessagemsg=newMimeMessage(session);msg.setFrom(newInternetAddress(SENDER_ADDRESS));//设置发件人地址/***设置收件人地址(可添加多个收件人,CC,BCC),即,下面这行代码写了多行*MimeMessage.RecipientType.TO:send*MimeMessage.RecipientType.CC:copy*MimeMessage.RecipientType.BCC:blindcopy*/msg.setRecipient(MimeMessage.RecipientType.TO,newInternetAddress(RECIPIENT_ADDRESS));msg.setSubject("我是邮件主题","UTF-8");msg.setContent("我是一个简单的纯文本邮件!","text/html;charset=UTF-8");msg.setSentDate(newDate());//邮件发送时间,默认立即发送returnmsg;}运行程序,收到邮件,完美!控制台调试日志可以窥探发送进程:DEBUG:setDebug:JakartaMailversion1.6.7DEBUG:getProvider()returningjavax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]DEBUGSMTP:useEhlotrue,useAuthtrueDEBUGSMTP:tryingtoconnecttohost"smtp.qq.com",port25,isSSLfalse220newxmesmtplogicsvrszb6.qq.comXMailEsmtserver.pQQGMail"连接主机"smtp.qq.com",port25smtp.qq.com",port:25EHLO192.168.0.145250-newxmesmtplogicsvrszb6.qq.com250-PIPELINING250-SIZE73400320250-STARTTLS250-AUTHLOGINPLAINXOAUTHXOAUTH2250-AUTH=LOGIN250-MAILCOMPRESS2508BITMIMEDEBUGSMTP:Foundextension"PIPELINING",arg""DEBUGSMTP:Foundextension"SIZE",arg"73400320"DEBUGSMTP:Foundextension"STARTTLS",arg""DEBUGSMTP:Foundextension"AUTH",arg"LOGINPLAINXOAUTHXOAUTH2"DEBUGSMTP:Foundextension"AUTH=LOGIN",arg""DEBUGSMTP:Foundextension"MAILCOMPRESS",arg""DEBUGSMTP:Foundextension"8BITMIME",arg""DEBUGSMTP:protocolConnectlogin,host=smtp.qq.com,user=641385712@qq.com,password=DEBUGSMTP:Attempttoauthenticateusingmechanisms:LOGINPLAINDIGEST-MD5NTLMXOAUTH2DEBUGSMTP:UsingmechanismLOGINDEBUGSMTP:AUTHLOGINcommandtracesuppressedDEBUGSMTP:AUTHLOGINsucceededDEBUGSMTP:use8bitfalseMAILFROM:<641385712@qq.com>250OK.RCPTTO:250OKDEBUGSMTP:VerifiedAddressesDEBUGSMTP:yourbatman@aliyun.comDATA354Enddatawith..Date:Wed,6Oct202120:37:54+0800(CST)From:641385712@qq.comTo:yourbatman@aliyun.comMessage-ID:<683287027.0.1633523875105@[192.168.0.145]>Subject:=?UTF-8?B?5oiR5piv6YKu5Lu25Li76aKY?=MIME-Version:1.0Content-Type:text/html;charset=UTF-8Content-Transfer-Encoding:base645oiR5piv566A5Y2V55qE57qv5paH5pys6YKu5Lu277yB.250OK:queuedas.DEBUGSMTP:messagesuccessfullydeliveredtomailserverQUIT221Bye.Processfinishedwithexitcode0本专栏源代码:https://github.com/yourbatman/FXP-java-eeJDBCJavaDataBaseConnectivity:Java数据库连接它是一个执行SQL语句的JavaAPI,可以提供对多种关系型数据库的统一访问。它由一组用Java语言编写的类和接口组成。从根本上说,JDBC是一种规范,它提供了一套完整的接口,可以方便地访问底层数据库。简单的说,JDBC是Java执行数据库操作的SQL语句的API。不同的数据库有自己的Driver驱动程序。为了方便开发者使用,Sun做出了一个举动:制定JDBC规范,统一标准。JDBC不需要单独导入。JavaSE中包含的版本历史在JDK1.0中只是一个可选组件。从JDK1.1开始成为JavaSE的一部分,即java.sql类包。所以:JDBC1.0与JDK1.1一起发布。总的来说,JDBC发展到4.0版本已经很完善了,使用起来也很方便。生存现状虽然NoSQL如日中天,但传统的RDBMS还是不可或缺的,因此JDBC是必备技能。实施(框架)无。代码示例不同版本的JDBC使用不同的代码。下面是一个基于Java8(即JDBC4.2)的例子。所谓JDBC的四大步骤/参数,今天就到这:/yourbatman.cn*@date2021/10/621:20*@since0.0.1*/publicclassJDBCDemo{//===========================JDBC四个参数=======================publicstaticfinalStringDB_DRIVER="com.mysql.cj.jdbc.Driver";publicstaticfinalStringDB_URL="jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC";publicstaticfinalStringDB_USER="root";publicstaticfinalStringDB_PASS="root";publicstaticvoidmain(String[]args)throwsException{Class.forName(DB_DRIVER);try(Connectionconn=DriverManager.getConnection(DB_URL),DB_USER,DB_PASS);PreparedStatementpstmt=conn.prepareStatement("SELECTid,name,ageFROMuser",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY)){//===============得到后连接,就可以开始操作数据库===================ResultSetrs=pstmt.executeQuery();//执行结果集s滚动打印结果集System.out.println("第二条数据:"+rs.getLong("id"));rs.absolute(1);System.out.println("第一条数据:"+rs.getLong("id"));rs.beforeFirst();System.out.println("最后一条数据:"+rs.getLong("id"));rs.afterLast();//关闭结果集(应该是finally关闭)rs.close();}}}这个是使用原生JDBC操作数据库的简单代码示例项目源码:https://github.com/yourbatman/FXP-java-ee总结本文通过讲解开发过程和代码示例介绍两种技术:JavaMail:Sending使用Java语言的emails(也可以Receiveemails)JDBC:Java操作数据库的统一抽象层。在这里多说一点:可能大部分朋友会觉得用JDBC操作DB没有意义,其实不然!笔者在面试应聘者时询问了JDBC。内容比较频繁,我的理由很简单:理解MyBatis、Hibernate等框架的核心非常重要。另外,几乎每个应聘者的简历上都会写“对技术感兴趣”,所以是否真的有“技术迷”一定要拿出来走走!本文转载自微信♂《Java方向盘》