用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的,就不用再试了。
但这种方式实现起来比较麻烦,并且会导致类似如下这种令人反胃的代码:
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的,就不用再试了。
本文介绍如何使用JavaMail发送邮件,包括设置SMTP验证等步骤。提供了一个完整的示例代码,展示了如何利用JavaMail API构建和发送邮件。

4159

被折叠的 条评论
为什么被折叠?



