2.如何使用IMAP服务?
使用IMAP很简单,首先,您需要先在QQ邮箱中启用IMAP功能,然后,配置好客户端,就可以使用了。
3.如何开启IMAP服务?
请进入:邮箱设置->帐户,然后选中开启IMAP服务。
4.如何配置邮件客户端使用IMAP服务?
请先确定您的客户端支持IMAP协议,目前已经支持的有:
电子邮件客户端:
Foxmail
Outlook Express
Outlook 2003
Outlook 2007
我选择的是:Foxmail
那应该如何配置电子邮件客户端使用IMAP?传送门
========================================================================
SendMail.java
/**
-
@author Administrator
*/
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SendMail {
// 发件人的邮箱账号如:xxx@163.com
public static String sendEmailAccount = “这里填你的邮箱”;
// 发件人的邮箱的授权码(自己在邮箱服务器中开启并设置)
public static String sendEmailPassword = “这里填你得到的授权码”;
// 发件人邮箱的SMTP服务器地址,如:smtp.163.com
public static String sendEmailSMTPHost = “smtp.qq.com”;
// 收件人的邮箱账号
public static String receiveMailAccount = “”;
// 把发送邮件封装为函数,参数为收件人的邮箱账号和要发送的内容
public void sendMail(String receiveMailAccount, String mailContent) {
// 创建用于连接邮件服务器的参数配置
Properties props = new Properties();
// 设置使用SMTP协议
props.setProperty(“mail.transport.protocol”, “smtp”);
// 设置发件人的SMTP服务器地址
props.setProperty(“mail.smtp.host”, sendEmailSMTPHost);
// 设置需要验证
props.setProperty(“mail.smtp.auth”, “true”);
final String smtpPort = “465”;
props.setProperty(“mail.smtp.port”, smtpPort);
props.setProperty(“mail.smtp.socketFactory.class”, “javax.net.ssl.SSLSocketFactory”);
props.setProperty(“mail.smtp.socketFactory.fallback”, “false”);
props.setProperty(“mail.smtp.socketFactory.port”, smtpPort);
// 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getDefaultInstance(props);
// 设置debug模式,便于查看发送过程所产生的日志
session.setDebug(true);
try {
// 创建一封邮件
MimeMessage message = createMimeMessage(session, sendEmailAccount, receiveMailAccount);
message.setContent(mailContent,“text/html;charset=UTF-8”);
// 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
transport.connect(sendEmailAccount, sendEmailPassword);
// 发送邮件, 发到所有的收件地址, 通过message.getAllRecipients() 可以获取到在创建邮件对象时添加的所有收件人
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
Logger.getLogger(SendMail.class.getName()).log(Level.SEVERE, null, e);
} catch (MessagingException e) {
// TODO Auto-generated catch block
Logger.getLogger(SendMail.class.getName()).log(Level.SEVERE, null, e);
} catch (Exception e) {
// TODO Auto-generated catch block
Logger.getLogger(SendMail.class.getName()).log(Level.SEVERE, null, e);
}
}
/**
-
@param session
-
和服务器交互的会话
-
@param sendMail
-
发件人邮箱
-
@param receiveMail
-
收件人邮箱
-
@return
-
@throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
// 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 设置发件人姓名和编码格式
message.setFrom(new InternetAddress(sendMail, “老米”, “UTF-8”));
// 收件人
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, “尊敬的用户”, “UTF-8”));
// 设置邮件主题
message.setSubject(“找回密码提醒”, “UTF-8”);
// 设置邮件正文
//message.setContent( “这是您的密码:”,“text/html;charset=UTF-8”);
// 设置发件时间
message.setSentDate(new Date());
// 保存设置
message.saveChanges();
return message;
}
}
==========================================================================
记得映射到web.xml
ForgetPSWServlet
你的包名.ForgetPSWServlet
ForgetPSWServlet
/ForgetPSWServlet
ForgetPSWServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import java.security.interfaces.RSAPrivateKey;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.jw.MyFirstWebAPP.RSAutil.GenKeyFromString;
import net.jw.MyFirstWebAPP.RSAutil.MyConstant;
import net.jw.MyFirstWebAPP.RSAutil.RSAUtil;
import net.jw.MyFirstWebAPP.EmailUtil.SendMail;
import net.jw.MyFirstWebAPP.User;
import net.jw.MyFirstWebAPP.UserDAO;
import net.sf.json.JSONObject;
import org.bouncycastle.util.encoders.Base64;
/**
*忘记密码
- @author Administrator
*/
public class ForgetPSWServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型
response.setContentType(“text/html;charset=utf-8”);
request.setCharacterEncoding(“utf-8”);
response.setCharacterEncoding(“utf-8”);
try (PrintWriter out = response.getWriter()) {
//获得请求中传来的用户名和邮箱
String accountNumber = request.getParameter(“AccountNumber”).trim();
String email = request.getParameter(“Email”).trim();
byte[] bytereuser = Base64.decode(accountNumber);//用户名解密BASE64
byte[] bytereemail = Base64.decode(email);//密码解密BASE64
// System.out.println(byteres);
// System.out.println(“字符串转成byte数组:”+new String(byteres));
// 获取私钥
RSAUtil rsa = new RSAUtil();
RSAPrivateKey priKey = (RSAPrivateKey) GenKeyFromString
.getPrivateKey(MyConstant.priKey1);
// 拿着私钥解用户名
byte[] encRsaByteuser = rsa.decrypt(priKey,
bytereuser);
// 拿着私钥解邮箱
byte[] encRsaByteemail = rsa.decrypt(priKey,
bytereemail);
//邮箱验证结果
int verifyResult = verifyForget(new String(encRsaByteuser),new String(encRsaByteemail));
Map<String, String> params = new HashMap<>();
JSONObject jsonObject = new JSONObject();
if (verifyResult == -1) {
params.put(“Result”, “TheUserDoesNotExist”);
}
else if (verifyResult == 0){
params.put(“Result”, “EmailError”);
}
else if(verifyResult == 1){
params.put(“Result”,“CorrectEmail”);//验证邮箱和用户成功
SendMail mySendMail = new SendMail(); //发送邮箱
User user=UserDAO.queryUserByEmail(new String(encRsaByteemail));
if(user!=null) {
String psw=user.getPassword();
mySendMail.sendMail(new String(encRsaByteemail), “温馨提醒!!!您的密码为:”+psw+“\n阅读完请立即删除该邮件,登录成功后请尽快修改密码!!!以防密码被他人窃取。”);
}
}
jsonObject.put(“params”, params);
out.write(jsonObject.toString());
} catch (Exception ex) {
Logger.getLogger(ForgetPSWServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
-
验证用户名邮箱是否正确
-
@param userName
-
@param email
*/
private int verifyForget(String userName, String email) {
User user = UserDAO.queryEmail(userName);
boolean hasUser = false;
boolean rightEmail = false;
//账户邮箱验证
if(!UserDAO.checkUserName(userName)){
hasUser = true;
if(user.getEmail().equals(email)){
rightEmail = true;
}
}
if(!hasUser) return -1;//无该用户
else if(!rightEmail) return 0;//有该用户,但是邮箱输入错误
return 1;//有该用户,且邮箱输入正确
}
}
如果以下导入包报错:
import net.jw.MyFirstWebAPP.RSAutil.GenKeyFromString;
import net.jw.MyFirstWebAPP.RSAutil.MyConstant;
import net.jw.MyFirstWebAPP.RSAutil.RSAUtil;
import net.jw.MyFirstWebAPP.User;
import net.jw.MyFirstWebAPP.UserDAO;
请去这篇文章阅读,里面都有以上类的!
=========================================================================
ForgetPswActivity.java
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.administrator.loginclient.HttpsUtils.HTTPSTrustManager;
import com.example.administrator.loginclient.R;
import com.example.administrator.loginclient.RsaUtils.GenKeyFromString;
import com.example.administrator.loginclient.RsaUtils.MyConstant;
import com.example.administrator.loginclient.RsaUtils.RSAUtil;
import org.bouncycastle.util.encoders.Base64;
import org.json.JSONException;
import org.json.JSONObject;
import java.security.interfaces.RSAPublicKey;
import java.util.HashMap;
import java.util.Map;
/**
- 找回密码
*/
public class ForgetPswActivity extends BaseActivity {
public static RequestQueue queue;
private static Context mContext;
public static boolean flag=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forget_psw);
queue = Volley.newRequestQueue(getApplicationContext());
mContext = this;
final EditText AccountNumber = (EditText) findViewById(R.id.forget_edit_account);
final EditText Email = (EditText) findViewById(R.id.forget_edit_email);
Button submit=(Button)findViewById(R.id.forget_btn_sudmit);
Button to_register=(Button)findViewById(R.id.to_register);
Button back_to_login=(Button)findViewById(R.id.back_to_login);
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String name = AccountNumber.getText().toString().trim();
final String email = Email.getText().toString().trim();
// 获取Rsa 工具类对象
RSAUtil rsa = new RSAUtil();
// 获取公钥
RSAPublicKey pubKey = (RSAPublicKey) GenKeyFromString
.getPubKey(MyConstant.pubKey1);
// 使用公钥加密 数据
byte[] enRsaByte_email = new byte[0];
byte[] enRsaBytes_user = new byte[0];
try {
enRsaByte_email = rsa.encrypt(pubKey, email.getBytes());//邮箱加密
enRsaBytes_user = rsa.encrypt(pubKey, name.getBytes());//用户名加密
} catch (Exception e) {
e.printStackTrace();
}
/**
- base64对byte数组进行编码,进过编码后得到String传输到对服务端解码得出byte数组。
*/
String enRsaStr_email = new String(Base64.encode(enRsaByte_email));//密码byte数组转成字符串
String enRsaStr_user = new String(Base64.encode(enRsaBytes_user));//用户名byte数组转成字符串
ForgetPSWRequest(enRsaStr_user,enRsaStr_email);
Toast.makeText(mContext, “请稍等…”, Toast.LENGTH_LONG).show();
}
});
to_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent intent = new Intent(mContext, RegisterActivity.class);
// startActivity(intent);
}
});
back_to_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent intent = new Intent(mContext, MainActivity.class);
// startActivity(intent);
}
});
}
public static void ForgetPSWRequest(final String accountNumber,final String email){
//请求地址
String url = “http://localhost:8083/MyFirstWebAPP/ForgetPSWServlet”; //注①
String tag = “Forget”; //注②
//取得请求队列
RequestQueue requestQueue = queue;
//防止重复请求,所以先取消tag标识的请求队列
requestQueue.cancelAll(tag);
HTTPSTrustManager.allowAllSSL();//允许所有https请求
//创建StringRequest,定义字符串请求的请求方式为POST(省略第一个参数会默认为GET方式)
final StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = (JSONObject) new JSONObject(response).get(“params”); //注③
String result = jsonObject.getString(“Result”); //注④
if (result.equals(“TheUserDoesNotExist”)) { //注⑤
Toast.makeText(mContext, “用户名不存在或邮箱错误”, Toast.LENGTH_SHORT).show();
}
else if (result.equals(“EmailError”)){
//做自己的登录失败操作,如Toast提示
Toast.makeText(mContext, “用户不存在或邮箱错误”, Toast.LENGTH_LONG).show();
}
else if(result.equals(“CorrectEmail”)){
Toast.makeText(mContext, “密码已发至您邮箱,请注意查收!”, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
//做自己的请求异常操作,如Toast提示(“无网络连接”等)
Log.e(“TAG”, e.getMessage(), e);
Toast.makeText(mContext, “无网络连接”, Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//做自己的响应错误操作,如Toast提示(“请稍后重试”等)
Log.e(“TAG”, error.getMessage(), error);
Toast.makeText(mContext, “请稍后重试”, Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put(“AccountNumber”, accountNumber); //注⑥
params.put(“Email”, email); //注⑥
return params;
}
};
//设置Tag标签
request.setTag(tag);
//将请求添加到队列中
requestQueue.add(request);
}
}
activity_forget_psw.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
tools:context=“.Activities.ForgetPswActivity”>
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:inputType=“textPersonName”
android:ems=“10”
android:hint=“请输入用户名”
android:textColorHint=“#003399”
android:id=“@+id/forget_edit_account”
android:textSize=“20dp”
android:textColor=“#003399”
android:layout_margin=“10dp”/>
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:ems=“10”
android:hint=“注册时填的邮箱”
android:textColorHint=“#003399”
android:id=“@+id/forget_edit_email”
android:textSize=“20dp”
android:textColor=“#003399”
android:layout_margin=“10dp”/>
<Button
android:text=“提交”
android:textSize=“20dp”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:id=“@+id/forget_btn_sudmit”
android:layout_marginLeft=“20dp”
android:layout_marginRight=“20dp”
android:background=“@color/lavender”/>
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:
他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。
刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。
技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!
提升自己去挑战一下BAT面试难关吧
对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
最后祝各位新人都能坚持下来,学有所成。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
中…(img-dpfzn2iG-1712905966113)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-l9MsH7tA-1712905966114)]
最后
**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:
他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。
刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。
技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!
提升自己去挑战一下BAT面试难关吧
[外链图片转存中…(img-chLBIeWf-1712905966114)]
对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
最后祝各位新人都能坚持下来,学有所成。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-GZanjsNy-1712905966114)]