张孝祥Java邮件开发详解Word文档格式.docx
- 文档编号:19826124
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:17
- 大小:441.36KB
张孝祥Java邮件开发详解Word文档格式.docx
《张孝祥Java邮件开发详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《张孝祥Java邮件开发详解Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
内容需要写from,to,subject,date,然后才是正式的正文
其实就相当于我们自己写了一封信,但是信上面的发信人不是写自己的名字,而是别人的名字,冒充别人,收件人是没办法区分发件人的真实身份的。
如果是普通的客户端访问smtp服务器是需要用户名和密码的,而针对各个smtp服务器之间,是不需要用户名和密码的,否则的话,smtp服务器是不可能知道那么多smtp服务器用户名和密码的。
实际上sina或者是其他邮件服务器提供商(smtpserver)都是分为两块的,也就是有两种服务器,
一种是专门给普通用户访问的邮件服务器,
一种是给其他邮件服务器供应商访问的邮件服务器。
如果是普通用户访问的邮件服务器,那么用户访问的时候就需要提供用户名和密码,而其他邮件服务器供应商访问的专门的邮件服务器,是不需要用户名密码的。
直接访问。
服务器提供商会将专门给其他邮件服务器供应商访问的邮件服务器加入到DNS中,这样当系统查到这个访问的地址来自于DNS的其他邮件服务器,就会认为对方是邮件服务器,允许它不需要服务器密码直接访问这个邮件服务器。
而专给个人客户访问的邮件服务器则是不能够加入DNS的,否则其他邮件服务器访问时,有可能找到的是这个专用个人访问邮件服务器,那么就会需要其他邮件服务器输入用户密码,导致其他邮件服务器无法登陆,邮件服务器之间无法互相转发邮件。
由于垃圾邮件泛滥,所以,现在网站提供的smtp服务器都要求提供身份验证,这就要求你在客户端软件(outlook)中的账户配置的服务器选项中,发送邮件服务器栏目中选中我的服务器要求身份验证,这样,服务器验证了身份才会和帮用户发送邮件。
第5课时解释JavaMail包
JavaMailAPI按功能分为以下三大类
1.创建和解析邮件内容的API:
Message类是创建和解析邮件的核心API,它的实力对象代表一封电子邮件。
2.发送邮件的API:
Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件发送对象,例如SMTP协议
3.接收邮件的API:
Store类是接收邮件核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议
Session类:
是用于定义整个应用环境信息的,以及收集客户端与邮件服务器建立网络连接的会话信息。
如邮件服务器的主机名,端口号,采用的邮件发送和接收协议等。
其实JavaMail是分为两部分,一部分是接口包,一部分是实现类包。
Mailapi.jar其实就是一个接口包,里面是没有实现的,只有在使用的时候,就需要实现包了,这些就是smtp.jar,pop3.jar等
生成邮件的过程中,还使用了一个第三方包,,也就是JAF(JavaBeansActivationFramework.JavaBean激活框架)是一个专用的数据处理框架,用于封装数据,并为应用程序提供访问的和操作数据的接口。
Javamail.jar使用了JAF.不过,如果使用的是jdk6,就不需要导入jaf.jar了,因为jdk6中包括了jaf的jar包。
第六课时发送邮件的最简单的代码和理论
Transport和Store都是Service的子类
Service有一个代码connectAPI,就是连接远程服务器的。
publicvoidconnect(java.lang.String
host,
int
port,
java.lang.String
user,
password)
Transport先连接connect(…),然后发送send(msg,newAddress[]{newInternetAddress(“收件人地址”)}),最后关闭close。
记住服务器一般都需要论证auth,这个属性在标准的javamailspec中是没有的。
但是在它的doc中,可以查看com.sun.mail.smtp的定义,里面定义了sun公司对于邮件发送需要定义的属性进行了定义,这是sun对mail.api的实现。
其他公司也可以改。
所以,它是com.sun.打头的,不是标准。
这个很重要。
如果需要打印信息,则使用以下
session.setDebug(true);
注意transport中有两个方法,一个是send,一个是sendMessage,不要用send,因为它是一个static方法,而sendMessage才是一般的transport实例发送message的,它是在connect之后再发送,然后关闭的。
而send方法,是不需要使用connect的,因为它会内部调用connect的,所以,send和sendMessage之间的区别是一个send每次发送都会重新connect一次服务器,而sendMessage可以通过一次transportconnect之后,连续发多个message,再关闭,这样减少了连接的时间。
目前从sina发送到163是有问题的,这不是代码问题,而是服务器问题。
从sina发到sina没有问题。
//sessionProps.put("
mail.smtp.host"
"
"
);
mail.host"
localhost"
mail.store.protocol"
pop3"
sessionProps.put("
mail.transport.protocol"
smtp"
mail.user"
silencehill_wu"
mail.password"
wugang"
mail.debug"
true"
mail.smtp.auth"
Transporttransport=session.getTransport();
transport.connect("
25,"
Messagemessage=newMimeMessage(session);
message.setText("
tttttttttt"
message.setFrom(addr1);
message.setSubject("
justtest"
Address[]addrs=newAddress[]{addr2};
try{
//Transport.send(message,addrs);
transport.sendMessage(message,addrs);
}catch(Exceptionex){
ex.printStackTrace();
return;
}
transport.close();
第7课时
可以发现代码中很方便,可以在多个地方设置相同的配置,只要可以通过,就都可以使用。
比如创建message的时候需要收件人地址,不过这个只是一个地址,而transport.sendMessage(message,addrs);
的时候,这里的addrs是一个地址数组,可以放入多个收件人。
所以,发送给多个的时候,就不要在创建message的时候发送,而是在sendMessage的时候写入。
getInstance每次都会返回一个新的session对象,和上一个不同。
而getDefaultInstance如果没有,则创建一个新的,否则返回的是已经存在的session对象,不会创建新的。
但是这个default的似乎有一个问题,就是如果使用这个方法发送之后,接着收就会出问题,也就是说同一个session不能发了再接着收,原因具体不明。
如果是在服务器上运行,sessionProps.put("
是不需要加的,因为服务器通过DSN来确认服务器,是不需要认证的,只有客户端(outlook等)才需要论证。
使用Transport类发送邮件的方法,一个过程只能发送一次邮件。
由于是Transport静态APIsend内部包含了connect,send和closesession的功能,所以,connect中的连接信息就需要分离出来。
添加以下代码
//指定mail服务器地址
//下面使用了Authenticator来传入连接服务器的用户名和密码
Sessionsession=Session.getInstance(sessionProps,
newAuthenticator(){
@Override
protectedPasswordAuthenticationgetPasswordAuthentication(){
returnnewPasswordAuthentication("
"
}
}
);
//下面加入了多个收件人地址,使用InternetAddress.parse解析多个地址成为收件人数组。
message.setRecipients(RecipientType.TO,InternetAddress.parse("
silencehill_wu@,wugang00001@,silencehill_wu@"
));
//不用setText,改用setContent,可以设置不同邮件不同的显示格式的内容
message.setContent("
spanstyle='
color:
red'
你好吗,哈哈!
/span>
text/html;
charset=GBK"
第8课时邮件的基本格式与编码
对于邮件中的非英文字符,我们往往需要特别的格式来发送邮件。
当然和我们的字符编码是不一样的。
现在常用的两种编码方式,一种是base64和quote-printable。
对于被发送的内容,必须保证所有的字符都被编码成一种网络可以识别的特殊格式,这样才都可以被网络传输,以免部分发送内容中的部分二进制或者特殊符号被网络过滤掉。
这些编码格式可以通过看邮件的属性,或者通过editplus的编辑就可以看到了。
比如
------=_Part_374982_25774252.1288351532984
Content-Type:
text/html;
charset=gbk
Content-Transfer-Encoding:
quoted-printable
!
DOCTYPEhtmlPUBLIC"
-//W3C//DTDXHTML1.0Transitional//EN"
"
http:
//www.=
w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
htmlxmlns=3D"
//www.w3.org/1999/xhtml"
head>
metahttp-equiv=3D"
Content-Type"
content=3D"
charset=3DGBK"
/>
title>
=C4=FA=D4=DA=B0=D9=BA=CF=D3=D0=D0=C2=CF=FB=CF=A2=C0=B2!
/title>
styletype=3D"
text/css"
如果要看base64的,只需要写一封邮件,在收件人中写入中文silencehill_wu@,然后主题写haha,content邮件内容中写中文信息,然后设置编码为纯文版,保存成eml文件,用editplus编辑。
就会看到
From:
johnwu"
<
silencehill_wu@>
To:
=?
gb2312?
B?
1tDOxCA8c2lsZW5jZWhpbGxfd3VAMTYzLmNvbT4=?
=
Subject:
haha
Date:
Tue,2Nov201000:
02:
22+0800
MIME-Version:
1.0
text/plain;
charset="
gb2312"
base64
X-Priority:
3
X-MSMail-Priority:
Normal
X-Unsent:
1
X-MimeOLE:
ProducedByMicrosoftMimeOLEV6.00.2900.5931
1tDOxNDFz6I=
其中的1tDOxNDFz6I=其实就是中文信息经过base64的传输编码处理之后的字符。
其实google搜索的时候,输入中文,点击搜索,也是用的编码方式也就是URL编码。
比如搜索中文两个字。
.hk/search?
hl=zh-CN&
source=hp&
biw=1588&
bih=818&
q=%E4%B8%AD%E6%96%87&
aq=f&
aqi=&
aql=&
oq=&
gs_rfai=
%E4%B8%AD%E6%96%87就是中文编码之后的样子。
可以在UltrEdit中,先输入中文,然后将Ascii改成utf-8,就会出现我们看到的二进制数据,可以发现‘%’被去掉了。
所以%E4其实就是3个字节,一个字符一个字节,所以24个bit。
现在继续谈邮件的编码方式,因为有的邮件需要发送特殊的数据要转化成英文字符。
比如说中文。
或者某些不可以被传送的字符。
邮件中可以设置编码方式,在邮件option(选项)的发送tab中,邮件发送格式中先选中纯文本,然后点击”纯文本设置….”,里面会有一个列表选择编码方式,一个是base64,一个是可打印项目(quoted-printable),改了这个,就会保存成我们需要的邮件编码。
Eml中的文字也会变成相应的编码格式字符。
详细介绍编码。
Base64编码:
比如下面3个字节[0110,0001][0110,0010][0110,0011]如果想要编码怎么编?
我们选了64个英文字符,是可以用6位bit来表示,也就是2的6次方(111111),刚好可以完全表示特定的64位字符(abcd....zABCD…Z)如果字符是35,就是对应的第35的字符是什么。
这样可以将上面的3个字节拆分成4*6个字符的编码,这样3个字符就变成4个英文字符。
扩大了三分之四倍。
quoted-printable编码:
只对非ASCII字符的数据进行编码。
如果是英文符号,我们不编码。
每个非ASCII字符的自己数据,都被转化成’=’后跟着个自己的十六进制数据,比如说
‘ab中国’的quoted-printable编码就是ab=d6=d0=b9=fa这样ab没有变,而中国就从4个字节变成12个字节,扩大了3倍。
(中就是d6d0,国就是b9fa),如果主要是英文,很少中文,就可以用quoted-printable编码,如果很多中文,就用base64编码
第九课时
如果需要发送附件,首先需要在邮件option(选项)的发送tab中,邮件发送格式中选‘HTML’,这样才可以发送图片,超链接,附件等等。
其实即使放了附件和图片,实际上只是一个文件而已,类似于压缩文件一样,通过一定编码而成。
创建一个正常的邮件,里面放了正文,图片还有一个附件,然后保存。
用ultraedit看里面的内容。
可以看到它分为几个部分。
格式大致如下
1tDOxA==?
Tue,2Nov201023:
01:
33+0800
multipart/mixed;
boundary="
----=_NextPart_000_001F_01CB7AE1.E7A45D10"
Thisisamulti-partmessageinMIMEformat.
------=_NextPart_000_001F_01CB7AE1.E7A45D10
multipart/related;
type="
multipart/alternative"
;
----=_NextPart_001_0020_01CB7AE1.E7A45D10"
------=_NextPart_001_0020_01CB7AE1.E7A45D10
multipart/alternative;
----=_NextPart_002_0021_01CB7AE1.E7A45D10"
------=_NextPart_002_0021_01CB7AE1.E7A45D10
YWFhYmJiY2NjZGRk
PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdi
MjMxMiIgaHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250
ZW50PSJNU0hUTUwgOC4wMC42MDAxLjE4OTc1Ij4NCjxTVFlMRT48L1NUWUxFPg0KPC9IRUFEPg0K
PEJPRFkgYmdDb2xvcj0jZjRmNGY0Pg0KPERJVj48Rk9OVCBzaXplPTI+YWFhYmJiY2NjZGRkPElN
RyBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgYWxpZ249YmFzZWxpbmUgDQpzcmM9ImNpZDo3N0Mw
QzQ3QkZERDc0MEU5QjYyNDdBRTFENzVBRjc0NUA1OGZhYWQ0OTZmNzE0ODYiPjwvRk9OVD48L0RJ
Vj48L0JPRFk+PC9IVE1MPg0K
------=_NextPart_002_0021_01CB7AE1.E7A45D10--
image/jpeg;
name="
=?
1tbK9y5KUEc=?
="
Content-ID:
77C0C47BFDD740E9B6247AE1D75AF745@58faad496f71486>
”
可以发现首先是multipart/mixed表示多格式组成,而里面又分为多个部分,每个部分是由boundary来设置,表示块分割,其中最后用—表示一块的结束。
如果一块之中包含了其他的part,说明是嵌入其中的更小的块。
第11课时填充和完善创建复杂邮件的细节代码
在创建MimeMultipart的时候,构造函数是一个String,指定的是subType,也就是说是multipart/mix中的mix这一部分,因为multipart是主类型。
所以,subType就是只mixed
不论是附件还是内容,首先都是MimeBodyPart,在建立这些之前,先要给这个邮件建立一个MimeMultipart,它代表了整个MimeMessage的内部,包括附件和内容。
所以首先建立MimeMultipart,然后用它加入两个部分一个是attach部分,一个是内容,都是MimeBodyPart。
但是,实际上当内容中有一个是图片的时候,则需要在MimeB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 张孝祥 Java 邮件 开发 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)