8.12 day07 java项目上午servlet实战:邮件发送的QQ邮箱为例子详细过程,跨域访问相关概念

 

跨域

 

基本流程
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
浏览器发出CORS简单请求,只需要在头信息之中增加一个Origin字段。
浏览器发出CORS非简单请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

只要同时满足以下两大条件,就属于简单请求。
1) 请求方法是以下三种方法之一:
HEAD
GET
POST
2)HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

3, 具体实现(spring boot)

/**
* 描述: 使用Filter 处理跨域请求,即CORS(跨来源资源共享)。
*
* @author city space
*
*/
@Configuration
public class SimpleCORS
{
/**
* 设置 跨域请求参数,处理跨域请求
*
* @return
*/
@Bean
public CorsFilter corsFilter()
{
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}



private CorsConfiguration buildConfig()
{
CorsConfiguration corsConfiguration = new CorsConfiguration();

// 允许跨域访问的域名
corsConfiguration.addAllowedOrigin("*");
// 请求头
corsConfiguration.addAllowedHeader("*");
// 请求方法
corsConfiguration.addAllowedMethod(HttpMethod.DELETE);
corsConfiguration.addAllowedMethod(HttpMethod.POST);
corsConfiguration.addAllowedMethod(HttpMethod.GET);
corsConfiguration.addAllowedMethod(HttpMethod.PUT);
corsConfiguration.addAllowedMethod(HttpMethod.DELETE);
corsConfiguration.addAllowedMethod(HttpMethod.OPTIONS);
// 预检请求的有效期,单位为秒。
corsConfiguration.setMaxAge(3600L);
// 是否支持安全证书
corsConfiguration.setAllowCredentials(true);

return corsConfiguration;
}
}

 

4, 配置项解释
4.1 Access-Control-Allow-Origin
该字段必填。它的值要么是请求时Origin字段的具体值,要么是一个*,表示接受任意域名的请求。

 

4.2 Access-Control-Allow-Methods
该字段必填。它的值是逗号分隔的一个具体的字符串或者*,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。

 

4.3 Access-Control-Expose-Headers
4.3 该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。

 

4.4 Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否允许发送Cookie.默认情况下,不发生Cookie,即:false。对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json,这个值只能设为true。如果服务器不要浏览器发送Cookie,删除该字段即可。

 

4.5 Access-Control-Max-Age
该字段可选,用来指定本次预检请求的有效期,单位为秒。在有效期间,不用发出另一条预检请求。

 

注意: CORS请求发送Cookie时,Access-Control-Allow-Origin只能是与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

 

邮件

 

 

 

QQ邮箱设置

官方文档

 

 

 

 

 

实现过程:

1.下载jar包跟源码

 

2.新建一个类:SendEmail.class

在main方法里:

 定义字符串

接收邮箱地址,

发送邮箱地址,

邮件主题,

邮件内容,

服务器的smtp,

//新建properties对象

//传输协议(写死的),如果写错了host,会自动在本地发送接收邮件

//设置认证

//实现认证策略(每个人的都不同,因为认证码都不同) 见第三步创建

//创建session对象(刚刚写的properties,刚刚写的认证策略)

//创建MimeMessage对象,用来封装要发送的数据

//设置发件人

//设置收件人

//设置邮件标题

//设置邮件内容

//设置邮件发送的日期

//生成最终邮件内容

//设置debug模式

session.setDebug(true);

//创建transport传输对象

Transport transport = session.getTransport("smtp");

transport.connect();

//发送给谁,所有接收人

//传输完毕就关闭

transport.close();

 

 

 

 

3.新建一个认证类继承Authenticator来重写getPasswordAuthenticator()方法

无参构造

 

 

 

4.尝试连接

 

debug模式会报错,这样方便查找错误

4.服务端 ReceiveEmail类

//pop服务器

//协议

//用户名(邮箱地址)

//设置对应QQ的授权码

//设置属性列表

//设置smtp的服务器,从服务器读取数据

//从session中获取链接

//暂时不开启debug模式,为了运行好看一点

//获取store对象

//把服务器传进去,连接到服务器

//获取对应的邮箱列表(PS:通过pop3获得的Folder对象调用这个方法

邮件夹名称只能为"INBOX",)

//读写权限都有,这样就可以获取所有邮件了

//因为不止一封邮件,所以搞一个集合

//遍历去访问

for(Message message : messages){

}

 

163的例子

package com.email;

import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MyAhthenticator extends Authenticator {
	public static String senderAddress="发送的邮箱地址";
	public static String receiveAddress="接收的邮箱地址";
	public static String senderAccount="主题";
	public static String senderPassword="密码";
	
	public static void main(String[] args) throws Exception {
		Properties props = new Properties();
		props.setProperty("mail.smtp.auth", "true");
		props.setProperty("mail.transport.protocol", "smtp");
		props.setProperty("mail.smtp.host", "smtp.163.com");
		Session session = Session.getInstance(props);
		session.setDebug(true);
		Message msg=getMimeMessage(session);
		Transport transport = session.getTransport();
		transport = session.getTransport();
		transport.connect(senderAccount, senderPassword);
		transport.sendMessage(msg,msg.getAllRecipients());
		transport.close();
	}
	
	  public static MimeMessage getMimeMessage(Session session) throws Exception{
	        //创建一封邮件的实例对象
	        MimeMessage msg = new MimeMessage(session);
	        //设置发件人地址
	        msg.setFrom(new InternetAddress(senderAddress));
	        /**
	         * 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
	         * MimeMessage.RecipientType.TO:发送
	         * MimeMessage.RecipientType.CC:抄送
	         * MimeMessage.RecipientType.BCC:密送
	         */
	        msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(receiveAddress));
	        //设置邮件主题
	        msg.setSubject("邮件主题","UTF-8");
	        //设置邮件正文
	        msg.setContent("简单的纯文本邮件!", "text/html;charset=UTF-8");
	        //设置邮件的发送时间,默认立即发送
	        msg.setSentDate(new Date());
	         
	        return msg;
	    }
}

运行效果:

(收不到邮箱就在垃圾箱里找找)

 

 

 

QQ邮箱的太麻烦了,所以这里用的是网上的163.的例子

想试试qq邮箱的可以按上面的步骤做

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一身正气z

打赏随心就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值