diy搭建异步邮件服务

rabbitMQ -- 安装 1.erlang 安装rabbitMQ前要先安装erlang。 下载安装包 安装,配置环境变量Path 查看是否成功 打开cmd.exe 输入erl -version 看是否安装配置成功 2. rabbitMQ安装 安装。 配置环境变量Path 增加目录到安装盘的到sbin文件夹下 到安装目录下(D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.7\sbin)输入rabbitmq-plugins en.. 阅读详情

在很多用户注册的场景中,都需要使用邮件异步通知激活账户,这基本都以来于消息中间件,本次使用spring boot+spring amqp+spring mail搭建成功了。可能源于动手实践少,或者对于基本理论掌握不到位才犯下这些错误,现在来分享在这个过程中遇到的几个坑,希望能帮助到大家。

SMTP授权码

java mail服务其实已经很完善了,我们直接调用就行了,spring-boot-starter-mail就集成了相关服务。通过构建一个SimpleMailMessage实体对象,其中包含了邮件发送的单元信息,如title,sender,text等,然后通过一个自动注入的JavaMailSender发送出去就行了。但是这里容易踩坑的是在application.yml配置文件中spring.mail.password,并不是自己邮箱的密码,而是在邮件smtp设置的授权码,所以一开始已经报权限不足。

自动应答

通常作为消息的消费者,spring-amqp默认的模式是自动应答,即AcknowledgeMode.AUTO,如果我们需求是手动应答的话,我们的容器就要设置为AcknowledgeMode.MANUAL,而原来实现了MessageListener的监听者改实现ChannelAwareMessageListener,从名字就可以知道我们在处理消息的函数中会多了一个Channel的对象,这是用来给用户手动应答的方式。

注解监听

采用注解来监听是最方便的,我们不需要去理会消息体转换,不要自己声明connectFactory,MessageListenerContainer这些相关bean(这些在yml文件中定义,spring boot就默认帮你生成了,虽然很强大,但对于初学者并不是很好)。将 @RabbitListener(queues = “sm_queue”)注释到监听函数上面,就能实行监听处理了,非常方便。

消息格式转换

默认在生成者发送的convertAndSend方法中,会先将消息转换到对应的消息体格式,默认是java序列化对象格式,这种方式比较耗资源(包含太多无用的java对象原信息),我们将要传送的消息体转换成json格式可以大大挺高效率,在RabbitTemplate中将MessageConvert设置为Jackson2JsonMessageConverter,在web管理平台就马上可以看到消息体是content-type是application/json格式,然后我们的监听者就可以采用gson等json框架去处理,然后再发送出去。

rabbit的用户角色

以前使用rabbit并不去真正了解用户角色的作用,只记得有超级管理员。今天我创建一个了新的vhost,并为其分配了一个新的用户。当创建的用户的使用,有一个tag的选项,没有去理会,随便写。然后在web管理平台我想通过这个用户去登录的时候,我发现登录不了。查了资料才知道我这个用户权限不足。rabbit用户角色有[Admin] [Monitoring] [Policymaker] [Management] [Impersonator] [None]这几个,具体什么权限,可以上网查一下,但是如果用户想要登录web,至少也要management。

IpTables

我是在虚拟机中搭建的rabbit,在宿主机写代码访问,这其中需要用到端口转换技术。在搭建rebbit的使用,在虚拟机中curl正常返回信息,在宿主机telnet相关端口也通,但是在网页上15672却总是正在处理,就联想到了iptabels的问题。果然,在/etc/iptables.rules文件中添加了5672和15672端口后,再用命令iptables-restore < /etc/iptables.rules 让配置文件生效,宿主机就能正常访问了。不过iptables-restore命令在系统重启后就无效了,如果需要保持的话,需要写入的rc.local中。

RabbitMQ系列之windows版的安装与使用 RabbitMQ系列之windows版的安装与使用RabbitMQ 3.7.9 windwos版的下载与安装一、官网下载与安装二、相关设置1. 开启管理页面2. 用户管理3. 角色授权4. windows版对外开放需要开启端口或者关闭防火墙三、发布消息测试1. 新建Exchange2. 创建Queue3. Queue 绑定 Exchange4. 发布消息5. 获取消息四、总结 RabbitMQ 3... 阅读详情

相关推荐

一文搞定3D卷积

在讨论卷积核的时候,是不把channel维加进去的 核 = 一个可以滑动的窗口 窗口内不同位置数据之间的权值共享 3D卷积,卷积核会在3个方向上运动,那么卷积核的运动需要有三个自由度(一小块立方体,在一个大面包块内3个方向上滑动 2D卷积,卷积核只在2个方向上运动,因此只有两个自由度(一小片纸,在一大张纸内2个方向上滑动 1D卷积,卷积核只在1个方向上运动,因此只有一个自由度(一条滑窗,在一大长线上1个方向上滑动 一个卷积核运算一次 得到一个输出值 以上讨论了单个卷积核,接下来考虑多通道,一个卷积核对应一

njuptalex的博客 3万+

RabbitMQ用户管理

上一篇章介绍如何安装RabbitMQ并设置为windows的服务,有兴趣的可以点击此处查看,安装好的RabbitMQ提供了一个默认的guest账户,单独这一个账户是无法满足日常的管理需求,所以用户管理就显得非常有必要了。超级管理员,可登陆管理控制台(启用managementplugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。普通管理者,仅可登陆管理控制台(启用managementplugin的情况下),无法看到节点信息,也无法对策略进行管理。......

在路上的羊先森 9443

嵌入式STM32控制电梯面板

嵌入式STM32控制电梯面板 用点阵来显示电梯向上还是向下运动,用数码管来显示楼层数(由于灯阵显示楼层数比较困难故用数码管代替)。当按下对应的按钮,就可以去到对应层数,可上升可下降。 #include "stm32f10x.h" #include "stm32f10x_exti.h" #include "stm32f10x_it.h" #define uint unsigned int #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) #define

code_init_的博客 2111

RabbitMQ简单应用

RabbitMQ结合java的简单使用

onePlus5T的博客 1346

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1599

STM32N6570-DK ISP调试

将下载线接入STLINK V3EC接口,将BOOT1拨码拨至右边,即将其置为H,上电或已经上电的按复位,打开STM32CubeProgrammer,设置start address:0x70000000。板子消耗电流较大,即使缩短数据线接了USB供电依然不能正常点亮显示屏,最终通过板上CN2端子加了外部5V供电,仍然需要560mA的外部电流。3.烧录bin文件:STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。

liu的博客 1065

RabbitMQ用户角色及权限控制

RabbitMQ的用户角色分类: None、Impersonator、Management、Policymaker、Monitoring、Administrator None 不能访问 Management Plugin(不能管理插件) Impersonator Management 用户可以通过AMQP做的任何事; 列出自己可以通过AMQP登入的virtual hosts(虚拟主机) 查看自己的virtual hosts中的queues, exchanges 和 bindings 查看和关闭自

weixin_41575632的博客 726

别再让 AI 瞎写 SAP 代码了!这套 Claude Code Skill 的验证机制才是关键

本文深入解析了专为SAP CAP开发设计的AI辅助工具sap-cap-capire的技术架构。该工具采用四层设计:协议层集成MCP和LSP实现实时模型访问与语法检查;智能层通过4个专业化Agent(数据建模、服务开发等)分工协作;验证层确保代码质量;知识层存储文档模板。这种工程化设计解决了通用AI在CAP开发中面临的上下文不足、专业性缺失和代码质量保证等核心问题,通过本地化服务和实时反馈机制显著提升了开发效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 882

关于 RabbitMQ,应该没有比这更详细的教程了!

1. 常见消息中间件大 PK1.1 几种协议1.2. 重要产品1.3. 比较2. RabbitMQ 管理页面2.1 概览2.2 Overview2.3 Connections2.4 Cha...

MarkerHub的博客 748

小黄鸭机器人技术全解-第 07 章 关节自由度与行程参数

—鸭子歪着头转头时,转的平面是斜的,这正是它"灵动"感的来源。仿真里这是自动的(轴定义在父刚体系),复刻时不需要做任何事——

yolo模型训练找我,AI游戏合作找我 66

深度学习笔记——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总

本文简要介绍深度学习的前向传播与反向传播,以及前馈神经网络与反馈神经网络。

haopinglianlian的博客 3043

rabbitmq php

基本概念: 1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。 2.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Virtual Host 3.Exchange:接受生产者发送的消息,并根据Binding规则将消息路由给服务器

djqiang的博客 615

保险还在等灾后报案?高精度气象开始提前计算“赔付风险”

【摘要】传统保险理赔模式正在向灾前风险管理转型,保险公司竞争焦点从"赔得快"转向"预判准"。文章提出构建气象保险风险指数(WRI),通过"气象危险度×资产暴露度×标的脆弱性"精准计算损失风险,实现从天气预报向"损失天气"的转变。核心观点包括:1)需关注气象要素的强度、持续时间和空间位置三维度;2)可视化系统应直接显示预期赔付热力图;3)需解决指数保险的基差风险问题,采用多源数据融合技术;4)理想平台需包含风险地图、损失热力图、灾

专注AI大模型,软件混淆,授权 53

从项目开发到云端架构(16)

5      PaaS DIY        PaaS是一个软件层,通常连接网络资源包括操作系统实例、数据库服务器实例、网络服务器实例,甚至负载均衡,并连成一个单一的,共享的逻辑承载层,提供按需硬件和操作系统服务,而且还提供应用程序平台和解决方案堆栈。        PaaS 服务可将与应用程序部署关联的大多数 IT 管理方面自动化,包括资源配置、分段和测试、负载平衡、数据库访问以及访问平台库...

timeson 369

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Mist CE:5分钟快速部署开源多云管理平台的完整指南

在当今复杂的云环境中,管理多个云服务提供商(如AWS、Azure、Google Cloud等)往往令人头疼。**Mist CE开源多云管理平台**应运而生,它为您提供了一个统一的界面,让您可以轻松管理公有云、私有云、虚拟机、容器和物理服务器。通过这个强大的**云管理工具**,您可以在5分钟内完成部署,立即开始享受多云管理的便利。 ## 🚀 快速入门:最简部署方案 ### 系统环境准备 在开始

gitblog_00835的博客 1063

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置

上一篇博客 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 中,我们成功的安装好了RabbitMQ环境,并通过一个Java客户端示例了解了用生产者来发布消息,用消费者来消费消息。 本篇博客主要讲解下RabbitMQ如何管理用户(新增/删除/修改密码),如何给用户设置角色,如何设置用户权限,接下来,我们一一讲解。 1.用户管理 1.1查看用户列表 Rabbit...

weixin_34029949的博客 898

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

RabbitMQ用户管理+VirtualHost管理

添加用户:   如果使用的是WEB界面选择Admin,下面有一个Add a User,然后设置用户名(username),密码(password),用户角色(tags)     角色分类:Admin(管理员):        Monitoring (监控者):          Policymaker(决策者):         Management(管理者):  ...

dingchu4657的博客 233

RabbitMQ学习(七)——权限管理

今天我们讲解一下RabbitMQ中权限管理,主要包括在RabbitMQ中用户添加、用户角色分配、权限设置等知识,以及如何通过代码去设置权限的分配等。 RabbitMQ中的用户角色 在RabbitMQ中的用户角色主要分为五类: 超级管理员(administrator)、监控者(monitor)、决策制定者(policymaker)、普通管理者(management)和其他(none)。 每个角色对应...

Anumbrella 8057

关于 RabbitMQ,应该没有比这更详细的教程了

文章目录1. 常见消息中间件大 PK1.1 几种协议1.1.1 JMS1.1.1.1 JMS 介绍1.1.1.2 JMS 模型1.1.1.3 JMS 实现1.1.2 AMQP1.1.2.1 AMQP 简介1.1.2.2 AMQP 实现1.1.3 MQTT1.1.4 XMPP1.1.5 JMS Vs AMQP1.2. 重要产品1.2.1 ActiveMQ1.2.2 RabbitMQ1.2.3 RocketMQ1.2.4 Kafka1.2.5 ZeroMQ1.2.6 其他1.3. 比较2. RabbitMQ 管

江南一点雨的专栏 4659

SpringBoot发送邮件、异步、定时——基础

对应的配置文件发送邮件存在,纯文本,含有html标签的发送邮件,含有图片和附件的的邮件, 异步进行邮件调用类比于平时的短信验证就属于异步执行Controller Service

acwing的博客 362

WEB后台--邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解

本来就打算针对一些固定的特别点的业务(QQ与网易邮件、拦截设计、短信、定时器等等)来进行记录以及解析原理,这些会比较零散记录在JavaWeb的分类里面,感兴趣的童鞋可以去看下。 这篇主要是邮件和短信业务的封装实现、原理、通信系统的分析等等。后面会出一篇讲述重传方案。 文章结构:(1)邮件实现与原理;(2)短信实现与原理。

Jack__Frost的博客 1万+

邮件的异步发送

1、SendEmail类(邮件发送的核心类): package com.jmwyw.tools; import java.util.Calendar; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.MessagingException; import jav

mameng1988的博客 1188

SpringBoot如何发送邮件,以及邮件的异步和定时任务

文章目录1.创建SpringBoot项目2.配置3.写代码发邮件4.邮件的异步、定时任务 1.创建SpringBoot项目 引入依赖: <!--新增对邮件支持,使用javax.mail--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency&

qq_42682745的博客 1007

异步发送邮件总结

异步发送邮件总结使用activeMQ实现异步发送邮件:创建两个maven项目,一个叫activemq-provider,一个叫activemq-consumer;activemq-consumer项目启动后,一直处于消息监听状态,activemq-provider发送一条邮件信息,activemq-consumer接收消息,调用接口向邮件服务器发邮件。在项目中直接调用activemq-provid...

技术成就人生 2866
上一篇: 负载均衡闲谈
下一篇: TCP三次握手与四次挥手的理解和场景举例
@云师兄
博客等级 码龄10年 10粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值