第3课时 关于邮件的理论以及通过cmd telnet到服务器发送和接受邮件(这一课时很重要)
其实邮件服务器就类似于邮局,发送方发到自己选择的邮件服务器,然后邮件服务器发送到目标服务器,目标服务器接收邮件,然后目标去目标服务器接受邮件。这这个过程中必须注意,除了用户取邮件用的是POP3协议,发送邮件到自己选择的服务器和自己这边的服务器转邮件到目标服务器之间用到的协议都是SMTP协议。只有用户主动去取邮件的时候才是POP3协议。
每个邮箱就相当于我们取信的和发信的邮局提供的邮件箱一样。我们的每个申请的邮箱账号,其实就是一个邮件箱,在邮件服务器上建立了一个账号和空间,邮件会放着这个服务器给我们开的账户的空间里。
邮件服务器按通讯协议分为两种类型
SMTP服务器
POP3/IMAP服务器
发送邮件或者是将邮件转发给另外一个邮件服务器就是用SMTP协议。
如果用户去取邮件,使用的协议就是POP3协议
Smtp服务器端口号是:25
Pop3服务器端口号是:110
Smtp服务器登陆,首先需要先使用base64格式编码用户名和密码,然后登陆服务器时输入编码后的用户名与密码给服务器验证才会通过,而pop3服务器登陆是不需要使用base64编码的,直接输入原来的用户名和密码。
Telnet mail.sina:25
第四课时 发送邮件的原理(相当重要)
一定要注意,其实在cmd中和smtp服务器交流的时候,邮件和服务器之间的关系。
在写邮件之前,需要先定义mail from<>和rcpt to<>,这个是专门和服务器打交道,由服务器识别的。而在写邮件的时候,邮件分两部分,一个是邮件头,一个是邮件内容(从‘data’表示内容开始,data之后是全部的内容,以一个‘.’ 表示邮件内容结束),内容部分的头部分又需
要再写一个from:<>,这里面写邮件的发件人,可以是开始的mail from也可以是另外一个邮箱名字。这个邮件头,服务器是不检查的,是给邮件阅读程序看的,所以发出去之后,在客户端邮件阅读程序(outlook)中我们看到的发件人实际上是邮件头上面写的发件人,而不是登陆邮箱的发件人的邮箱。一定要注意这点。所以有的邮件中看到发件人的名字是unknown,就是因为邮件头中没有输入发件人的名字。内容需要写from, to ,subject, date, 然后才是正式的正文
其实就相当于我们自己写了一封信,但是信上面的发信人不是写自己的名字,而是别人的名字,冒充别人,收件人是没办法区分发件人的真实身份的。
如果是普通的客户端访问smtp服务器是需要用户名和密码的,而针对各个smtp服务器之间,是不需要用户名和密码的,否则的话,smtp服务器是不可能知道那么多smtp服务器用户名和密码的。
实际上sina或者是其他邮件服务器提供商(smtp server)都是分为两块的,也就是有两种服务器,
一种是专门给普通用户访问的邮件服务器,
一种是给其他邮件服务器供应商访问的邮件服务器。
如果是普通用户访问的邮件服务器,那么用户访问的时候就需要提供用户名和密码,而其他邮件服务器供应商访问的专门的邮件服务器,是不需要用户名密码的。直接访问。服务器提供商会将专门给其他邮件服务器供应商访问的邮件服务器加入到DNS中,这样当系统查到这个访问的地址来自于DNS的其他邮件服务器,就会认为对方是邮件服务器,允许它不需要服务器密码直接访问这个邮件服务器。而专给个人客户访问的邮件服务器则是不能够加入DNS的,否则其他邮件服务器访问sina时,有可能到的是这个专用个人访问邮件服务器,那么就会需要其他邮件服务器输入用户密码,导致其他邮件服务器无法登陆,邮件服务器之间无法互相转发邮件。
由于垃圾邮件泛滥,所以,现在网站提供的smtp服务器都要求提供身份验证,这就要求你在客户端软件(outlook)中的账户配置的服务器选项中,发送邮件服务器栏目中选中我的服务器要求身份验证,这样,服务器验证了身份才会和帮用户发送邮件。
第5课时 解释JavaMail包
JavaMail API按功能分为以下三大类
1. 创建和解析邮件内容的API:Message类是创建和解析邮件的核心API, 它的实力对象代表一封。
2. 发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件发送对象,例如SMTP协议
3. 接收邮件的API: Store类是接收邮件核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议
Session类:是用于定义整个应用环境信息的,以及收集客户端与邮件服务器建立网络连接的会话信息。如邮件服务器的主机名,端口号,采用的邮件发送和接收协议等。
其实JavaMail是分为两部分,一部分是接口包,一部分是实现类包。Mailapi.jar其实就是一个接口包,里面是没有实现的,只有在使用的时候,就需要实现包了,这些就是smtp.jar, pop3.jar等
生成邮件的过程中,还使用了一个第三方包,,也就是JAF(JavaBeans Activation Framework. JavaBean激活框架)是一个专用的数据处理框架,用于封装数据,并为应用程序
提供访问的和操作数据的接口。Javamail.jar使用了JAF.不过,如果使用的是jdk6,就不需要导入jaf.jar了,因为jdk6中包括了jaf的jar包。
第六课时 发送邮件的最简单的代码和理论
Transport和Store都是Service的子类
Service有一个代码connect API,就是连接远程服务器的。
public void connect(java.lang.String host,
int port,
java.lang.String user,
java.lang.String password)
Transport先连接connect(… ),然后发送send(msg, new Address[]{new InternetAddress(“收件人地址”)}),最后关闭close。
记住服务器一般都需要论证auth,这个属性在标准的javamail spec中是没有的。但是在它的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可以通过一次transport connect之后,连续发多个message,再关闭,这样减少了连接的时间。目前从sina发送到163是有问题的,这不是代码问题,而是服务器问题。从sina发到sina没有问题。
java64位// sessionProps.put("mail.smtp.host", "smtp.sina");
// sessionProps.put("mail.host", "localhost");
// sessionProps.put("mail.store.protocol", "pop3");
sessionProps.put("ansport.protocol", "smtp");
// sessionProps.put("mail.user", "silencehill_wu");
// sessionProps.put("mail.password", "wugang");
// sessionProps.put("mail.debug", "true");
sessionProps.put("mail.smtp.auth", "true");
Transport transport = Transport();
t("smtp.sina",25,"silencehill_wu", "wugang");
Message message = new MimeMessage(session);
message.setText("tttttttttt");
message.setFrom(addr1);
message.setSubject("just test ");
Address[] addrs = new Address[]{addr2};
try{
// Transport.send(message,addrs);
transport.sendMessage(message,addrs);
}catch(Exception ex){
ex.printStackTrace();
return;
}
transport.close();
第7课时
可以发现代码中很方便,可以在多个地方设置相同的配置,只要可以通过,就都可以使用。
比如创建message的时候需要收件人地址,不过这个只是一个地址,而transport.sendMessage(message,addrs);的时候,这里的addrs是一个地址数组,可以放入多个收件人。所以,发送给多个的时候,就不要在创建message的时候发送,而是在sendMessage的时候写入。
getInstance每次都会返回一个新的session对象,和上一个不同。
而getDefaultInstance如果没有,则创建一个新的,否则返回的是已经存在的session对象,不会创建新的。但是这个default的似乎有一个问题,就是如果使用这个方法发送之后,接着收就会出问题,也就是说同一个session不能发了再接着收,原因具体不明。
如果是在服务器上运行,sessionProps.put("mail.smtp.auth", "true");是不需要加的,因为服务器通过DSN来确认服务器,是不需要认证的,只有客户端(outlook等)才需要论证。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论