用Javamail编写邮件发送代码

        用java编写邮件发送模块,有很多实现方法,最基本的就是用socket,j 实现的原理比较简单,首先建立和邮件服务器的Socket连接,然后与 服务器 进行Handshake,接着发送smtp指令,并封装邮件体,发送。Internet上和许多java书中都有此类例子。

       但这种方式实现起来比较麻烦,并且会导致类似如下这种令人反胃的代码:

sendRequest( " MAIL FROM:< "   +  from  +   " > "   +  LINEFEED);
readResponse(
" 250 " );
sendRequest(
" DATA "   +  LINEFEED);
readResponse(
" 354 " );
StringBuffer s1 
=   new  StringBuffer( " From: < "   +  from  +   " > "   +  LINEFEED);
s1.append(
" To: < "   +  to  +   " > "   +  LINEFEED);
s1.append(
" Subject:  "   +  subject  +  LINEFEED);
s1.append(
" Date:  "   +   new  java.util.Date().toLocaleString()  +  LINEFEED);
s1.append(
" Content-Type: text/plain;charset="GB2312" "   +  LINEFEED);
s1.append(LINEFEED);
s1.append(content);
s1.append(LINEFEED 
+   " . "   +  LINEFEED);

   幸好java也同时提供了更好的实现方式,使用javamail可以很容易的实现邮件发送,同时还能提供SMTP验证等功能。

  JavaMail处理电子邮件非常容易。下面列出了需要的类:

  1.Properties

  JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机。

  2.Session

   Session类代表JavaMail 中的一个邮件session。每一个基于 JavaMail的应用程序至少有一个session,但是可以有任意多的session。在本场景中, Session对象需要知道用来处理邮件的SMTP 服务器。为了做到这一点,可以用用Properties来创建一个Session对象
       
Session session  =  Session.getDefaultInstance(properties)

  3.Transport

   JavaMail既可以发送邮件也可以接收邮件。JavaMail使用了两个不同的类来完成这两个功能:Transport 和 Store。Transport 是用来发送邮件的,Store用来接收。对于本场景只需要用到Transport对象。Store的用法请参看Javadoc中JavaMail部分。
Transport transport  =  session.getTransport( " smtp " )

  用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将节省很多时间。因为JavaMail已经内置了很多协议的实现方法。

       使用Transport发送邮件之后需要调用close()方法关闭连接。

  注意: JavaMail并不是绝对支持每一个协议,目前仅支持IMAP、 SMTP和 POP3。

  4.Message

  Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
Message newMessage  =   new  MimeMessage(session)

        完整的程序代码如下,已在jdk1.5.0_11上编译并执行通过,使用的邮件系统为Postfix+sasl,(也可使用其他邮件系统,使用163.com测试通过),相关问题可查阅稍后的邮件配置专题。

import  javax.mail. * ;
import  javax.mail.internet. * ;
import  java.text.Format;
import  java.text.SimpleDateFormat;
import  java.util. * ;

public   class  sendmail ... {
    
public static void main(String args[]) throws Exception ...{
        
//如果您想执行一下看看效果,非常欢迎,不过建议先把email地址改掉,不要发给在下…
        send("Xliutong","albert.csdn@gmail.com","testmail","testcontent");
    }


    
public static void send (String sender, String receiver, String title, String content) 
                                
throws AddressException, MessagingException{

        String host 
= "59.64.111.111"
        
//考虑到DNS服务瘫痪的情况,此处使用SMTP主机的IP地址(我这里DNS经常瘫痪…)
        String from = "master@tseg.org";
        String to 
= receiver;
        String username 
= "master";
        String password 
= "xxxxxx";
        String subject;
        String main;
        
//获取时间
        Format format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now 
= new Date();
        
        subject 
= sender + "" + title;
        main 
= "This message is sent by system, please don't reply. " +
                
"===================================================== " +
                content 
+ " " +
                
"通信软件工程中心 " +
                
"Telecommunications Software Engineering Group, BUPT " +
                format.format(now);

        
// Get system properties
        Properties props = new Properties();

        
// Setup mail server
        props.put("mail.smtp.host", host);

        
//如果发送邮件的主机不在邮件服务器DNS配置中反解出的域之内,并且
        
//目标地址域名(gmail.com)与服务器(tseg.org)不同,则必须要经过
        
//SMTP验证才允许发送邮件。具体情形与邮件服务器设置有关。

        props.put(
"mail.smtp.auth""true"); // 打开SMTP验证属性

        
// Get session
        Session session = Session.getDefaultInstance(props);

        
// watch the mail commands go by to the mail server
        session.setDebug(true);

        
// Define message
        MimeMessage message = new MimeMessage(session);
        message.setFrom(
new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO, 
new InternetAddress(to));
        message.setSubject(subject);
        message.setText(main);

        
// Send message
        message.saveChanges();
        Transport transport 
= session.getTransport("smtp");
        transport.connect(host, username, password);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }

}


       另外,JavaMail会传回服务器的连接状态和消息,所以这段小程序也可以用来在搭建邮件服务器的过程中进行测试,非常方便。

       最后说明一点,有些比较流氓的邮件服务器(比如sina,不知道现在好了没有)是不支持标准smtp的,就不用再试了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值