用java编写邮件发送模块,有很多实现方法,最基本的就是用socket,j
实现的原理比较简单,首先建立和邮件服务器的Socket连接,然后与
服务器
进行Handshake,接着发送smtp指令,并封装邮件体,发送。Internet上和许多java书中都有此类例子。
但这种方式实现起来比较麻烦,并且会导致类似如下这种令人反胃的代码:
幸好java也同时提供了更好的实现方式,使用javamail可以很容易的实现邮件发送,同时还能提供SMTP验证等功能。
JavaMail处理电子邮件非常容易。下面列出了需要的类:
1.Properties
JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机。
2.Session
Session类代表JavaMail 中的一个邮件session。每一个基于 JavaMail的应用程序至少有一个session,但是可以有任意多的session。在本场景中, Session对象需要知道用来处理邮件的SMTP 服务器。为了做到这一点,可以用用Properties来创建一个Session对象
3.Transport
JavaMail既可以发送邮件也可以接收邮件。JavaMail使用了两个不同的类来完成这两个功能:Transport 和 Store。Transport 是用来发送邮件的,Store用来接收。对于本场景只需要用到Transport对象。Store的用法请参看Javadoc中JavaMail部分。
用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将节省很多时间。因为JavaMail已经内置了很多协议的实现方法。
使用Transport发送邮件之后需要调用close()方法关闭连接。
注意: JavaMail并不是绝对支持每一个协议,目前仅支持IMAP、 SMTP和 POP3。
4.Message
Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
完整的程序代码如下,已在jdk1.5.0_11上编译并执行通过,使用的邮件系统为Postfix+sasl,(也可使用其他邮件系统,使用163.com测试通过),相关问题可查阅稍后的邮件配置专题。
另外,JavaMail会传回服务器的连接状态和消息,所以这段小程序也可以用来在搭建邮件服务器的过程中进行测试,非常方便。
最后说明一点,有些比较流氓的邮件服务器(比如sina,不知道现在好了没有)是不支持标准smtp的,就不用再试了。
但这种方式实现起来比较麻烦,并且会导致类似如下这种令人反胃的代码:
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);
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();
}
}
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的,就不用再试了。