Java网络编程精解讲义14.ppt_第1页
Java网络编程精解讲义14.ppt_第2页
Java网络编程精解讲义14.ppt_第3页
Java网络编程精解讲义14.ppt_第4页
Java网络编程精解讲义14.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java网络编程精解 作者 孙卫琴参考书籍 技术支持网址 www javathinker org 第14章通过JavaMailAPI收发邮件 参考 Java网络编程精解 的第14章 14 1E mail协议简介14 2JavaMailAPI简介14 3建立JavaMail应用程序的开发环境14 4创建JavaMail应用程序14 5身份验证14 6URLName类14 7创建和读取复杂电子邮件14 8操纵邮件夹 14 1E mail协议简介 邮件服务器按照提供的服务类型 可以分为发送邮件服务器 简称发送服务器 和接收邮件服务器 简称接收服务器 发送邮件服务器使用邮件发送协议 现在常用的是SMTP 所以通常发送邮件服务器也称为SMTP服务器 接收邮件服务器使用接收邮件协议 常用的有POP3协议和IMAP协议 所以通常接收邮件服务器也称为POP3服务器或IMAP服务器 14 1E mail协议简介 14 1 1SMTP简单邮件传输协议 SMTP SimpleMailTransferProtocol 即简单邮件传输协议 是Internet传送E mail的基本协议 也是TCP IP协议组的成员 SMTP协议解决邮件系统如何通过一条链路 把邮件从一台机器传送到另一台机器上的问题 SMTP协议的特点是具有良好的可伸缩性 这也是它成功的关键 它既适用于广域网 也适用于局域网 SMTP协议由于非常简单 使得它得到了广泛的运用 在Internet上能够发送邮件的服务器几乎都支持SMTP协议 14 1 2POP3邮局协议 POP3 PostOfficeProtocol3 即邮局协议第3版 是Internet接收邮件的基本协议 也是TCP IP协议组的成员 RFC1939描述了POP3协议 网址为 http www ietf org rfc rfc1939 txt POP3既允许接收服务器向邮件用户发送邮件 也可以接收来自SMTP服务器的邮件 邮件客户端软件会与POP3服务器交互 下载由POP3服务器接收到的邮件 基于POP3协议的邮件系统能提供快速 经济和方便的邮件接收服务 深受用户的青睐 14 1 3接收邮件的新协议IMAP IMAP InternetMessageAccessProtocol 即互联网消息访问协议 是一种功能比POP3更强大的新的接收邮件协议 目前最新的IMAP协议版本为IMAP4 RFC2060描述了IMAP4 网址为 http www ietf org rfc rfc2060 txt IMAP4与POP3协议一样提供了方便的下载邮件服务 允许用户在脱机状态下阅读已经下载到本地硬盘的邮件 但IMAP4的功能远远不只这些 它还具有以下功能 摘要浏览邮件的功能 选择性下载附件的功能 鼓励用户把邮件一直存储在邮件服务器上 允许用户把远程邮件服务器上的邮箱作为信息存储工具 14 1 4MIME简介 MIME MultipurposeInternetMailExtensions 多用途Internet邮件扩充标准 不是邮件传输协议 而是对邮件格式所作的规范 RFC2045 RFC2046和RFC2047对MIME作了描述 MIME是对RFC822的扩充 RFC822规定了内容只包括采用ASCII编码的纯文本的邮件的格式 而MIME允许在邮件中包含附件 14 2JavaMailAPI简介 SUN公司制定了JavaMailAPI 它封装了按照各种邮件通信协议 如IMAP POP3和SMTP 与邮件服务器通信的细节 为Java应用程序提供了收发电子邮件的公共接口 参见图14 2 14 2JavaMailAPI简介 JavaMailAPI主要位于javax mail包和javax mail internet中 图14 3为其中主要类的类框图 14 2JavaMailAPI简介 1 javax mail Session类 表示邮件会话 是JavaMailAPI的最高层入口类 2 javax mail Store类 表示接收邮件服务器上的注册用户的存储空间 通过Store类的getFolder 方法 可以访问用户的特定邮件夹 3 javax mail Folder类 代表邮件夹 4 javax mail Message类 代表电子邮件 5 javax mail Address类 代表邮件地址 6 javax mail Transport类 根据指定的邮件发送协议 通常是SMTP 通过指定的邮件发送服务器来发送邮件 14 3建立JavaMail应用程序的开发环境 JDK中并不包含JavaMailAPI 为了开发JavaMail应用程序 需要从SUN公司的网站下载JavaMailAPI及其实现的类库 该类库由两个JAR文件组成 mail jar和activation jar 另外 为了运行本课介绍的程序 还应该准备好可以访问的邮件服务器 本课选用Merak邮件服务器 它是一个商业邮件服务器 支持STMP POP3和IMAP协议 可以从网站上下载它的试用版本 14 4创建JavaMail应用程序 假定邮件服务器安装在本地计算机上 客户程序访问邮件服务器的admin 用户需要提供如下信息 Stringhostname localhost Stringusername admin Stringpassword 1234 14 4创建JavaMail应用程序 JavaMail应用程序在初始化过程中需要执行如下步骤 步骤 1 设置JavaMail属性 Propertiesprops newProperties props put mail transport protocol smtp props put mail store protocol imap props put mail smtp class com sun mail smtp SMTPTransport props put mail imap class com sun mail imap IMAPStore props put mail smtp host hostname 14 4创建JavaMail应用程序 以上代码设置了如下JavaMail属性 mail transport protocol 指定邮件发送协议 mail store protocol 指定邮件接收协议 mail smtp class 指定支持SMTP协议的Transport具体类 允许由第三方提供 mail imap class 指定支持IMAP协议的Store具体类 允许由第三方提供 mail smtp host 指定采用SMTP协议的邮件发送服务器的IP地址或主机名 14 4创建JavaMail应用程序 步骤 2 调用javax mail Session类的静态方法Session getDefaultInstance 获得Session实例 该方法根据已经配置的JavaMail属性来创建Session实例 Sessionmailsession Session getDefaultInstance props 步骤 3 调用Session的getStore Stringprotocol 方法来获得Store对象 参数protocol指定接收邮件协议 Storestore mailsession getStore imap 步骤 1 把mail imap class属性设为com sun mail imap IMAPStore 因此以上getStore 方法返回com sun mail imap IMAPStore类的实例 14 4创建JavaMail应用程序 步骤 4 调用Store对象的connect 方法连接到接收邮件服务器 调用connect 方法时 应该指定接收邮件服务器的主机名或IP地址 用户名和口令 store connect hostname username password 14 4创建JavaMail应用程序 获得了Store对象后 就可以通过它来访问邮件服务器上的特定邮件用户了 通常会对邮件用户执行以下操作 操作 1 创建并发送邮件 创建邮件msg newMimeMessage mailsession InternetAddress toAddrs InternetAddress parse admin false 设置邮件接收者msg setRecipients Message RecipientType TO toAddrs 设置邮件的主题msg setSubject hello 设置邮件的发送者msg setFrom newInternetAddress admin 设置邮件的正文msg setText Howareyou 发送邮件Transport send msg Transport的静态方法send Message 负责发送邮件服务器 邮件发送协议由mail transport protocol属性指定 邮件发送服务器由mail smtp host属性指定 14 4创建JavaMail应用程序 操作 2 打开inbox邮件夹收取邮件 获得名为 inbox 的邮件夹Folderfolder store getFolder inbox 打开邮件夹folder open Folder READ ONLY 获得邮件夹中的邮件数目System out println Youhave folder getMessageCount messagesininbox 获得邮件夹中的未读邮件数目System out println Youhave folder getUnreadMessageCount unreadmessagesininbox 在IMAP协议中 inbox邮件夹是邮件用户的保留邮件夹 用户不允许删除该邮件夹 邮件服务器把所有接收到的新邮件都存在该邮件夹中 14 4创建JavaMail应用程序 操作 3 从邮件夹中读取邮件 从邮件夹中读取第一封邮件Messagemsg folder getMessage 1 System out println thefirstmessageininbox 获得邮件的发送者 主题和正文System out println From msg getFrom 0 System out println Subject msg getSubject System out println Text msg getText 14 5身份验证 在实际应用中 往往希望在连接邮件服务器时 弹出一个对话框 提示用户输入用户名和口令 为了达到这一效果 需要按照以下步骤创建和使用javax mail Authenticator类 1 创建一个javax mail Authenticator类的子类 假定名为MailAuthenticator 实现getPasswordAuthentication 方法 2 创建MailAuthenticator对象 并且把它作为参数传给Session的getDefaultInstance 方法 Authenticatorma newMailAuthenticator Sessionsession Session getDefaultInstance props ma 3 连接到接收邮件服务器时 把用户名和口令设为null store connect receiveHost null null 14 5身份验证 14 6URLName类 javax mail URLName类表示URL的名字 URLName类与 URL类的区别在于 URLName类不尝试连接目标地址 构造URLName对象时 无需指定协议处理器 URLName类可以表示非标准的URL地址 比如URLName对象可以表示接收邮件服务器上的特定邮件夹 形式为 协议名 用户名 口令 主机 端口 邮件夹 14 6URLName类 URLName类中包括以下getXXX 方法 getProtocol 获得URL名字中的协议 getHost 获得URL名字中的主机 getUsername 获得URL名字中的用户名 getPassword 获得URL名字中的口令 getFile 获得URL名字中的文件名或者邮件夹名 14 6URLName类 例程14 5的MailClientURLName类的init URLNameurlName 方法从一个URLName对象中获取连接到接收邮件服务器的各种信息 这个URLName对象表示的URL名字为 imap admin 1234 localhost publicvoidinit URLNameurlName throwsException receiveProtocol urlName getProtocol receiveHost urlName getHost username urlName getUsername password urlName getPassword 设置属性Propertiesprops newProperties props put mail smtp host sendHost 创建Session对象session Session getDefaultInstance props 创建Store对象store session getStore receiveProtocol 连接到邮件服务器store connect receiveHost username password 14 7创建和读取复杂电子邮件 如图14 9所示 按照MIME规范 电子邮件包括邮件头和正文两部分 邮件头中包括日期 发送者地址 接收者地址和主题等信息 正文部分可以包括普通文本内容 还可以包括一个或多个附件 14 7创建和读取复杂电子邮件 javax mail Message抽象类表示邮件 它的具体子类为javax mail MimeMessage类 它提供了读取和设置邮件中各个部分的getXXX 和setXXX 方法 setSubject Stringsubject 方法设置邮件的主题 setHeader Stringname Stringvalue 方法设置邮件头部的某一项 setContent Objecto Stringtype 方法设置邮件的正文 14 7 1邮件地址 javax mail Address抽象类表示邮件地址 它的最常用的子类是javax mail InternetAddress类 InternetAddress类表示Internet网上通用的邮件地址 形式为admin 或者 Admin 14 7 1邮件地址 InternetAddress类提供了一系列get和set方法 用来读取和设置address personal和charset等属性 例如 getAddress 读取address属性 getPersonal 读取personal属性 setAddress Stringaddress 设置address属性 setPersonal Stringpersonal 设置personal属性 14 7 1邮件地址 以下两段代码是等价的 InternetAddressaddr newInternetAddress admin Admin 或者 InternetAddressaddr newInternetAddress addr setAddress admin addr setPersonal Admin 14 7 1邮件地址 MimeMessage类的以下方法用于读取或设置邮件中的地址信息 Address getFrom 读取发送者的邮件地址 Address getRecipients Message RecipientTypetype 读取特定接收类型的邮件地址 voidsetFrom Addressaddress 设置发送者的邮件地址 voidsetRecipients Message RecipientTypetype Address addresses 设置特定接收类型的邮件地址 参数addresses指定多个接收地址 voidsetRecipients Message RecipientTypetype Stringaddresses 设置特定接收类型的邮件地址 参数addresses指定一个接收地址 14 7 1邮件地址 Message RecipientType类型的静态常量表示地址类型 包括 Message RecipientType TO 主接收地址 Message RecipientType CC 抄送地址 Message RecipientType BCC 广播地址 14 7 1邮件地址 以下程序代码设置了邮件的各项邮件地址 MimeMessagemsg newMimeMessage session InternetAddressfrom newInternetAddress admin InternetAddress to InternetAddress parse admin java mail InternetAddresscc newInternetAddress linda j2ee InternetAddress bcc InternetAddress parse abc xyz msg setFrom from msg setRecipients Message RecipientType TO to msg setRecipients Message RecipientType CC cc msg setRecipients Message RecipientType BCC bcc 14 7 2邮件头部 MimeMessage类的以下getXXX 和setXXX 方法用于读取和设置邮件头部的特定项 String getHeader Stringname voidsetHeader Stringname Stringvalue 14 7 2邮件头部 以下两段代码的作用是等价的 它们的作用都是设置邮件的主题 msg setHeader subject hello 或者 msg setSubject hello 14 7 2邮件头部 MimeMessage类的getAllHeaders 方法返回一个包含Header对象的Enumeration对象 每个Header对象表示邮件头部的一项 以下程序代码遍历邮件头部的所有项 for Enumeratione msg getAllHeaders e hasMoreElements Headerheader e nextElement System out println header getName header getValue 14 7 3邮件标记 多数接收邮件服务器允许邮件包含特定的标记信息 这些标记可以使用户更方便的管理邮件 JavaMailAPI用javax mail Flags类的Flags Flag内部类的静态实例来表示标记 Flags Flag ANSWERED 表示邮件已经回复 该标记由客户程序设置 Flags Flag DELETED 表示邮件已经被删除 该标记由客户程序设置 Flags Flag RECENT 表示刚刚被添加到邮件夹的邮件 即最近一次打开邮件夹时 被添加到邮件夹的邮件 该标记由Folder类的实现来设置 客户程序只能读取该标记 Flags Flag FLAGGED 表示邮件已经作了某种标记 客户程序可以设置该标记 Flags Flag SEEN 表示邮件已经被阅读 该标记由JavaMailAPI的实现来设置 当客户程序调用了邮件的getContent 方法时 该邮件被加上Flags Flag SEEN标记 客户程序可以修改这个标记 Flags Flag DRAFT 表示邮件是草稿 该标记由客户程序设置 Flags Flag USER 表示邮件所在的邮件夹支持用户自定义的标记 该标记由接收邮件服务器设置 客户程序只能读取该标记 客户程序可以通过folder getPermanentFlags contains Flags Flag USER 方法判断邮件夹是否支持用户自定义的标记 14 7 3邮件标记 MimeMessage类提供了三个与标记有关的方法 voidsetFlags Flagsflags booleanset 设置或取消一组标记 voidsetFlags Flags Flag booleanset 设置或取消特定标记 booleanisSet Flags Flagflag 察看是否设置了某个标记 14 7 3邮件标记 以下两段程序代码是等价的 它们的作用都是为一个邮件设置SEEN和ANSWERED标记 Flagsflags newFlags flags add Flags Flag SEEN flags add Flags Flag ANSWERED msg setFlags flags true 或者 msg setFlags Flags Flag SEEN true msg setFlags Flags Flag ANSWERED true 14 7 3邮件标记 如果邮件所在的邮件夹支持用户标记 还可以通过以下方式为邮件加上具有特殊含义的用户标记 Flagsflags newFlags flags add privateemail flags add abouttravelling msg setFlags flags true 表示这是一封关于旅游的私人信件 14 7 3邮件标记 以下程序代码察看邮件的所有标记 if msg isSet Flags Flag DELETED System out println DELETED elseif msg isSet Flags Flag SEEN System out println SEEN elseif msg isSet Flags Flag ANSWERED System out println ANSWERED elseif msg isSet Flags Flag RECENT System out println RECENT elseif msg isSet Flags Flag DRAFT System out println DRAFT elseif msg isSet Flags Flag FLAGGED System out println FLAGGED elseif msg isSet Flags Flag USER 读取用户标记String userFlags msg getFlags getUserFlags for inti 0 i userFlags length i System out println UserFlag userFlags i 14 7 4邮件正文 邮件正文是邮件中最复杂的一部分 正文可以是纯文本 还可以包括若干附件 JavaMailAPI把邮件正文的各个组成部分以及整个邮件都抽象为部件 部件用javax mail Part接口表示 一个Part对象和一个DataHandler对象关联 DataHandler对象负责处理部件包含的数据 Part接口有两个子接口 MimePart接口和BodyPart接口 MimePart接口表示符合MIME规范的部件 BodyPart接口表示可以作为邮件正文的组成部分的部件 14 7 4邮件正文 图14 10Part接口及其相关类的类框图 14 7 4邮件正文 MimeBodyPart类实现了MimePart接口和BodyPart接口 因此MimeBodyPart对象可以作为MimeMessage的正文的组成部分 MimeMessag类的以下三个方法都用于设置正文 voidsetText Strinttxt voidsetContent Objecto Stringtype voidsetContent Multipartmp 14 7 4邮件正文 如果MimeMessage仅包含纯文本内容 可以通过以下两种方式设置邮件正文 msg setText Howareyou 或者msg setContent Howareyou text plain 如果MimeMessage的正文包括多个组成部分 既有纯文本内容 还有若干附件 那就应该先创建一个包含正文的各个组成部分的MimeMultipart对象 然后调用msg setContent Multipartmp 方法 把MimeMultipart对象作为邮件的正文 14 7 4邮件正文 例程14 7的MailClientSendAttach类创建了一个包括附件的邮件 然后发送该邮件 这封邮件的正文包括三个组成部分 分别用三个MimeBodyPart对象来表示 第一个MimeBodyPart对象表示邮件的纯文本内容 其他两个MimeBodyPart对象分别表示两个附件 这些MimeBodyPart对象都加入到一个MimeMultipart对象中 例程14 7MailClientSendAttach javaimportjavax mail importjavax mail internet importjavax activation importjava util publicclassMailClientSendAttachextendsMailClientForCitiz privateStringfromAddr java mail 发送者地址privateStringtoAddr java mail 接收者地址 14 7 4邮件正文 publicvoidsendMessage StringfromAddr StringtoAddr throwsException 创建一个邮件Messagemsg newMimeMessage session InternetAddress toAddrs InternetAddress parse toAddr false msg setRecipients Message RecipientType TO toAddrs msg setSubject hello msg setSentDate newDate msg setFrom newInternetAddress fromAddr Stringattch1 attch1 rar Stringattch2 attch2 rar Multipartmultipart newMimeMultipart 加入文本内容MimeBodyPartmimeBodyPart1 newMimeBodyPart mimeBodyPart1 setText Howareyou multipart addBodyPart mimeBodyPart1 14 7 4邮件正文 加入第一个附件MimeBodyPartmimeBodyPart2 newMimeBodyPart FileDataSourcefds newFileDataSource attch1 得到数据源mimeBodyPart2 setDataHandler newDataHandler fds mimeBodyPart2 setDisposition Part ATTACHMENT mimeBodyPart2 setFileName fds getName 设置文件名multipart addBodyPart mimeBodyPart2 加入第二个附件MimeBodyPartmimeBodyPart3 newMimeBodyPart fds newFileDataSource attch2 得到数据源mimeBodyPart3 setDataHandler newDataHandler fds mimeBodyPart3 setDisposition Part ATTACHMENT mimeBodyPart3 setFileName fds getName 设置文件名multipart addBodyPart mimeBodyPart3 msg setContent multipart 设置邮件的正文Transport send msg 发送邮件 14 7 4邮件正文 publicstaticvoidmain String args throwsException MailClientSendAttachclient newMailClientSendAttach client init client sendMessage client fromAddr client toAddr client receiveMessage client close 14 7 4邮件正文 例程14 8的MailClientReadAttach类的processMessage Messagemsg 方法演示如何解析并处理可能包括附件的邮件 publicstaticvoidprocessMessage Messagemsg throwsException processMessageHeader msg 处理邮件头部Objectbody msg getContent 获得邮件正文if bodyinstanceofMultipart processMultipart Multipart body else processPart msg publicstaticvoidprocessMessageHeader Messagemsg throwsException for Enumeratione msg getAllHeaders e hasMoreElements Headerheader e nextElement System out println header getName header getValue 14 7 4邮件正文 publicstaticvoidprocessMultipart Multipartmp throwsException for inti 0 i mp getCount i processPart mp getBodyPart i publicstaticvoidprocessPart Partpart throwsException StringfileName part getFileName Stringdisposition part getDisposition StringcontentType part getContentType System out println fileName fileName System out println disposition disposition System out println contentType contentType if contentType toLowerCase startsWith multipart processMultipart Multipart part getContent elseif fileName null 14 7 4邮件正文 续上页 processPart Partpart 方法 if fileName null 如果不是附件 打印到控制台part writeTo System out System out println else Filefile newFile fileName 创建一个在文件系统中不存在的文件for inti 1 file exists i StringnewName i fileName file newFile newName 把附件保存到一个文件中OutputStreamout newBufferedOutputStream newFileOutputStream file InputStreamin newBufferedInputStream part getInputStream intb while b in read 1 out write b out close in close 14 8操纵邮件夹 Folder类提供了一系列操纵邮件夹的方法 voidopen intmode 打开邮件夹 参数mode指定打开邮件夹的模式 可选值包括Folder READ ONLY 只允许读取邮件夹中的邮件 和Folder READ WRITE 允许读取 添加或删除邮件夹中的邮件 booleanisOpen 判断邮件夹是否打开 voidclose booleanexpunge 关闭邮件夹 booleanexists 判断是否在邮件服务器上存在物理上的邮件夹 booleancreate inttype 在邮件服务器上创建一个物理邮件夹 参数type指定邮件夹的类型 可选值包括 Folder HOLDS FOLDERS 允许包含子邮件夹 和Folder HOLDS MESSAGES 允许包含邮件 如果邮件夹创建成功 就返回true 14 8操纵邮件夹 booleandelete booleanrecurse 删除邮件夹 如果删除成功就返回true Folder list 返回当前邮件夹下面的所有子邮件夹 booleanrenameTo Folderf 修改邮件夹的名字 如果修改成功 就返回true Message expunge 永久删除邮件夹中所有设置了Flags Flag DELETE标记的邮件 MessagegetMessage intmsgnum 获得特定的邮件 参数msgnum指定邮件的索引 邮件的索引从1开始 14 8操纵邮件夹 intgetUnreadMessageCount 返回邮件夹中所有未读邮件 即没有设置Flags Flag SEEN标记的邮件 的数目 intgetMessageCount 返回邮件夹中所有邮件的数目 在有些Folder类的实现中 如果邮件夹未打开 就返回 1 voidappendMessages Message msgs 向邮件夹中加入邮件 voidcopyMessages Message msgs Folderfolder 把当前邮件夹中的一些邮件拷贝到参数folder指定的目标邮件夹中 14 8操纵邮件夹 Store类的getFolder 方法返回的Folder对象总是处于关闭状态 并且有可能实际上并不存在 以下程序代码在邮件服务器上创建了物理上的邮件夹draft Folderfolder store getFolder draft if folder exists folder create Folder HOLDS MESSAGES 14 8操纵邮件夹 在MailClientFolder类的deleteMessage 方法中 如果邮件不在trash邮件夹中 首先把这个邮件在trash邮件夹中备份 然后把原来邮件夹中的邮件的Flags Flag DELETED标记设为true 如果邮件在trash邮件夹中 就直接把邮件的Flags Flag DELETED标记设为true 在以上两种情况下 最后都调用待删除邮件所在邮件夹的expunge 方法 该方法永久删除邮件夹中所有Flags Flag DELETED标记为true的邮件 14 8操纵邮件夹 publicvoiddeleteMessage intarrayOpt StringfolderName throwsException Folderfolder store getFolder folderName if folder exists thrownewException folderName 该邮件夹不存在 if folder isOpen folder open Folder READ WRITE for inti 0 i arrayOpt length i if arrayOpt i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论