学编程,来源栈;先学习,再交钱
当前系列: Java语法 修改

复习:J&C:Email和短信:SMTP / 服务接口


JavaMail类库

下载地址: https://github.com/javaee/javamail/releases

除了jar包(复习),还有sample,以及source code,无微不至啊!

配合git演示:在eclipse中引入javax.mail.jar包

  1. 复制粘贴到当前项目文件夹下(推荐:好习惯)
  2. Build Path设置


Properties

封装连接SMTP服务器所需的各种信息(和谁连接,怎么连接),例如邮件服务器的主机名(host)、端口号(port)、采用的邮件协议(protocol)等

继承自HashTable,可以直接new出来:

Properties props = new Properties();
键值都是String类型。不太好,但也没有办法,唯一的优势就是灵活:
props.setProperty("mail.smtp.host", "smtp.163.com");
props.setProperty("mail.transport.protocol", "smtp");

有些SMTP服务器需要认证,指定用户名和密码:

props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.user", "feige_20200214");
props.setProperty("mail.password", "yz17bang");
还有如果需要SSL加密,加上以下代码即可:
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);


Session

会话,代表着一次(客户端到SMTP服务器的)连接。(以后会经常用到)

将上述Properties作为构造函数参数传入,获得一个session对象:
Session session = Session.getDefaultInstance(props);
可以开启调试模式,得到更多的信息:
session.setDebug(true);


MimeMessage

封装email本身的相关信息。

mime:媒体类型Multipurpose Internet Mail Extensions)是一种标准,用来表示文档、文件或字节流的性质和格式

根据上文中session对象创建:

MimeMessage message = new MimeMessage(session);

设置标题、正文等:

message.setSubject("源栈欢迎您!");
message.setText("大神小班,拎包入住,………………");

发件人需要使用 InternetAddress对象:

message.setSender(new InternetAddress("feige_20200214@163.com"));

收件人可以通过RecipientType指定抄送(RecipientType.CC)和密送(RecipientType.BCC):

message.setRecipient(RecipientType.TO,     //收件人,正主
		new InternetAddress("2282636022@qq.com"));


HTML格式

如果想要email的正文按HTML格式显示,就需要使用setContent()方法

message.setContent(
		"<a href='https://17bang.ren'>一起帮</a>大神小班,拎包入住,………………",
		"text/html;charset=UTF-8"
		);

在第二个参数中指明

  • text/html:包含了HTML标签
  • charset=UTF-8:使用utf-8编码

但是,最终收件人收到的email文本是否能够按HTML格式显示,我们无法控制。因为有些POP服务器或收件客户端工具基于安全考虑,会拒绝使用HTML

┐(゚~゚)┌


Transport

一切准备就绪!准备发送。

首先根据session对象获取邮件传输对象Transport:

Transport transport = session.getTransport();
然后调用connect()方法,连接SMTP服务器。如果连接有账户验证要求,还需要传入用户名和密码:
transport.connect("feige_20200214","yz17bang");

这里再次传入用户名和密码看起来和Properties中的设置重复,但是不同的SMTP服务器有不同的要求。经过测试,163邮箱要求在connect()中设置即可。

调用sendMessage()方法,收件人可以直接从message中获取(有重复了,^_^)

transport.sendMessage(message, message.getAllRecipients());
最后,Transport是实现了Closable的,不要忘了调用close()方法,或者直接使用try块:
transport.close();
//或者干脆:
try(Transport transport = session.getTransport()){


log4j

可以下载相应的jar包,但从现在开始,我们开始使用Maven

演示:

  1. 将项目转换成maven项目:右键 -> configure -> convert to Maven
  2. pom.xml中添加添加dependencies节点和一个dependency:
    </build><!-- 和build节点并列 -->
    <dependencies>
    	<dependency>
    		<groupId>org.apache.logging.log4j</groupId>
    		<artifactId>log4j-core</artifactId>
    		<version>2.8.2</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.logging.log4j</groupId>
    		<artifactId>log4j-api</artifactId>
    		<version>2.8.2</version>
    	</dependency>
    </dependencies>
  3. 右键 -> maven -> Update Project :从远程下载/更新jar包到本地


作业

见:J&C:Email和短信:SMTP / 服务接口
email 电子邮件 javamail
觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 Java语法 中继续学习:

下一课: 已经是最后一课了……

我们的 特色

  • 先学习,后付费
  • 线上/线下,自由组合

更多了解

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧