当前位置: 首页 > 编程日记 > 正文

android pop3与imap方式接收邮件(javamail)

需要下载3个jar包:mail.jar/    activation.jar/    additionnal.jar

1.pop3
/**  * 以pop3方式读取邮件,此方法不能读取邮件是否为已读,已经通过测试  * */  
private void getEmail() {  List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  try {  Properties props = System.getProperties();  props.put("mail.smtp.host", "smtp.163.com");  props.put("mail.smtp.auth", "true");  Session session = Session.getDefaultInstance(props, null);  URLName urln = new URLName("pop3", "pop3.163.com", 110, null,  "邮箱名(没有@163.com)", "密码");  // 邮件协议为pop3,邮件服务器是pop3.163.com,端口为110,用户名/密码为abcw111222/123456w  Store store = session.getStore(urln);  store.connect();  Folder folder = store.getFolder("INBOX");  folder.open(Folder.READ_WRITE);  Message message[] = folder.getMessages();  if (message.length > 0) {  Map<String, Object> map;  System.out.println("Messages's length: " + message.length);  ReciveOneMail pmm = null;  for (int i = 0; i < message.length; i++) {  System.out.println("======================");  pmm = new ReciveOneMail((MimeMessage) message[i]);  System.out.println("Message " + i + " subject: "  + pmm.getSubject());  System.out.println("Message " + i + " sentdate: "  + pmm.getSentDate());  System.out.println("Message " + i + " replysign: "  + pmm.getReplySign());  boolean isRead = pmm.isNew();// 判断邮件是否为已读  System.out.println("Message " + i + " hasRead: " + isRead);  System.out.println("Message " + i + "  containAttachment: "  + pmm.isContainAttach((Part) message[i]));  System.out.println("Message " + i + " form: "  + pmm.getFrom());  System.out.println("Message " + i + " to: "  + pmm.getMailAddress("to"));  System.out.println("Message " + i + " cc: "  + pmm.getMailAddress("cc"));  System.out.println("Message " + i + " bcc: "  + pmm.getMailAddress("bcc"));  pmm.setDateFormat("yy年MM月dd日 HH:mm");  System.out.println("Message " + i + " sentdate: "  + pmm.getSentDate());  System.out.println("Message " + i + " Message-ID: "  + pmm.getMessageId());  // 获得邮件内容===============  
                pmm.getMailContent((Part) message[i]);  System.out.println("Message " + i + " bodycontent: \r\n"  + pmm.getBodyText());  String file_path = File.separator + "mnt" + File.separator  + "sdcard" + File.separator;  System.out.println(file_path);  pmm.setAttachPath(file_path);  pmm.saveAttachMent((Part) message[i]);  map = new HashMap<String, Object>();  map.put("from", pmm.getFrom());  map.put("title", pmm.getSubject());  map.put("time", pmm.getSentDate());  map.put("read", isRead);  list.add(map);  }  SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,  list, R.layout.item_receiveemail, new String[] {  "from", "title", "time", "read" }, new int[] {  R.id.item_receive_sendname,  R.id.item_receive_title,  R.id.item_receive_sendtime,  R.id.item_receive_read });  lv.setAdapter(adapter);  } else {  Toast.makeText(MainActivity.this, "没有邮件", Toast.LENGTH_SHORT)  .show();  }  } catch (NoSuchProviderException e) {  // TODO Auto-generated catch block  
        e.printStackTrace();  } catch (MessagingException e) {  // TODO Auto-generated catch block  
        e.printStackTrace();  } catch (Exception e) {  // TODO Auto-generated catch block  
        e.printStackTrace();  }  
}  

2.imap方式

/**  * 以imap方式读取邮件,可以判定读取邮件是否为已读  * */  
private void getImapEmail() {  String user = "abcw111222@163.com";// 邮箱的用户名  String password = "123456w"; // 邮箱的密码  
  Properties prop = System.getProperties();  prop.put("mail.store.protocol", "imap");  prop.put("mail.imap.host", "imap.163.com");  Session session = Session.getInstance(prop);  int total = 0;  IMAPStore store;  try {  store = (IMAPStore) session.getStore("imap"); // 使用imap会话机制,连接服务器  
  store.connect(user, password);  IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX"); // 收件箱  
        folder.open(Folder.READ_WRITE);  // 获取总邮件数  total = folder.getMessageCount();  System.out.println("---共有邮件:" + total + " 封---");  // 得到收件箱文件夹信息,获取邮件列表  List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  System.out.println("未读邮件数:" + folder.getUnreadMessageCount());  Message[] messages = folder.getMessages();  if (messages.length > 0) {  Map<String, Object> map;  System.out.println("Messages's length: " + messages.length);  ReciveOneMail pmm = null;  for (int i = 0; i < messages.length; i++) {  System.out.println("======================");  pmm = new ReciveOneMail((MimeMessage) messages[i]);  System.out.println("Message " + i + " subject: "  + pmm.getSubject());  try {  System.out.println("Message " + i + " sentdate: "  + pmm.getSentDate());  System.out.println("Message " + i + " replysign: "  + pmm.getReplySign());  boolean isRead;// 用来判断该邮件是否为已读  
                    String read;  Flags flags = messages[i].getFlags();  if (flags.contains(Flags.Flag.SEEN)) {  System.out.println("这是一封已读邮件");  isRead = true;  read = "已读";  } else {  System.out.println("未读邮件");  isRead = false;  read = "未读";  }  System.out.println("Message " + i + " hasRead: "  + isRead);  System.out.println("Message " + i  + "  containAttachment: "  + pmm.isContainAttach((Part) messages[i]));  System.out.println("Message " + i + " form: "  + pmm.getFrom());  System.out.println("Message " + i + " to: "  + pmm.getMailAddress("to"));  System.out.println("Message " + i + " cc: "  + pmm.getMailAddress("cc"));  System.out.println("Message " + i + " bcc: "  + pmm.getMailAddress("bcc"));  pmm.setDateFormat("yy年MM月dd日 HH:mm");  System.out.println("Message " + i + " sentdate: "  + pmm.getSentDate());  System.out.println("Message " + i + " Message-ID: "  + pmm.getMessageId());  // 获得邮件内容===============  
                    pmm.getMailContent((Part) messages[i]);  System.out.println("Message " + i  + " bodycontent: \r\n" + pmm.getBodyText());  String file_path = File.separator + "mnt"  + File.separator + "sdcard" + File.separator;  System.out.println(file_path);  pmm.setAttachPath(file_path);  pmm.saveAttachMent((Part) messages[i]);  map = new HashMap<String, Object>();  map.put("from", pmm.getFrom());  map.put("title", pmm.getSubject());  map.put("time", pmm.getSentDate());  map.put("read", read);  list.add(map);  } catch (Exception e) {  // TODO Auto-generated catch block  
                    e.printStackTrace();  }  }  SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,  list, R.layout.item_receiveemail, new String[] {  "from", "title", "time", "read" }, new int[] {  R.id.item_receive_sendname,  R.id.item_receive_title,  R.id.item_receive_sendtime,  R.id.item_receive_read });  lv.setAdapter(adapter);  }  } catch (javax.mail.NoSuchProviderException e) {  // TODO Auto-generated catch block  
        e.printStackTrace();  } catch (MessagingException e) {  // TODO Auto-generated catch block  
        e.printStackTrace();  }  }  

下面为用到的一个类,用来读取除了判断是否已读的信息之外的内容

/**  * 接收邮箱中的邮件,可以接收带附件的  * (目前接收的邮件中含有中文内容,会出现乱码,但是标题不会乱码)  * 邮件中的内容如果用专门的阅读器也不会出现乱码现象,图片等都可以下载  * */  
@SuppressLint("DefaultLocale")  
public class ReciveOneMail {  private MimeMessage mimeMessage = null;  private String saveAttachPath = ""; // 附件下载后的存放目录  private StringBuffer bodytext = new StringBuffer();// 存放邮件内容  private String dateformat = "yy-MM-dd HH:mm"; // 默认的日前显示格式  public ReciveOneMail(MimeMessage mimeMessage) {  this.mimeMessage = mimeMessage;  }  public void setMimeMessage(MimeMessage mimeMessage) {  this.mimeMessage = mimeMessage;  }  /**  * 获得发件人的地址和姓名  */  public String getFrom() throws Exception {  InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();  String from = address[0].getAddress();  if (from == null)  from = "";  String personal = address[0].getPersonal();  if (personal == null)  personal = "";  String fromaddr = personal + "<" + from + ">";  return fromaddr;  }  /**  * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址  */  @SuppressLint("DefaultLocale")  public String getMailAddress(String type) throws Exception {  String mailaddr = "";  String addtype = type.toUpperCase();  InternetAddress[] address = null;  if (addtype.equals("TO") || addtype.equals("CC")  || addtype.equals("BCC")) {  if (addtype.equals("TO")) {  address = (InternetAddress[]) mimeMessage  .getRecipients(Message.RecipientType.TO);  } else if (addtype.equals("CC")) {  address = (InternetAddress[]) mimeMessage  .getRecipients(Message.RecipientType.CC);  } else {  address = (InternetAddress[]) mimeMessage  .getRecipients(Message.RecipientType.BCC);  }  if (address != null) {  for (int i = 0; i < address.length; i++) {  String email = address[i].getAddress();  if (email == null)  email = "";  else {  email = MimeUtility.decodeText(email);  }  String personal = address[i].getPersonal();  if (personal == null)  personal = "";  else {  personal = MimeUtility.decodeText(personal);  }  String compositeto = personal + "<" + email + ">";  mailaddr += "," + compositeto;  }  mailaddr = mailaddr.substring(1);  }  } else {  throw new Exception("Error emailaddr type!");  }  return mailaddr;  }  /**  * 获得邮件主题  */  public String getSubject() throws MessagingException {  String subject = "";  try {  subject = MimeUtility.decodeText(mimeMessage.getSubject());  if (subject == null)  subject = "";  } catch (Exception exce) {  }  return subject;  }  /**  * 获得邮件发送日期  */  @SuppressLint("SimpleDateFormat")  public String getSentDate() throws Exception {  Date sentdate = mimeMessage.getSentDate();  SimpleDateFormat format = new SimpleDateFormat(dateformat);  return format.format(sentdate);  }  /**  * 获得邮件正文内容  */  public String getBodyText() {  return bodytext.toString();  }  /**  * 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析  */  public void getMailContent(Part part) throws Exception {  String contenttype = part.getContentType();  int nameindex = contenttype.indexOf("name");  boolean conname = false;  if (nameindex != -1)  conname = true;  System.out.println("CONTENTTYPE: " + contenttype);  if (part.isMimeType("text/plain") && !conname) {  bodytext.append((String) part.getContent());  } else if (part.isMimeType("text/html") && !conname) {  bodytext.append((String) part.getContent());  } else if (part.isMimeType("multipart/*")) {  Multipart multipart = (Multipart) part.getContent();  int counts = multipart.getCount();  for (int i = 0; i < counts; i++) {  getMailContent(multipart.getBodyPart(i));  }  } else if (part.isMimeType("message/rfc822")) {  getMailContent((Part) part.getContent());  } else {  }  }  /**  * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"  */  public boolean getReplySign() throws MessagingException {  boolean replysign = false;  String needreply[] = mimeMessage  .getHeader("Disposition-Notification-To");  if (needreply != null) {  replysign = true;  }  return replysign;  }  /**  * 获得此邮件的Message-ID  */  public String getMessageId() throws MessagingException {  return mimeMessage.getMessageID();  }  /**  * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】pop3协议使用时不能判断。  */  public boolean isNew() throws MessagingException {  boolean isnew = false;//由于isnew设为false所以每次显示的都为未读  Flags flags = ((Message) mimeMessage).getFlags();  System.out.println("--------flags-------" + flags);  Flags.Flag[] flag = flags.getSystemFlags();  System.out.println("----flag----" + flag);  System.out.println("flags's length: " + flag.length);  for (int i = 0; i < flag.length; i++) {  System.out.println("flag=======" + flag[i]);  System.out.println("-=-=-=Flags.Flag.SEEN=-=-=-="+Flags.Flag.SEEN);  if (flag[i] == Flags.Flag.SEEN) {  isnew = true;  System.out.println("seen Message.......");  break;  }  }  return isnew;  }  /**  * 判断此邮件是否包含附件  */  @SuppressLint("DefaultLocale")  public boolean isContainAttach(Part part) throws Exception {  boolean attachflag = false;  // String contentType = part.getContentType();  if (part.isMimeType("multipart/*")) {  Multipart mp = (Multipart) part.getContent();  for (int i = 0; i < mp.getCount(); i++) {  BodyPart mpart = mp.getBodyPart(i);  String disposition = mpart.getDisposition();  if ((disposition != null)  && ((disposition.equals(Part.ATTACHMENT)) || (disposition  .equals(Part.INLINE))))  attachflag = true;  else if (mpart.isMimeType("multipart/*")) {  attachflag = isContainAttach((Part) mpart);  } else {  String contype = mpart.getContentType();  if (contype.toLowerCase().indexOf("application") != -1)  attachflag = true;  if (contype.toLowerCase().indexOf("name") != -1)  attachflag = true;  }  }  } else if (part.isMimeType("message/rfc822")) {  attachflag = isContainAttach((Part) part.getContent());  }  return attachflag;  }  /**  * 【保存附件】  */  @SuppressLint("DefaultLocale")  public void saveAttachMent(Part part) throws Exception {  String fileName = "";  if (part.isMimeType("multipart/*")) {  Multipart mp = (Multipart) part.getContent();  for (int i = 0; i < mp.getCount(); i++) {  BodyPart mpart = mp.getBodyPart(i);//主体部分得到处理  String disposition = mpart.getDisposition();  if ((disposition != null)  && ((disposition.equals(Part.ATTACHMENT)) || (disposition  .equals(Part.INLINE)))) {//ATTACHMENT附件,INLINE嵌入  fileName = mpart.getFileName();  if (fileName.toLowerCase().indexOf("gb18030") != -1) {  fileName = MimeUtility.decodeText(fileName);  }  saveFile(fileName, mpart.getInputStream());  } else if (mpart.isMimeType("multipart/*")) {  saveAttachMent(mpart);  } else {  fileName = mpart.getFileName();  if ((fileName != null)  && (fileName.toLowerCase().indexOf("GB18030") != -1)) {  fileName = MimeUtility.decodeText(fileName);  saveFile(fileName, mpart.getInputStream());  }  }  }  } else if (part.isMimeType("message/rfc822")) {  saveAttachMent((Part) part.getContent());  }  }  /**  * 【设置附件存放路径】  */  public void setAttachPath(String attachpath) {  this.saveAttachPath = attachpath;  }  /**  * 【设置日期显示格式】  */  public void setDateFormat(String format) throws Exception {  this.dateformat = format;  }  /**  * 【获得附件存放路径】  */  public String getAttachPath() {  return saveAttachPath;  }  /**  * 【真正的保存附件到指定目录里】  */  @SuppressLint("DefaultLocale")  private void saveFile(String fileName, InputStream in) throws Exception {  String osName = System.getProperty("os.name");  System.out.println("----fileName----" + fileName);  // String storedir = getAttachPath();  
//      String separator = "";  if (osName == null)  osName = "";  File storefile = new File(File.separator + "mnt" + File.separator  + "sdcard" + File.separator + fileName);  storefile.createNewFile();  System.out.println("storefile's path: " + storefile.toString());  
//       for(int i=0;storefile.exists();i++){  
//       storefile = new File(storedir+separator+fileName+i);  
//       }  
  BufferedOutputStream bos = null;  BufferedInputStream bis = null;  try {  bos = new BufferedOutputStream(new FileOutputStream(storefile));  bis = new BufferedInputStream(in);  int c;  while ((c = bis.read()) != -1) {  bos.write(c);  bos.flush();  }  } catch (Exception exception) {  exception.printStackTrace();  throw new Exception("文件保存失败!");  } finally {  bos.close();  bis.close();  }  }  
}  

转载于:https://www.cnblogs.com/zhujiabin/p/5366938.html

相关文章:

什么是条件组合覆盖_物史政组合分析,新高考最终受益者丨选科17期

导读&#xff0c;规划物理历史政治是新高考33模式下存在的选科组合&#xff0c;为了给马上面临选科问题的高一、高二考生提供有效帮助&#xff0c;自主选拔在线选科模型解读第17期就来分析一下该组合的学科特性、适合人群、优势劣势、专业覆盖及往年选考情况。说明&#xff1a;…

进击时代!王雪红的谦卑与坚守

节前&#xff0c;HTC董事长王雪红发表了一封内部信&#xff0c;王雪红在心中表示&#xff0c;2015年&#xff0c;HTC不仅要在质量、创新能力与工作效率方面更进步&#xff0c;并表示&#xff0c;“我们未来企业成长的动能不仅包含智能手机&#xff0c;还会加入新的领域如RE、虚…

Python中的过滤器

寄语&#xff1a;新的有一天&#xff0c;开始了&#xff0c;让我们把内心的一些想法都放一放&#xff0c;努力去学习吧。 《Python基础教程&#xff08;第2版&#xff0c;修订版&#xff09;&#xff09;》 Assignment 赋值 Variable 变量 Nan是一种特殊的简写 not a numb…

UE4材质着色器全面学习教程

你会学到什么 通过所有着色器类型和设计的实际演示&#xff0c;学习创建材质 要求 对虚幻的基本理解会有所帮助 了解纹理的一般知识(不仅限于UE4)也很有用 描述 在这个系列中&#xff0c;我将带你设置大量不同的材料&#xff0c;教你如何以实用的方式使用虚幻4材料系统。我们…

codeforces #310 div1 C

操作无论是U还是L&#xff0c;都会使原图形分裂成两个图形&#xff0c;且两个图形的操作互不影响 我们又发现由于操作点只可能在下斜线上&#xff0c;如果将操作按x排序 那么无论是U还是L&#xff0c;都会将操作序列完整分割成两半&#xff0c;且两个操作序列互不影响 这样我们…

硬盘温度70度正常吗_70多岁老年人原来血压160,现在130正常吗?医生为你分析实情...

70多岁的老年人&#xff0c;原来有高血压&#xff0c;高压160左右&#xff0c;现在是130左右&#xff0c;正常吗&#xff1f;这个问题问的太过笼统&#xff0c;我们只好通过这个问题&#xff0c;来分享一些老年高血压患者血压控制的一些知识点&#xff0c;希望能够对老年人的高…

使用python愉快地做高数线代题目~

今天接触到了python&#xff0c;发现真是极易上手啊&#xff01;对比c语言是什么鬼东西 诶&#xff0c;等下&#xff0c;看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了&#xff0c;觉得c语言真的是废材! 不。。。不是的。。。python 基础库几乎都…

Docker总结

2019独角兽企业重金招聘Python工程师标准>>> 查看docker的子命令&#xff0c;直接敲docker或完整的docker help就可以了: bash-3.2$ docker Usage: docker [OPTIONS] COMMAND [arg...] A self-sufficient runtime for linux containers. Options:-D, --debugfalse …

Python中的对象,类,super()函数

对象&#xff1a;&#xff08;1&#xff09;外观的特征 &#xff08;2&#xff09;正在做的事情 比如&#xff1a;那个穿蓝色衣服的正在打球的帅哥 类&#xff1a;属性&#xff08;静态的变量&#xff09;方法&#xff08;函数&#xff09;是对对象的近似 类名约定是以大写字…

Blender赛车动画制作学习教程 Learn Race Car Animation with Blender

使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender。免费下载和免费用于任何目的。 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&…

数据结构-线性表的顺序结构

1 #include "stdio.h"2 #include "stdlib.h"3 4 typedef int ElemType; //线性表存储基本类型5 typedef int Status; //基本操作函数类型6 #define LIST_INT_SIZE 50 //线性表初始化存储空间分配量7 #define LISTINCREMENT 10 //线…

项目背景怎么描述_课程游戏背景下幼儿户外活动的组织和实施 ——记岱山县课程项目实施组活动...

课程游戏背景下幼儿户外活动的组织与实施——记岱山县课程项目实施组活动为了深入推进园本化课程实施的实践与研究&#xff0c;加强项目组幼儿园课程的建设与实施&#xff0c;提升项目组幼儿园课程质量。11月23日&#xff0c;县课程项目实施组活动在东沙镇中心幼儿园开展。本次…

兔子生兔子递归的理解

重要的是找规律&#xff01; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 月份 兔子对数 1 …

美团App首页实现之Category_HeaderView可翻页实现

一。主要实现功能&#xff1a;自定义indicator&#xff0c;侧滑页面切换页面内容&#xff0c;indicator跟着变化&#xff1b;二。实现步奏&#xff1a;1.自定义ViewPagerIndicator①&#xff1a;定义三个不同颜色的画笔②&#xff1a;在画布上画三个静态圆③&#xff1a;改变CX…

爬虫与浏览器的区别,爬虫产生(出自简书)

一篇文章了解爬虫技术现状 - 简书https://www.jianshu.com/p/fbdad6f77d0c 需求万维网上有着无数的网页&#xff0c;包含着海量的信息&#xff0c;无孔不入、森罗万象。但很多时候&#xff0c;无论出于数据分析或产品需求&#xff0c;我们需要从某些网站&#xff0c;提取出我们…

Unity2D游戏开发和C#编程大师班

本课程采用现代游戏开发的最新内容和最新技术(Unity 2D 2022) 学习任何东西的最好方法是以一种真正有趣的方式去做&#xff0c;这就是这门课程的来源。如果你想了解你看到的这些不可思议的游戏是如何制作的&#xff0c;没有比这门课更好的起点了。我们确保本课程具备从初学者(即…

python实训总结报告书_20172304 实验四python综合实践报告

20172304 实验四python综合实践报告 姓名&#xff1a;段志轩 学号&#xff1a;20172304 指导教师&#xff1a;王志强 课程&#xff1a;Python程序设计 实验时间&#xff1a;2020年5月13日至2020年6月14日 实验分析 本次是使用python来进行软件开发&#xff0c;python是一个有很…

Tornado框架

Tornado介绍Tornado 是 FriendFeed 使用的可扩展的异步非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py&#xff08;豆瓣用这个写的&#xff09; 或者 Google 的 webapp&#xff0c;不过为了能有效利用非阻塞式服务器环境&#xff0c;这个 Web 框…

重组系统分区时设置系统盘

在快速分区那里选择另外一个模式&#xff0c;并且只选一个主分区

Javascript:DOM动态创建元素实例应用

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Dom:动态创建元素</title> </head> <body><ul id"demo1"> </ul> <input type"text" id"t…

上帝和面向对象的七天

上帝用7天创造了“面向对象” |【Python之父客串】http://bbs.fishc.com/thread-102596-1-1.html(出处: 鱼C论坛) 第一天&#xff1a; 计算机的诞生使得人类使用汇编语言进行编程&#xff0c;上帝说这个太复杂了&#xff0c;于是将编译的秘密告诉约翰.巴克斯.于是巴克斯创造了…

Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya

准备好开始为游戏制作自己的角色动画了吗&#xff1f; 你会学到什么 了解Maya的界面 优化并准备好你的模型&#xff0c;为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼&#xff0c;以便在任何游戏引擎中制作动画 了解IK和FK系统之间的区别 组织我们的3d场景以获得…

KMP算法简单分析

定义问题 字符串匹配是这样一个问题&#xff1a; 对于两个包含且仅包含字母表∑中的字母的串P&#xff0c;T&#xff0c;计算出所有有效的**移进**s使得P[1..|P|] T[s1..s|P|]。(|P|为P的长度)。 或者说&#xff1a;求出在什么位置P被T完全包含。 为了表达方便&#xff0c;定…

mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询

图/文&#xff1a;迷神Thinkphp是一款不错的国产框架&#xff0c;使用范围广&#xff0c;应用也比较多。随着网站访问增大往往需要使用mysql主从同步功能&#xff0c;本身Thinkphp自带了主从读写分离的功能了。但是我们经常有一个场景就是某些特定的查询需要从主库进行查询&…

Microsoft Store无法联网解决方法

设置 网络 代理 关闭

MongoDB for C#基础入门

笔者这里采用的是mongoDB官网推荐使用.net驱动&#xff1a; http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/ 有关于MongoDB的安装读者可以参考其他的博客&#xff0c;对于基本的学习来说并不需要进行过多的配置。 创建连接 这一步骤跟ADO.NET连…

李宏毅机器学习自己的笔记(一)----------Introduction of MachineLearning

视频来源&#xff1a;李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p2 声明&#xff1a;图片均来自于视频截图 问题一&#xff1a; AI&#xff0c;机器学习 &#xff0c;深度学习关系 答&#xff1a;AI人工智能…

Unity从零开始构建能力体系 Unity Ability System

从零开始构建能力体系 你会学到什么 如何实施能力体系 如何使用用户界面工具包创建用户界面 如何使用Unity的GraphView API 如何实现保存系统 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根…

mybatis-plus对datetime返回去掉.0_华为AI认证-TensorFlow2.0编程基础

参考《HCIA-AI2.0培训教材》《HCIA-AI2.0实验手册》认证要求&#xff1a;了解TensorFlow2.0是什么以及其特点掌握TensorFlow2.0基础和高阶操作方法熟悉TensorFlow2.0中的Keras API简介&#xff1a;TensorFlow是目前最为流行的深度学习框架&#xff0c;是人工智能领域的第一主要…