Javamail-期待你的更新(网络二班团支部暑假总结)
---------------------------I's a small step, tomorrow a big step
A:杂谈:
暑假安排了第一个java项目,做一个邮件发送软件,制作的软件拖了很久也没发布,虽然做的不尽人意,但总算是我们走出了第一步。
这次不成功的原因可以总结许多的原因:其一,java知识点太多,导致许多知识点不理解;其二,由于暑假期间,大家个忙各的,交流起来不是很方便;其三,也是最重要的分工不明确,许多同学都不知道,或者就根本不没参与讨论。然而,这毕竟是第一次安排,有错误是可以理解的,况且在项目中也有所收获。
期待:
期待大家能将其功能不断完善,现在做的仅仅是一个小小的模型,还有许多功能有待完善,例如:接收邮件,发送图片,网页文件,接收图片文件,网页文件,有精力还可以加上音乐播放器,定时关机功能,不积跬步无以至千里,不积小流无以成江海。今天的一小步,明天一大步。
参考资料:图书馆张孝祥 《java邮件开发详解》
网络视频:张孝祥 《java邮件开发详解》
B:项目分析:
注意两个事项:第一打开你的telnet功能,第二如果要用QQ服务器直接到QQ空间打开smtp功能。其他服务器也一样。
第一种,直接通过DOS命令,放送邮件。
首先,我们可以通过telnet命令(黑客常用命令),telnet常用于远程连接(telnet的详细解释:http://baike.baidu.com/view/44255.htm),格式如下:
Telnet smtp.qq.com 25 这样就可以连接到qq的服务器,但是微软为了安全起见,
Telnet是默认为“未启动”,如果想启动,步骤如下:控制面板--->程序--->程序和功能-->打开或关闭windows功能-->打开找到telnet客户端,把这2项都勾选上,然后确定就可以了.
连接到qq的服务器以后,由于我们的个人PC并没有在网络中作为一个服务器注册,所以我们借用了qq的服务器发送邮件,我们正常连接QQ,需要登录名和密码,同理,这也一样,需要这些,但我们要注意在这操作的过程中,登录名和密码是通过BASE64编码的,登录以后,我们就可以遵寻smtp协议放送消息了(smtp协议详细解释如下:http://baike.baidu.com/view/5450.htm)
连接后如下图:
(我们可以通过此连接到任何一个服务器,同时哈佛的著名服务器clond.cs50.net,我们也可以连接,只是要注意端口不一样,哈佛的是80)
第二步:
当连上以后,你就的放松一个消息给qq服务器了,ehco ouyang-pc ,ehco后面的参数是是任意的,键入命令后,出现如图所示:这都是smtp的一些格式,想要了解可以打开上面smtp介绍的链接,或者到图书馆借阅张孝祥 《java邮件开发详解》.
第三步:
通过键入命令:auth login登录
这此要注意第一个334下面的是登录名,第二个就是密码,这需要你的键入,我键入的是我的qq登录名,与密码注意successful表示已登录成功了。现在你可以发送你的消息了,
发送消息先用mailfrom告诉对方你的邮件地址,其次再rcpt to 告诉服务器发送到哪里,再接着告诉其内容。想要成功发送还要你自己了。(为什么键入的密码不是正确的格式,因为我们这是通过了上面所说的BASE64编码的,java 实现BASE64编码十分简单,代码如下:
我们可以用此方式分别得到登录名,与密码的BASE64编码
/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 华北科技大学计算机学院学生
* All rights reserved.
* 文件名称: javamail
* 作 者: 欧阳松柏
* 完成日期: 2012 年 10 月 08 日
* 版 本 号: 2.0
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述:
* 程序输出:
* 程序头部的注释结束
*/
import java.util.*;
import sun.misc.*;
public class Bianma {
public static void main(String[] args) {
Scanner sca=new Scanner(System.in);
BASE64Encoder encoder=new BASE64Encoder();
String a;
System.out.println("请输入:");
a=sca.next();
System.out.println("编码后:"+encoder.encode(a.getBytes()));
}
}
第二种,原理与第一种一样。
只是这是以代码方式发送邮件的,并且有一个小界面。要理解代码是怎么实现的,请参考张孝祥 《java邮件开发详解》
代码如下:
/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 华北科技大学计算机学院学生
* All rights reserved.
* 文件名称: javamail1
* 作 者: 欧阳松柏
* 完成日期: 2012 年 10 月 07 日
* 版 本 号: 2.0
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述:
* 程序输出:
* 程序头部的注释结束
*/
package ou;
import java.awt.*;
import java.awt.event.*;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import javax.swing.border.*;
import javax.swing.*;
import javax.swing.*;
import java.util.*;
import javax.activation.*;
import java.awt.*;
public class Mail extends JFrame{
JTextField jt1,jt2;
JLabel jla1,jla2;
JPanel jp1,jp2;
PoliceStation police1,police2;
public static void main(String[] args) {
Mail j=new Mail();
}
public Mail()
{
police1=new PoliceStation();
police2=new PoliceStation();
jp1=new JPanel();
jp2=new JPanel();
jla1=new JLabel("发送邮箱");
jla2=new JLabel("接收邮箱");
jt1=new JTextField(10);
jt2=new JTextField(10);
jp1.add(jla1 );
jp1.add(jt1);
jt1.addActionListener(police1);
jp2.add(jla2);
jp2.add(jt2);
jt2.addActionListener(police2);
this.add(jp1,BorderLayout.NORTH);
this.add(jp2);
this.setSize(200,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class PoliceStation implements ActionListener
{
private static final MimeMessage Transport = null;
static String protocol="smtp";
static String from;//发送邮件地址
static String to="接收邮件地址";
// System.out.println(to);
static String subject="邮件发送";
static String body="欧阳松柏,你好吗?";
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
from=e.getActionCommand();
// to=e.getActionCommand();
String server="smtp.qq.com";
String user="791515672";
String pass="************";
//获取系统的Properties
Properties props=new Properties();
//传输协议
props.setProperty("mail.transport.protocol", protocol);
// smtp 服务器都需要用户身份认证,所以这也要设置为 true
props.setProperty("mail.transport.auth", "true");
//先使用 Session 类中静态的 getInstance() 或getDefaultInstance() 获得自身对象,
//此时调用这两个方法应该传入上面创建的 Properties 对象;
Session session =Session.getDefaultInstance(props);
session.setDebug(true);
// 将 Sesson 对象作为参数创建 MimeMessage 对象
MimeMessage message=new MimeMessage(session);
try {
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
message.setSubject(subject);
message.setText(body);
message.saveChanges();
Transport transport = session.getTransport();
// 发送用户名、密码连接到指定的 smtp 服务器
transport.connect(server, user, pass);
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
} catch (AddressException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (MessagingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
发送后:
发送后: