JavaMail 的基础知识
使用JavaMail 是发送电子邮件所需要的组件。
JavaMail 的机构使处理电子邮件非常容易。下面列出了一些我们需要的类:
1.Properties
JavaMail 需要Properties 来创建一个session 对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机,如:
Properties props = new Properties ();
props.put("mail.smtp.host", "smtp.abcd.com");//可以换上你的smtp 主机名。
2.Session
这个Session 类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail 的应用程序至少有一个session但是可以有任意多的session。在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器。为了做到这一点,你可以参照下面的例子用Properties 来创建一个Session 对象
Session sendMailSession;
sendMailSession = Session.getInstance(props, null);
3.Transport
邮件是既可以被发送也可以被受到。JavaMail 使用了两个不同的类来完成这两个功能:
Transport 和 Store。 Transport是用来发送信息的,而Store 用来收信。对于这的教程我们只需要用到Transport 对象。Store 的用法请参看Sun的JavaMail文档。
用法:Transport transport;
transport = sendMailSession.getTransport("smtp");
用JavaMail Session 对象的getTransport方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如”smtp”。这将为我们省了很多时间。因为JavaMail 以境内置了很多协议的实现方法。
注意: JavaMail 并不是绝对支持每一个协议,目前支持IMAP、 SMTP 和 POP3。
4.Message
Message 对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
使用方法是:Message newMessage = new MimeMessage(sendMailSession);
我的程序实现的功能主要有,除(1)可以正常发送文字消息外,(2)还可发送附件,(3)现在大多数邮件服务器都要求登陆者行身份验证,因此本程序已需要此项功能。(4)另外,为了方便用户使用,要求smtp 服务器只需要第一次进行配置,以后使用从配置文件直接读取。
编写程序代码
下面就是实现以上功能的代码
代码如下 | 复制代码 |
//MIME 邮件对象 MimeMessage mimeMsg = null; //邮件会话对象 Session session = null; Properties props = System.getProperties(); //获得系统属性 props.put("mail.smtp.host", mailhost); //设置SMTP 主机 //获得邮件会话对象 session = Session.getDefaultInstance(props,null); //创建MIME 邮件对象 mimeMsg = new MimeMessage( session ); //设置发信人 mimeMsg.setFrom(new InternetAddress( from ) ); //设置收信人 if(to!=null){ mimeMsg.setRecipients( Message.RecipientType.TO, InternetAddress.parse( to ) ); } //设置抄送人 if(cc!=null){ mimeMsg.setRecipients( Message.RecipientType.CC, InternetAddress.parse( cc ) ); } //设置暗送人 if(bcc!=null){ mimeMsg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse( bcc )); } //设置邮件主题 mimeMsg.setSubject(subject,"GBK"); //设置邮件内容 mimeMsg.setText( content ,"GBK" ); //发送日期 mimeMsg.setSentDate(new Date()); //发送邮件 Transport.send( mimeMsg ); System.out.println( "email send!"); } catch (Exception e) { e.printStackTrace(); } 以下代码用于发送附件 为了发送附件需要定义文件名String filename把附件作为信件内容的第二部分一起发送。因此对上面的代码稍作改动。 // 第一部分信息 MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText( content, "GBK"); // 第二部分信息 MimeBodyPart mbp2 = new MimeBodyPart(); // 在第二部分信息中附加一个文件 FileDataSource fds = new FileDataSource( fileAttachment ); mbp2.setDataHandler(new DataHandler(fds)); mbp2.setFileName(fds.getName()); } // 创建 Multipart 并放入每个 MimeBodyPart Multipart mp = new MimeMultipart(); mp.addBodyPart( mbp1 ); mp.addBodyPart( mbp2 ); // 增加 Multipart 到信息体 mimeMsg.setContent( mp ); |
目前绝大多数邮件服务器都需要进行身份验证,而用javamail 进行身份验证也很简单。
首先进行身份验证需要新建一个类Email_Autherticatorbean。带身份验证的邮件要用到的这个类,这个类一定要继承 Authenticator 类,并覆盖 getPasswordAuthentication 方法
Email_Autherticatorbean 类的代码如下
代码如下 | 复制代码 |
import javax.mail.*; public class Email_Autherticatorbean extends javax.mail.Authenticator{ private String m_username = null; private String m_userpass = null; public void setUsername(String username){ m_username = username; } public void setUserpass(String userpass){ m_userpass = userpass; } public Email_Autherticatorbean(){ super(); } public Email_Autherticatorbean(String username, String userpass){ super(); setUsername(username); setUserpass(userpass); } //在需要身份验证时自动被调用 public PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(m_username,m_userpass); } } |
在主函数中调用这个类就可验证身份,但是需要对代码 1 做一些改动。
定义用户名与密码变量 String user=null;String password=null;
需要添加设置身份验证的语句
代码如下 | 复制代码 |
props.put("mail.smtp.host", mailhost); //设置SMTP 主机 props.put("mail.smtp.auth","true"); //设置身份验证为真,若须身份验证则必须设为真//获得邮件会话对象 代码 1 中的session = Session.getDefaultInstance(props,null); 改为 session = Session.getDefaultInstance(props, new Email_Autherticatorbean( user, password ) ); |
以上的改动可以完成身份验证功能。
对配置文件的读写
因此要用 java 的io 流,需要java.io 包。当程序启动时从文件中读取信息,没改变一次配置,就把新的设置写入到文件中。
写入数据
代码如下 | 复制代码 |
try { BufferedWriter out = new BufferedWriter( new OutputStreamWriter(new FileOutputStream("conf.txt"))); out.write(strsmtp); out.write("r"); out.write(strusername); out.write("r"); out.write(strpassword); out.close(); }catch(IOException d) {} |
读取数据:把文件中的数据放入数组中
代码如下 | 复制代码 |
try { String[] aa = {"", "", ""}; String s; int i = 0; BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("conf.txt"))); while ( (s = in.readLine()) != null) { aa[i] = s; i++; } } catch (IOException d) {} |
以上代码,可以实现本程序的基本功能。还需要一个图形界面,来方便用户使用。Java 同样提供了,强大的可视化编程的类库,Swing 类和awt 类。而且Jbuilder9 的集成开发环境,有很好的UI设计功能,可以很方便的设计出美观的图形界面。
因此以后要做的就是,把功能模块的代码加在其中就可以了。如把代码 1,加到发送按钮的事件处理函数中,每当按按钮就把信发送出去。
野比大雄的涅槃 最新版v0.8-625
野比大雄的涅槃是一款非常好玩的从端游移植而来的精品哆啦A梦同
汽车模拟器2内置菜单全车解锁版2024 最新版v1.54.2
汽车模拟器2内置涂装版是游戏的破解版本,在该版本中为玩家提供
快递到了亲内置菜单 安卓版v0.6.2
快递到了亲内置菜单是一款非常好玩的模拟经营类手游,内部有功能
我的世界为时已晚模组整合包 手机版v皮神木马
我的世界为时已晚模组整合包是一款剧情向的恐怖游戏像素风格沙盒
纸牌农庄内购版 v1.12.77
纸牌农庄无限道具版是一款将纸牌与模拟经营相结合的游戏,为玩家