您的位置:首页 > 编程语言 > Java开发

javamail实例和相关问题解决办法

2009-06-04 12:16 411 查看
import java.util.*;

import java.io.*;

import javax.mail.*;

import javax.mail.internet.*;

import javax.activation.*;

/**

* <p>Title: 使用javamail发送邮件</p>

* <p>Description: 演示如何使用javamail包发送电子邮件。这个实例可发送多附件</p>

* <p>Copyright: Copyright (c) 2003</p>

* <p>Filename: Mail.java</p>

* @version 1.0

*/

public class SendMail {

String to = "";//收件人

String from = "";//发件人

String host = "";//smtp主机

String username = "";

String password = "";

String filename = "";//附件文件名

String subject = "";//邮件主题

String content = "";//邮件正文

Vector file = new Vector();//附件文件集合

/**

*<br>方法说明:默认构造器

*<br>输入参数:

*<br>返回类型:

*/

public SendMail() {

}

/**

*<br>方法说明:构造器,提供直接的参数传入

*<br>输入参数:

*<br>返回类型:

*/

public SendMail(String to, String from, String smtpServer, String username, String password, String subject, String content) {

this.to = to;

this.from = from;

this.host = smtpServer;

this.username = username;

this.password = password;

this.subject = subject;

this.content = content;

}

/**

*<br>方法说明:设置邮件服务器地址

*<br>输入参数:String host 邮件服务器地址名称

*<br>返回类型:

*/

public void setHost(String host) {

this.host = host;

}

/**

*<br>方法说明:设置登录服务器校验密码

*<br>输入参数:

*<br>返回类型:

*/

public void setPassWord(String pwd) {

this.password = pwd;

}

/**

*<br>方法说明:设置登录服务器校验用户

*<br>输入参数:

*<br>返回类型:

*/

public void setUserName(String usn) {

this.username = usn;

}

/**

*<br>方法说明:设置邮件发送目的邮箱

*<br>输入参数:

*<br>返回类型:

*/

public void setTo(String to) {

this.to = to;

}

/**

*<br>方法说明:设置邮件发送源邮箱

*<br>输入参数:

*<br>返回类型:

*/

public void setFrom(String from) {

this.from = from;

}

/**

*<br>方法说明:设置邮件主题

*<br>输入参数:

*<br>返回类型:

*/

public void setSubject(String subject) {

this.subject = subject;

}

/**

*<br>方法说明:设置邮件内容

*<br>输入参数:

*<br>返回类型:

*/

public void setContent(String content) {

this.content = content;

}

/**

*<br>方法说明:把主题转换为中文

*<br>输入参数:String strText

*<br>返回类型:

*/

public String transferChinese(String strText) {

try {

strText = MimeUtility.encodeText(new String(strText.getBytes(), "GB2312"), "GB2312", "B");

} catch (Exception e) {

e.printStackTrace();

}

return strText;

}

/**

*<br>方法说明:往附件组合中添加附件

*<br>输入参数:

*<br>返回类型:

*/

public void attachfile(String fname) {

file.addElement(fname);

}

/**

*<br>方法说明:发送邮件

*<br>输入参数:

*<br>返回类型:boolean 成功为true,反之为false

*/

public boolean sendMail() {

//构造mail session

Properties props = System.getProperties();

props.put("mail.smtp.host", host);

props.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, new Authenticator() {

public PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(username, password);

}

});

try {

//构造MimeMessage 并设定基本的值

MimeMessage msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(from));

InternetAddress[] address = {new InternetAddress(to)};

msg.setRecipients(Message.RecipientType.TO, address);

subject = transferChinese(subject);

msg.setSubject(subject);

//构造Multipart

Multipart mp = new MimeMultipart();

//向Multipart添加正文

MimeBodyPart mbpContent = new MimeBodyPart();

mbpContent.setText(content);

//向MimeMessage添加(Multipart代表正文)

mp.addBodyPart(mbpContent);

//向Multipart添加附件

Enumeration efile = file.elements();

while (efile.hasMoreElements()) {

MimeBodyPart mbpFile = new MimeBodyPart();

filename = efile.nextElement().toString();

FileDataSource fds = new FileDataSource(filename);

mbpFile.setDataHandler(new DataHandler(fds));

mbpFile.setFileName(fds.getName());

//向MimeMessage添加(Multipart代表附件)

mp.addBodyPart(mbpFile);

}

file.removeAllElements();

//向Multipart添加MimeMessage

msg.setContent(mp);

msg.setSentDate(new Date());

//发送邮件

Transport.send(msg);

} catch (MessagingException mex) {

mex.printStackTrace();

Exception ex = null;

if ((ex = mex.getNextException()) != null) {

ex.printStackTrace();

}

return false;

}

return true;

}

/**

*<br>方法说明:主方法,用于测试

*<br>输入参数:

*<br>返回类型:

*/

public static void main(String[] args) {

SendMail sendmail = new SendMail();

sendmail.setHost("smtp.163.com");

sendmail.setUserName("swjtu20044916");

sendmail.setPassWord("3263227");

sendmail.setTo("ry0821119@hotmail.com");

sendmail.setFrom("swjtu20044916@163.com");

sendmail.setSubject("你好,这是测试!");

sendmail.setContent("你好这是一个带多附件的测试!");

//Mail sendmail = new Mail("dujiang@sricnet.com","du_jiang@sohu.com","smtp.sohu.com","du_jiang","31415926"," 你好","胃,你好吗?");

// sendmail.attachfile("DND.jar");

// for (int i = 0; i < 5; i++) {

// sendmail.attachfile("c://test.txt");

sendmail.sendMail();

// }

System.out.print("sucess!");

}

}//end

import java.util.Properties;

import javax.mail.*;

import javax.mail.internet.*;

public class MailExample {

public static void main (String args[]) throws Exception {

String host = "smtp.163.com"; //发件人使用发邮件的电子信箱服务器

String from = "你自己的电子信箱"; //发邮件的出发地(发件人的信箱)

String to = "收件人信箱"; //发邮件的目的地(收件人信箱)

// Get system properties

Properties props = System.getProperties();

// Setup mail server

props.put("mail.smtp.host", host);

// Get session

props.put("mail.smtp.auth", "true"); //这样才能通过验证

MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");

Session session = Session.getDefaultInstance(props, myauth);

// session.setDebug(true);

// Define message

MimeMessage message = new MimeMessage(session);

// Set the from address

message.setFrom(new InternetAddress(from));

// Set the to address

message.addRecipient(Message.RecipientType.TO,

new InternetAddress(to));

// Set the subject

message.setSubject("测试程序!");

// Set the content

message.setText("这是用java写的发送电子邮件的测试程序!");

message.saveChanges();

Transport.send(message);

}

}

校验发信人权限的方法

package com.hyq.test;

import javax.mail.PasswordAuthentication;

class MyAuthenticator

extends javax.mail.Authenticator {

private String strUser;

private String strPwd;

public MyAuthenticator(String user, String password) {

this.strUser = user;

this.strPwd = password;

}

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(strUser, strPwd);

}

}

注意:上面的事例仅为使用163信箱时发送电子邮件的方法,因为使用的host为:smtp.163.com,如源代码中:String host = "smtp.163.com"; //发件人使用发邮件的电子信箱服务器,如果使用其它的电子邮件发送,就必须在其邮件服务器上查找相应的电子邮件服务器,例如搜狐就要使用smtp.sohu.com,具体情况具体对待,都可以从所使用的邮件服务器上获得的。如果没有使用host ,也就是说,没有进行props.put("mail.smtp.host", host);设置,那么就会抛 javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25; 的异常。当然了,如果你没有正确配置,这个异常仍然会被抛出的。

有些邮件服务系统是不需要验证发件人的授权的,所以可以很简单的使用

Session session = Session.getDefaultInstance(props, null);

而不必使用

props.put("mail.smtp.auth", "true");

MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");

Session session = Session.getDefaultInstance(props, myauth);

就可以发送电子邮件了,这个多为一些企事业单位的内部电子信箱系统。

但是对于很多门户网站上的电邮系统,如:163,sohu,yahoo等等,如果仍然简单的这样使用就会抛

com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxuAyCAfmnZE8BwtIA==.32705S2

at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

at javax.mail.Transport.send0(Transport.java:169)

at javax.mail.Transport.send(Transport.java:98)

这样的异常,要求你必须进行授权校验,它的目的就是阻止他人任意乱发邮件,也算是为了减少垃圾邮件的出现吧。这时候,我们就要使用

props.put("mail.smtp.auth", "true");

MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");

Session session = Session.getDefaultInstance(props, myauth);

这里还有一个特别注意的事情:在你使用Session.getDefaultInstance时,一定要将 props.put("mail.smtp.auth", "true"); 置为true,它默认的是false,如果你没有做这一步,虽然你使用了Session.getDefaultInstance(props, myauth);,你自己也确实 MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");但是它仍然会抛出

com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxJA2SBrm3ZEFv0gIA==.40815S2

at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

at javax.mail.Transport.send0(Transport.java:169)

at javax.mail.Transport.send(Transport.java:98)

这样的异常。我就在这一步费了好长时间,后来才发现了这个问题,很是郁闷。不过还好,总算解决了。

其实上面的做法只是比较简单的一种,也有很多其它的写法,如:

Properties props = System.getProperties();可以使用

Properties props = new Properties();来代替。

Transport.send(message);可以使用下面的代码来代替

String username = "你的电子信箱用户名";

String password = "你的电子信箱密码";

message.saveChanges(); // implicit with send()

Transport transport = session.getTransport("smtp");

transport.connect("mail.htf.com.cn", username, password);

transport.sendMessage(message, message.getAllRecipients());

transport.close();

这种方法在同时发送多封电子邮件时比较有用。

还有一些具体的相关概念,可以查看相关的官方文档,在我查询资料时,发现了一篇文章写得相当仔细,可以加以参考:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html

另附上使用org.apache.commons.mail进行发电子邮件的示例:

import org.apache.commons.mail.SimpleEmail;

import org.apache.commons.mail.*;

public class TestCommon {

public TestCommon() {

}

public static void main(String[] args){

SimpleEmail email = new SimpleEmail();

email.setHostName("smtp.163.com");//设置使用发电子邮件的邮件服务器

try {

email.addTo("收件人信箱");

email.setAuthentication("发件人信箱","发件人信箱密码");

email.setFrom("发件人信箱");

email.setSubject("Test apache.commons.mail message");

email.setMsg("This is a simple test of commons-email");

email.send();

}

catch (EmailException ex) {

ex.printStackTrace();

}

}

}
http://java.sun.com/products/javamail/downloads/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐