JavaMail8 详解Message和MIME文档格式.docx
《JavaMail8 详解Message和MIME文档格式.docx》由会员分享,可在线阅读,更多相关《JavaMail8 详解Message和MIME文档格式.docx(31页珍藏版)》请在冰点文库上搜索。
头字段
MIME头根据在邮件包中的位置,大体上分为MIME信息头和MIME段头。
(译者:
MIME信息头指整个邮件的头,而MIME段头只每个MIME段的头。
)
MIME信息头
0.MIME-Version:
这个头提供了所用MIME的版本号。
这个值习惯上为1.0。
1.Content-Type:
它定义了数据的类型,以便数据能被适当的处理。
有效的类型有:
text,image,audio,video,applications,multipart和message。
注意任何一个二进制附件都应该被叫做application/octet-stream。
这个头的一些用例为:
image/jpg,application/mswork,multipart/mixed,这只是很少的一部分。
2.Content-ID:
如果Content-Type是message/external-body或multipart/alternative时,这个头就有用了,它超出了本文的范围。
3.Content-MD5
4.Content-Language
5.Content-Description:
这是一个可选的头。
它是任何信息段内容的自由文本描述。
描述必须使用us-ascii码。
6.Content-Disposition:
一个试验性的头,它用于给客户程序/MUA提供提示,来决定是否在行内显示附件或作为单独的附件。
7.Content-Transfer-Encoding:
这是所有头中最重要的一个,因为它说明了对数据所执行的编码方式,客户/MUA将用它对附件进行解码。
对于每个附件,可以使用7bit,8bit,binary,quoted-printable,base64和x-encodingname中的一种编码方式。
7bit
7bit这里指的是7位的ASCII编码方式。
编码是用在USASCII字符集上的常用的一种编码方式,也就是,保持它的原样。
8bit
8位元ASCII码。
binary
binary编码一般不用。
quotedprintable
因为欧洲的一些文字和ASCII字符集中的某些字符有部分相同。
如果邮件消息使用的是这些语言的话,于ASCII重叠的那些字符可以原样使用,ASCII字符集中不存在的字符采用形如“=?
?
”的方法编码。
这里“?
”需要用将字符编码后的16进制数字来指定。
采用quoted-printable编码的消息,长度不会变得太长,而且大部分都是ASCII中的字符,即使不通过解码也大致可以读懂消息的内容。
base64
base64是一种将二进制的01序列转化成ASCII字符的编码方法。
编码后的文本或者二进制消息,就可以运用SMTP等只支持ASCII字符的协议传送了。
Base64一般被认为会平均增加33%的报文长度,而且,经过编码的消息对于人类来说是不可读的。
x-encodingname
这个值是预留的扩展。
8.Date
发信日期
9.From
邮件作者
10.Sender
发信人
11.Reply-To
回邮地址
12.ToCCBCC
To收信人地址
CC抄送:
另一个收信人地址
BCC密送:
收信人地址,但其它收信人看不到这个收信人的地址。
13.Subject
主题
14.Message-ID
MIME段头
MIME段头(出现在实际的MIME附件部分的头),除了MIME-Version头,可以拥有以上任何头字段。
如果一个MIME头是信息块的一部分,它将作用于整个信息体。
例如,如果Content-Transfer-Encoding显示在信息(指整个信息)头中,它应用于整个信息体,但是如果它显示在一个MIME段里,它"
只能"
用于那个段中。
B、Message
javax.mail.Part(基础接口)
publicinterfacePart
Part是Message和BodyParts的基础接口。
Part一组由attribute和Content组成。
Attribute
JavaMail定义了一组标准属性,大多数现有的邮件服务器都支持。
这些属性都有set和get方法存取。
其他非标准属性用setHeader()和getHeader()存取。
Content
Part中的Content存在以下格式,DataHandler,inputstream,Javaobject。
DataHandler通过getDataHandler()获取,DataHandler对象允许客户发现在content上的有效方法,然后实例化合适的组件来执行这些操作。
inputstream通过getInputStream()获取,在取得inputstream之前,所有邮件格式编码
已经被解析。
Javaobject通过getContent()获取,返回对象可能是一个多Multipart对象。
javax.mail.internet.MimePart(继承于Part)
publicinterfaceMimePartextendsPart
添加对RFC822RFC2045MIME的支持。
javax.mail.Message(抽象基础类)
publicabstractclassMessageimplementsPart
javax.mail.internet.MimeMessage(继承于Message)
publicclassMimeMessageextendsMessageimplementsMimePart
B.1、javax.mail.Part
方法
booleanisMimeType(StringmimeType)
IsthisPartofthespecifiedMIMEtype?
ThismethodcomparesonlytheprimaryTypeandsubType.
判断Part是否是指定的MIME类型,此法方法只判断主类型和子类型。
内容参数将被忽略。
如:
但用isMimeType("
text/plain”);
比较"
text/plain;
charset=foobar"
.时,将返回true。
当子类型使用特殊字符”*”时,子类型的比较也将被忽略。
B.2、javax.mail.Message
Messages是一个抽象类,它实现接口Part,并定义了一些属性。
Message可以从Folder取得或由MimeMessage创建。
在Folder中的Message有一组flags来表明它在Folder中的状态。
属性
protectedbooleanexpunged
Trueifthismessagehasbeenexpunged.
True表示message已经被除去。
protectedFolderfolder
Thecontainingfolder,ifthismessageisobtainedfromafolder
若message由folder取得,则表示对应的folder。
protectedintmsgnum
Thenumberofthismessagewithinitsfolder,orzeroifthemessagewasnotretrievedfromafolder.
表示message在folder中的位置,0表示message不在folder中。
在文件中第一个邮件为1,依次递增。
protectedSessionsession
TheSessionobjectforthisMessage
操作msgnum属性的方法
对应邮件中的Form:
intgetMessageNumber()
voidsetMessageNumber(intmsgnum)
B.2、javax.mail.internet.MimeMessage
这个类描述了一个MIME类型的emailmessage,它实现了MimePart接口。
客户想要创建一个MIME类型的message,必须先创建一个空的MimeMessage对象,再填充属性和容器。
protectedbyte[]content
BytearraythatholdsthebytesofthisMessage'
scontent.
message的容器,存储邮件正文和附件。
protectedInputStreamcontentStream
IfthedataforthismessagewassuppliedbyanInputStreamthatimplementstheSharedInputStreaminterface,contentStreamisanothersuchstreamrepresentingthecontentofthismessage.
protectedDataHandlerdh
TheDataHandlerobjectrepresentingthisMessage'
protectedFlagsflags
TheFlagsforthismessage.
邮件的标记信息,如:
被看过或被删除等。
protectedInternetHeadersheaders
TheInternetHeadersobjectthatstorestheheaderofthismessage.
存储message的head部分。
protectedbooleanmodified
Aflagindicatingwhetherthemessagehasbeenmodified.
protectedbooleansaved
DoesthesaveChangesmethodneedtobecalledonthismessage?
1.Content-Type
对应邮件头中的Content-Type:
StringgetContentType()
2.Content-ID
对应邮件头中的Content-ID:
StringgetContentID()
Returnsthevalueofthe"
Content-ID"
headerfield.
voidsetContentID(Stringcid)
Setthe"
headerfieldofthisMessage.
操作Content-ID属性的方法
3.Content-MD5
对应邮件头中的Content-MD5:
StringgetContentMD5()
voidsetContentMD5(Stringmd5)
4.Content-Language
对应邮件头中的Content-Language:
String[]getContentLanguage()
voidsetContentLanguage(String[]languages)
5.Content-Description
对应邮件头中的Content-Description:
StringgetDescription()
Returnsthe"
Content-Description"
voidsetDescription(Stringdescription)
headerfieldforthisMessage.
voidsetDescription(Stringdescription,Stringcharset)
6.Content-Disposition
对应邮件头中的Content-Disposition:
StringgetDisposition()
voidsetDisposition(Stringdisposition)
7.Content-Transfer-Encoding
对应邮件头中的Content-Transfer-Encoding:
StringgetEncoding()
8.Date
对应邮件头中的Date:
voidsetSentDate(Dated)
SettheRFC822"
Date"
DategetSentDate()
ReturnsthevalueoftheRFC822"
field.
操作Date属性的方法
9.Form
对应邮件头中的Form:
voidaddFrom(Address[]addresses)
Addthespecifiedaddressestotheexisting"
From"
Address[]getFrom()
headerfields.
voidsetFrom()
headerfieldusingthevalueoftheInternetAddress.getLocalAddressmethod.
voidsetFrom(Addressaddress)
操作Form属性的方法
10.Sender
对应邮件中的Sender:
voidsetSender(Addressaddress)
Sender"
AddressgetSender()
操作Sender属性的方法
From和Sender
合法的信件头部必须包括"
From:
"
行
合法的信件头部也许会包括"
Sender:
如果信件即包括"
又包括"
,那么"
是发送者
如果信件包括"
但不包括"
里面的第一个地址是发送者
如果信件不包括"
,那么这封信肯定不可能是DomainKey签名过的(包括有"
而无"
的情况)
11.Reply-To
对应邮件中的Reply-To:
voidsetReplyTo(Addressaddress)
AddressgetReplyTo()
操作Reply-To属性的方法
对应邮件中的To:
CC:
BCC:
voidaddRecipients(Message.RecipientTypetype,Address[]addresses)
Addthegivenaddressestothespecifiedrecipienttype.
voidaddRecipients(Message.RecipientTypetype,Stringaddresses)
Address[]getAllRecipients()
Getalltherecipientaddressesforthemessage.
Address[]getRecipients(Message.RecipientTypetype)
Returnstherecepientsspecifiedbythetype.
操作收件人属性的方法
13.Subject
对应邮件头中的Subject:
voidsetSubject(Stringsubject)
Subject"
voidsetSubject(Stringsubject,Stringcharset)
StringgetSubject()
Returnsthevalueofthe"
操作Subject属性的方法
编码规则
ncoded-word="
=?
charset"
encoding"
encoded-text"
="
charset:
字符编码
encoding:
Q---QuotePrintable
B---BASE64
U---UUENCODE
例1:
=?
GB2312?
Q?
=C4=E3=BA=C3?
=
例2:
utf-7?
B?
WFgrWUNkU0swNE9kbjVPRVZiKy0z?
14.Message-ID
对应邮件头中的Message-ID:
SMTP服务器加的唯一的ID号。
可用这个号码作为邮件的编号。
StringgetMessageID()
Message-ID"
取得Message-ID属性的方法
15.操作Head的方法
String[]getHeader(Stringname)
Getalltheheadersforthisheader_name.
获取指定名称的所有header。
请注意,某些标题如果它们包含非US-ASCII字符则可能被编码为RFC2047,这些应该被解码。
StringgetHeader(Stringname,Stringdelimiter)
Getalltheheadersforthisheadername,returnedasasingleString,withheadersseparatedbythedelimiter.
返回一个由指定delimiter分隔的单一字符串。
若delimiter是null,则只有第一个header被返回。
EnumerationgetAllHeaderLines()
GetallheaderlinesasanEnumerationofStrings.
EnumerationgetAllHeaders()
ReturnalltheheadersfromthisMessageasanenumerationofHeaderobjects.
EnumerationgetMatchingHeaderLines(String[]names)
GetmatchingheaderlinesasanEnumerationofStrings.
EnumerationgetMatchingHeaders(String[]names)
ReturnmatchingheadersfromthisMessageasanEnumerationofHeaderobjects.
EnumerationgetNonMatchingHeaderLines(String[]names)
Getnon-matchingheaderlinesasanEnumerationofStrings.
EnumerationgetNonMatchingHeaders(String[]names)
Returnnon-matchingheadersfromthisMessageasanEnumerati