java发邮件

 

先贴上可以运行的代码,我亲自试过:

首先需要去下2个包:mail.jar ,activation.jar。这是实现java发邮件必需要有点包

import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class dddd
{
 public static void main(String[] args)
 {
  try
  {
   String host = "smtp.163.com";
   String from = "[email protected]";
   String to = "[email protected]";
   Properties props = new Properties();
   props.put("mail.smtp.host", host);
   props.put("mail.smtp.auth","true");
   // props.put("username","supcon163");
   // props.put("password","supcon123");

   // Session session = Session.getDefaultInstance(props, null);
   // session.setDebug(true) ;

   Session session = Session.getInstance(props, new Authenticator(){
    public PasswordAuthentication getPasswordAuthentication()
    {
     return new PasswordAuthentication("[email protected]", "supcon123");
    }
   });

   MimeMessage message = new MimeMessage(session);
   message.setSubject("设置主题1");
   message.setContent("hello!", "text/plain");
   Address sendaddress = new InternetAddress(from);
   Address toAddress = new InternetAddress(to);
   message.setFrom(sendaddress);
   message.addRecipient(Message.RecipientType.TO, toAddress);
   message.saveChanges(); // implicit with send()
   Transport.send(message);
   System.out.println("success!");
  } catch (MessagingException e)
  {
   e.printStackTrace();
  }
 } 
}

 

如果是一般的企业邮件服务器的话,可能不需要验证,所以也可以把上面的

   Session session = Session.getInstance(props, new Authenticator(){
    public PasswordAuthentication getPasswordAuthentication()
    {
     return new PasswordAuthentication("[email protected]", "supcon123");
    }
   });

改为:

    props.put("username","supcon163"); 
   props.put("password","supcon123");

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

,因为163这样的大企业肯定是需要验证的,避免垃圾邮件。所以上面的代码用的是加验证的。

 

下面再给出一个邮件发HTML的例子(是我转载的):

 功能是发送UL地址的HTML到邮件.其中的图片会随同邮件一同发给和户.

package com.fswan.memo;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.activation.DataHandler;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
 * @author swan Fong(方志文)
 *
 */
public class TestMail
{
 public static final String ul = "http://www.qxzw.com/htmpage/0/14/123.htm" ;
 public static void main(String[] args)
 {
  try
  {
   URL url = new URL(ul);
//   InputStream ins = url.openStream();
   sendMail(url,"[email protected]","smtp.yeah.net");
  } catch (MalformedURLException e)
  {
   e.printStackTrace();
  }
 }
 public static void sendMail(URL url,String mail,String smtpServer)
 {
  System.out.println("send");
  MimeMultipart mp = new MimeMultipart();
  String idStr = new SimpleDateFormat("hhmmsss").format(new Date());
  System.out.println(idStr);
  try
  {
   InputStream ins = url.openStream();
   StringBuffer sb = new StringBuffer();
   byte[] conts = new byte[10240];
   int len = ins.read(conts);
   while (len > 0)
   {
    sb.append(new String(conts,0,len));
//    System.out.println(new String(conts));
//    conts = new byte[10240];
    len = ins.read(conts);
   }
   String con = sb.toString();
   String con2 = sb.toString();
   sb = new StringBuffer();
   String regex = "<img .*src=/"?([^/">]*)/"?.*/?//s*>";
   Pattern p = Pattern.compile(regex);
   Matcher m = p.matcher(con);
   ArrayList _mailAttachment = new ArrayList();
   int lastPos = 0;
   while (m.find())
   {
    sb.append(con.substring(lastPos, m.start()));
    sb.append(m.group().replaceAll(m.group(1), "cid:" + idStr + _mailAttachment.size()));
    _mailAttachment.add(new URL(url, m.group(1)));
    lastPos = m.end();
   }
   sb.append(con.substring(lastPos, con.length()));
   
   MimeBodyPart mbp2 = new MimeBodyPart();
   mbp2.setContent(sb.toString(),"text/html; charset=GB2312");
   mp.addBodyPart(mbp2);
   for (int i = 0; i < _mailAttachment.size(); i++)
   {
    MimeBodyPart mbp = new MimeBodyPart();
    mbp.setDataHandler(new DataHandler((URL)_mailAttachment.get(i)));
    mbp.setHeader("Content-ID",idStr+i);
    mp.addBodyPart(mbp);
   }
   
   Properties prop = new Properties();
   prop.put("mail.smtp.host", smtpServer);
   prop.put("mail.smtp.auth", "true");
   Session s = Session.getInstance(prop, new Authenticator(){
    public PasswordAuthentication getPasswordAuthentication()
    {
     return new PasswordAuthentication("[email protected]", "fswan123");
    }
   });
   MimeMessage message = new MimeMessage(s);
   message.setSubject("mail");
   message.setFrom(new InternetAddress(mail));
   message.setRecipient(Message.RecipientType.TO, new InternetAddress(mail));
   message.setContent(mp);
   Transport.send(message);
  } catch (MalformedURLException e)
  {
   e.printStackTrace();
  } catch (IOException e)
  {
   e.printStackTrace();
  } catch (MessagingException e)
  {
   e.printStackTrace();
  }
  System.out.println("Finished");
 }
}

 

 

 

 

 

在转载2遍相关的文章:

文章(1)

使用javamail发信过程中的一些问题及解决方法

今天在研究javamail发信的过程中,出现了一些小问题,现总结如下,以免后来者走些不必要的弯路,先把完整的能够正常运行的代码示例粘贴如下:
发邮件源代码:
package com.hyq.test;

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();
    }
  }
}




 

文章(2)

 

JavaMail 深入浅出

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h2 {mso-style-link:"标题 2 Char"; mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt; font-weight:bold;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} p.MsoPlainText, li.MsoPlainText, div.MsoPlainText {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} span.apple-converted-space {mso-style-name:apple-converted-space;} span.apple-style-span {mso-style-name:apple-style-span;} span.hilite3 {mso-style-name:hilite3;} span.hilite4 {mso-style-name:hilite4;} span.hilite6 {mso-style-name:hilite6;} span.2Char {mso-style-name:"标题 2 Char"; mso-style-locked:yes; mso-style-link:"标题 2"; mso-ansi-font-size:16.0pt; mso-bidi-font-size:16.0pt; font-family:Arial; mso-ascii-font-family:Arial; mso-fareast-font-family:黑体; mso-hansi-font-family:Arial; mso-font-kerning:1.0pt; mso-ansi-language:EN-US; mso-fareast-language:ZH-CN; mso-bidi-language:AR-SA; font-weight:bold;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

JavaMail 深入浅出

   SMTP:简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由RFC821定义,它定义了发送邮件的机制,在JavaMail环境中,基于JavaMail的程序将和因特网服务供应商ISP(internet Service Provider ’ s)SMTP服务器通信.SMTP服务器会中转消息给接收方SMTP服务器以便最终让用户经由POP或者IMAP获得.

    POP:代表邮局协议(Post Office Protocol).目前的版本是3.所以一般都称之为POP3.这个协议是由RFC1939定义的.POP是一种机制,因特网上多大数用户用它得到邮件.它规定每个用户一个邮箱的支持.使用POP协议的时候,用户的许多性能并不是由POP协议支持的,如查看几封新邮件消息这个功能,这些功能内建在如Eudora或MicrosoftOutlook之类的程序中,它们记住一些事.所以在用JavaMail的时候,如果你想要这些信息,你就必须自己算了.

    IMAP:是更高级的用户接收消息的协议,被定义在RFC2060中,IMAP代表因特网消息访问协议(Internet Message Access Protocol),目前用的版本是4,所以也叫做IMAP4.在用到IMAP的时候,邮件服务器必须支持这个协议,不能仅仅把使用POP的程序用于IMAP,并指望它支持IMAP所有性能.

    MIME:是因特网邮件扩展标准(Multipurpose Internet Mail Extensions).它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可以理解成一个定义合适的标准.

    NNTP:因为JavaMail将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持.NNTP 就是网络新闻传输协议.

    JavaMailAPI可以到 http://java.sun.com/products/javamail/index.html 进行下载,并将mail.jar添加到classpath即可.

    JAF框架可以到 http://java.sun.com/products/javabeans/glasgow/jaf.html 进行下载,并将activation.jar添加到classpath即可.

    如果实用J2EE就没由什么特定非要用基本的JavaMailAPI了.J2EE的类就能处理了.只要确保j2ee.jar文件在classpath中就Ok了.

下面我用一个最简单的例子还演示第一条消息的发送.

1,获取系统Properties.

Properties props = System.getProperties();

2,将您的SMTP服务器名添加到mail.smtp.host关键字的属性中.

Props.pout( “ mail.smtp.host ” ,host);

3,获取基于Properties Session对象.

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

4,从Session创建一个MimeMessage.

MimeMessage message = new MimeMessage(session);

5,设置消息from域.

Message.setForm(new InternetAddress(from));

6,设置to域.

Message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

7,设置消息主题.

message.setSubject( “ HelloJavaMail ” );

8,设置消息内容.

Message.setText( “ Welcome to JavaMail ” );

9发送消息.

Transport.send(message);

10,在编译用运的时候传递MSTP服务器,from地址,to地址.

    通过简单的接触了JavaMail相信大家多邮件发送也有了简单的了解和认识,下面我主要研究一下它的具体功能,也就是说具体的接口或类的含义.

    Session类定义了一个基本的邮件会话,所有的其他类都是由这个session才得意生效的,Session对象用java.util.Properties对象获取信息,如邮件服务器,用户名,密码及整个应用程序中共享的其他信息.类的构造器是此有的,private.它能用getDefaultInstance()方法来共享.获取Session对象的方方法如下:

Properties props = new Properties();

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

Null参数都是Authenticator对象,在这里没有使用.

对于大多数情况,共享的session已经足够用了.

    Message消息类,在获得了Session对象后,就可以继续创建要发送的消息.因为Message是个抽象类,您必须用一个子类,多数情况下为java.mail.internet.MimeMessage.这个能理解成MIME类型和头的电子邮件消息.正如不同的RFC中定义的,虽然在某些头部域非ASCII字符也能被编译,但是Message头只能被限制用US-ASCII字符.要创建一个Message请将Session对象传递给MimeMessage的构造器.

MimeMessage message = newMimeMessage(session);

一旦获得消息,就可以设置各个部分了.最基本的就是setContent()方法,例如/

message.setContent( “ Hello ” , ” text/plain ” );

如果知道在实用MimeMessage,而且消息是纯文本格式,就可以用setText()方法,它只需要代表实际内容的参数.(Mime类型缺省为text/plain)

用setSubject()方法设置subject(主题);

message.setSubject( “ 主题 ” );

    Address地址类,和Message一样也是一个抽象类,一旦创建了Session和Message并将内容填入消息后,就可以用Address确定信件的地址了,用javax.mail.internet.

InternetAddress类.若创建的地址只包含电子邮件地址,只要传递电子邮件地址给构造器就可以了.例如:Address address = new InternetAddress( “ [email protected] ” );

若希望名字挨着电子邮件现实,就可以把它传递给构造器,如下:

Address address = new InternetAddress( “ [email protected] ” , ” 我心依旧 ” );

需要为消息的from域和to域创建地址对象,除非邮件服务器阻止,没有什么能阻止你发送一段看上去是任何人的消息了呵呵.一旦创建address将他们域消息连接方法有两种,如要要识别发件人的就可以用setFrom()和setReplyTo方法.然后message.setFrom(address);

需要实用多个from地址的就用addFrom()方法.例子如下:

Address[] address = ,.,. ;    message.addFrom(address);

若要识别消息recipient收件人,就要实用addRecipient()方法了.例如:

message.addRecipient(type,address)

    Authenticator与java.net类一样,JavaMailAPI也可以利用Authentcator通过用户名密码访问受保护的资源.对于JavaMail来说,这些资源就是邮件服务器,Authentcator类在javax.mail包中.要使用Authenticator,首先创建一个抽象的子类,并从

GetPasswordAuthentication方法中返回passwordAuthentication实例,创建完成后,您必须向session注册Authenticator,然后在需要认证的时候会通知它,其实说白了就是把配置的用户名和密码返回给调用它的程序.例如:

Properties props = new properties();

Authenticator auth = new MailAuthenticator()//接口声明,创建自己新类的实例.

Session session = Session.getDefauItInstance(props,auth);

    Transport消息发送传输类,这个类用协议指定的语言发送消息,通常是SMTP,它是抽象类,它的工作方式与Session有些类似,尽调用静态方法send()方法,就OK了.例如:

Transport.send(message);

或者也可以从针对协议的会话中获取一个特定的实例,传递用户名和密码.发送消息,然后关闭连接,例如:

message.saveChanges();

transport transport = session.getTreansport( “ smtp ” );//指定的协议

transport.connect(host,username,password);

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

transport.close();

如果要观察传到邮件服务器上的邮件命令,请用session.setDubug(true)设置调试标志.

    Store和folder用session获取消息,与发送消息开始很相似,但是在session得到后,很可能实用用户名和密码或实用Authenticator连接到一个Store.类似于Transport,也是一样要告诉store用什么协议.例如

Store store = session.getStore( “ pop3 ” );

Store.connect(host,username,password);

连接到Store之后,接下来,获得一个folder,必须打开它就可以读取里边的消息了.

Folder folder = store.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

Message[] message = folder.getMessages();

POP3唯一可用的文件夹就是INBOX,如果实用IMAP,还可以用其他的文件夹.

当读到了具体的message以后,就可以用getContent来获取内容,或者用writeTo()将内容写入流,getContent()方法只能得到消息内容,而writeTo()的输出却包含消息头.

System.out.println(((MimeMessage)message).getConntent());

一旦读取完毕邮件,要关闭store和folder的连接.

folder.colse(boolean);

store.colse();

传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder.

    上面就是JavaMail邮件操作的基本的常用类,我觉得理解了这几个类的机制,基本就可以处理一般的邮件操作了.下面是一个我写的JavaMail实现邮件发送的代码.

首先是一个Authenticator类的实现:记录用户名和密码:

import javax.mail.*;

 

 

public class MailAuthenticator extends Authenticator

{

    //******************************

    //由于发送邮件的地方比较多,

    //下面统一定义用户名,口令.

    //******************************

    public static String HUAWEI_MAIL_USER = "[email protected]";

    public static String HUAWEI_MAIL_PASSWORD = "密码";

 

 

    public MailAuthenticator()

    {

    }

 

    protected PasswordAuthentication getPasswordAuthentication()

    {

        return new PasswordAuthentication(HUAWEI_MAIL_USER, HUAWEI_MAIL_PASSWORD);

    }

 

}

 

这个类是发送邮件的类.

 

 

package com.deepdo.common.mail;

 

/**

 * 此处插入类型说明。

 * 创建日期:(2006-4-21 14:57:16)

 * @author:张宏亮

 */

 

import java.util.*;

import java.io.*;

import javax.mail.*;

import javax.mail.internet.*;

import javax.activation.*;

 

 

public class SendMail {

 

    //要发送Mail地址

    private String mailTo = null;

    //Mail发送的起始地址

    private String mailFrom = null;

    //SMTP主机地址

    private String smtpHost = null;

    //是否采用调试方式

    private boolean debug = false;

 

    private String messageBasePath = null;

    //Mail主题

    private String subject;

    //Mail内容

    private String msgContent;

 

    private Vector attachedFileList;

    private String mailAccount = null;

    private String mailPass = null;

    private String messageContentMimeType ="text/html; charset=gb2312";

 

    private String mailbccTo = null;

    private String mailccTo = null;

    /**

     * SendMailService 构造子注解。

     */

    public SendMail() {

        super();

   

    }

 

    private void fillMail(Session session,MimeMessage msg) throws IOException, MessagingException{

   

        String fileName = null;

        Multipart mPart = new MimeMultipart();

        if (mailFrom != null) {

            msg.setFrom(new InternetAddress(mailFrom));

            System.out.println("发送人Mail地址:"+mailFrom);

        } else {

            System.out.println("没有指定发送人邮件地址!");

            return;

        }

        if (mailTo != null) {

            InternetAddress[] address = InternetAddress.parse(mailTo);

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

            System.out.println("收件人Mail地址:"+mailTo);

        } else {

            System.out.println("没有指定收件人邮件地址!");

            return;

        }

   

        if (mailccTo != null) {

            InternetAddress[] ccaddress = InternetAddress.parse(mailccTo);

            System.out.println("CCMail地址:"+mailccTo);

            msg.setRecipients(Message.RecipientType.CC, ccaddress);

        }

        if (mailbccTo != null) {

            InternetAddress[] bccaddress = InternetAddress.parse(mailbccTo);

            System.out.println("BCCMail地址:"+mailbccTo);

            msg.setRecipients(Message.RecipientType.BCC, bccaddress);

        }

        msg.setSubject(subject);

        InternetAddress[] replyAddress = { new InternetAddress(mailFrom)};

        msg.setReplyTo(replyAddress);

        // create and fill the first message part

        MimeBodyPart mBodyContent = new MimeBodyPart();

        if (msgContent != null)

            mBodyContent.setContent(msgContent, messageContentMimeType);

        else

            mBodyContent.setContent("", messageContentMimeType);

        mPart.addBodyPart(mBodyContent);

        // attach the file to the message

        if (attachedFileList != null) {

            for (Enumeration fileList = attachedFileList.elements(); fileList.hasMoreElements();) {

                fileName = (String) fileList.nextElement();

                MimeBodyPart mBodyPart = new MimeBodyPart();

   

                // attach the file to the message

                FileDataSource fds = new FileDataSource(messageBasePath + fileName);

                System.out.println("Mail发送的附件为:"+messageBasePath + fileName);

                mBodyPart.setDataHandler(new DataHandler(fds));

                mBodyPart.setFileName(fileName);

                mPart.addBodyPart(mBodyPart);

            }

        }

        msg.setContent(mPart);

        msg.setSentDate(new Date());

    }

    /**

     * 此处插入方法说明。

     */

    public void init()

    {

   

    }

    /**

     * 发送e_mail,返回类型为int

     * 当返回值为0时,说明邮件发送成功

     * 当返回值为3时,说明邮件发送失败

     */

    public int sendMail() throws IOException, MessagingException {

   

        int loopCount;

        Properties props = System.getProperties();

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

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

   

        MailAuthenticator auth = new MailAuthenticator();

   

        Session session = Session.getInstance(props, auth);

        session.setDebug(debug);

        MimeMessage msg = new MimeMessage(session);

        Transport trans = null;

        try {

   

            fillMail(session,msg);

            // send the message

            trans = session.getTransport("smtp");

            try {

                trans.connect(smtpHost, MailAuthenticator.HUAWEI_MAIL_USER, MailAuthenticator.HUAWEI_MAIL_PASSWORD);//, HUAWEI_MAIL_PASSWORD);

            } catch (AuthenticationFailedException e) {

                e.printStackTrace();

                System.out.println("连接邮件服务器错误:");

                return 3;

            } catch (MessagingException e) {

                System.out.println("连接邮件服务器错误:");

                return 3;

            }

   

            trans.send(msg);

            trans.close();

   

        } catch (MessagingException mex) {

            System.out.println("发送邮件失败:");

            mex.printStackTrace();

            Exception ex = null;

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

                System.out.println(ex.toString());

                ex.printStackTrace();

            }

            return 3;

        } finally {

            try {

                if (trans != null && trans.isConnected())

                    trans.close();

            } catch (Exception e) {

                System.out.println(e.toString());

            }

        }

        System.out.println("发送邮件成功!");

        return 0;

    }

    public void setAttachedFileList(java.util.Vector filelist)

    {

        attachedFileList = filelist;

    }

    public void setDebug(boolean debugFlag)

    {

        debug=debugFlag;

    }

    public void setMailAccount(String strAccount) {

        mailAccount = strAccount;

    }

    public void setMailbccTo(String bccto) {

        mailbccTo = bccto;

    }

    public void setMailccTo(String ccto) {

        mailccTo = ccto;

    }

    public void setMailFrom(String from)

    {

        mailFrom=from;

    }

    public void setMailPass(String strMailPass) {

        mailPass = strMailPass;

    }

    public void setMailTo(String to)

    {

        mailTo=to;

    }

    public void setMessageBasePath(String basePath)

    {

        messageBasePath=basePath;

    }

    public void setMessageContentMimeType(String mimeType)

    {

        messageContentMimeType = mimeType;

    }

    public void setMsgContent(String content)

    {

        msgContent=content;

    }

    public void setSMTPHost(String host)

    {

        smtpHost=host;

    }

    public void setSubject(String sub)

    {

        subject=sub;

    }

   

    public static void main(String[] argv) throws Exception

    {

        for(int i = 0;i<10;i++) {

        SendMail sm = new SendMail();

        sm.setSMTPHost("SMTP地址");

        sm.setMailFrom("发送地址");

        sm.setMailTo("目标地址");

        sm.setMsgContent("内容");

        sm.setSubject("标题");

        sm.sendMail();

        }

    }

}

2,javamail 和spring集成

配置如下:

<bean id="mailSenderInfo" class="org.springframework.mail.javamail.JavaMailSenderImpl" >

<property name="host">
<value>21.2.13.1</value>
</property>

<property name="username">
<value>user</value>
</property>
<property name="password">
<value>pass</value>
</property>

<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>

<bean id="SimpleMailMessage" >

<property name="from">
<value>[email protected]</value>
</property>
<property name="subject">
<value>email</value>
</property>

<property name="text">
<value>contain</value>
</property>
</bean>

<bean id="emailManager" class="EmailManagerImpl" singleton="false">
<property name="simpleMailMessage" ref="sMMessage"/>

<property name="mailSender" ref="mailSenderInfo"/>

</bean>

可能出现的问题:

1,org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.NoSuchProviderException: Unable to locate provider for protocol: smtp
javax.mail.NoSuchProviderException: Unable to locate provider for protocol: smtp
at javax.mail.Session.getProvider(Session.java:225)
这个是因为缺少 javamail的jar包,到 http://java.sun.com/products/javamail/index.html 进行下载,并将mail.jar添加到classpath即可.

    JAF框架可以到 http://java.sun.com/products/javabeans/glasgow/jaf.html 进行下载,并将activation.jar添加到classpath即可.

2,Failed message 1:

javax.mail.MessagingException: 503 Error: need EHLO and AUTH first !

503错误。因为smtp服务器需要授权。在spring的配置中加入<prop key="mail.smtp.auth">true</prop>即可。

另外需要打开邮箱的smtp服务,因为好多邮箱现在都不开启这个服务。方法如下:

开启Yahoo中国与网易163邮箱pop3与smtp的方法

上班之后经常用outlook收发邮件,慢慢的习惯了用这种客户端的方便,不过现在好一点的免费邮箱比如yahoo.com.cn或126.com都关闭了对于免费用户的客户端软件收发的支持,不过,我们还是有办法的:)自己搞定之后,把方法介绍给大家。

首先是Yahoo中国:
1. 先去 http://mail.yahoo.com.cn , 用你的账号登陆进 yahoo 电邮 
2. 然后把下面整个的链接贴到IE地址栏里。(注意:整个都是一行) 
http://rd.yahoo.com/mail_us/options/?http://edit.my.yahoo.com/config/set_popfwd?.src="/ym&";.done=http://us.f93.mail.yahoo.com/ym/Options?YY=22797 
全部粘贴到地址栏中,然后根据提示来激活你的邮箱支持POP功能 
3. 在注册一项中选择“是”,然后选择你感兴趣的内容,其它的选项可以根据需要来
选择,然后按"完成"按钮。 
4. 选择“网上阅读邮件和POP功能”,其它选项可根据自己的需要选择,完成后按“提
交”按钮。 
5. 此时“网上直投”注册成功,系统会告诉你的“服务器设置”: 
接收邮件(POP3)服务器:POP.MAIL.YAHOO.COM.CN 
发送邮件(SMTP)服务器:SMTP.MAIL.YAHOO.COM.CN 

对于网易的邮箱,其实126应该是最好的选择,但是似乎126的免费pop始终激活不了,那只有选择163了:)
步骤:注册帐户后在此处登录升级后即开启了POP功能,默认申请的没有开放POP功能。
http://uinfo.mail.163.com/enlarge3g/index.htm 
然后一路next就可以了
接收邮件(POP3)服务器:POP3.163.COM
发送邮件(SMTP)服务器:SMTP.163.COM

总结:使用客户端收发163的邮件速度还不错,还是yahoo中国的邮件如果附件比较大的话,就很慢了。基本上来说还是达到了目的,美中不足的是没有搞定我心仪的126邮箱。

3, Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

解决方案:

JavaEE版本和JavaMail的版本不一致,请将sun公司上下载最新版本.
   例如:javaMail 1.3以下的如果在javaEE5上就会出现上面的错误,
   但如果在javaEE1.4下就正常.(但本人试过,javaEE5+javaMail1.4还是有一样的问题)
   因为javaEE5中包含有javaMail的类但是却不全面,所以出本身的JavaMail
   包冲突.

 

 

文章(3)

Java发送邮件另一法 --- Apache Commns email

 

记得曾经学习用javamail发邮件,学了2天,大概搞明白了利用javamail发邮件的方法和注意事项。 

这周末在网上闲逛时,发现了另外一个发邮件的好东东。 
commons-email-1.1.jar: 这是Apache组织下的一个项目,主要就是对java的邮件功能进行了封装,用起来更加方便,简单。 

接下来我们就说说这个jar包。 

首先肯定得下载commons-email-1.1.jar,并下载mail.jar和activation.jar(它们可以从sun的网站上下载,从下载的javamail和jaf中找到)。 

如果没有mail.jar,则会有:Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Message 这样的错误提示。 

如果没有activation.jar,则会有:Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource 这样的错误提示。 

下面是一个简单的测试。 

Java代码  
  1. Java代码  
  2. import org.apache.commons.mail.EmailException;       
  3. import org.apache.commons.mail.SimpleEmail;       
  4.       
  5. public class Send        
  6. {       
  7.     public Send()       
  8.     {       
  9.                
  10.     }       
  11.            
  12.     public static void main(String[] args)       
  13.     {       
  14.         send();       
  15.     }       
  16.            
  17.     public static void send()       
  18.     {       
  19.         SimpleEmail email = new SimpleEmail();          
  20.         email.setTLS(true);               
  21.         email.setHostName("smtp.gmail.com");             
  22.         email.setAuthentication("***@gmail.com""***");   //用户名和密码       
  23.                
  24.         try        
  25.         {       
  26.             email.addTo("[email protected]"); //接收方       
  27.             email.setFrom("[email protected]");       //发送方         
  28.             email.setSubject("Java Mail Test");         //标题          
  29.             email.setMsg("Just a simple send test .");   //内容          
  30.             email.send();        
  31.                    
  32.         } catch (EmailException e) {       
  33.             e.printStackTrace();       
  34.         }        
  35.     }       
  36. }     
  37.   
  38. import org.apache.commons.mail.EmailException;    
  39. import org.apache.commons.mail.SimpleEmail;    
  40.    
  41. public class Send     
  42. {    
  43.     public Send()    
  44.     {    
  45.             
  46.     }    
  47.         
  48.     public static void main(String[] args)    
  49.     {    
  50.         send();    
  51.     }    
  52.         
  53.     public static void send()    
  54.     {    
  55.         SimpleEmail email = new SimpleEmail();       
  56.         email.setTLS(true); //是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验  
  57. //      email.setSSL(true);          
  58.         email.setHostName("smtp.gmail.com");          
  59.         email.setAuthentication("***@gmail.com""***");   //用户名和密码    
  60.             
  61.         try     
  62.         {    
  63.           email.addTo("[email protected]"); //接收方    
  64.             email.addCc("[email protected]"); //抄送方      
  65.             email.addBcc("[email protected]"); //秘密抄送方  
  66.             email.setSubject("Java Mail Test");         //标题       
  67.             email.setMsg("Just a simple send test .");   //内容       
  68.             email.send();     
  69.                 
  70.         } catch (EmailException e) {    
  71.             e.printStackTrace();    
  72.         }     
  73.     }    
  74. }  



上面的邮件标题和内容用的都是英文,如果改为中文呢?我试了一下,结果邮件标题不是乱码,而邮件内容则中文部分是乱码。设置其charSet为GB2312或者UTF-8后就可以发送中文邮件了,显示正常了。如下面的代码。 

Java代码  
  1. Java代码  
  2. import org.apache.commons.mail.EmailException;    
  3. import org.apache.commons.mail.SimpleEmail;    
  4.    
  5. public class Send     
  6. {    
  7.     public Send()    
  8.     {    
  9.             
  10.     }    
  11.         
  12.     public static void main(String[] args)    
  13.     {    
  14.         send();    
  15.     }    
  16.         
  17.     public static void send()    
  18.     {    
  19.         SimpleEmail email = new SimpleEmail();       
  20.         email.setTLS(true);            
  21.         email.setHostName("smtp.gmail.com");          
  22.         email.setAuthentication("[email protected]""sdzzczqqyyxy");       
  23.             
  24.         try     
  25.         {    
  26.             email.addTo("[email protected]");    
  27.             email.setFrom("[email protected]");       //我方       
  28.                 
  29.             email.setSubject("Java发送邮件测试");                 //标题       
  30.                 
  31.             email.setCharset("GB2312");                     //设置Charset    
  32.                 
  33.             email.setMsg("这是一封Java程序发出的测试邮件。");     //内容       
  34.                 
  35.             email.send();     
  36.                 
  37.         } catch (EmailException e) {    
  38.             e.printStackTrace();    
  39.         }     
  40.     }    
  41. }    



怎么样?简单吧~~~ 
有人这时说到了网页邮件,其实只需要把上面SimpleEmail换成HtmlEmail,然后设置邮件内容的方法由setMsg(String str)变为setHtmlMsg(String str)就可以了,这样就可以再邮件里使用<br/>等html标签来控制邮件的格式了. 
还有人问,那么附件呢?别急,我们马上就来做个带附件发送的代码 

Java代码  
  1. import java.net.MalformedURLException;  
  2.   
  3. import java.net.URL;  
  4.   
  5. import org.apache.commons.mail.EmailAttachment;  
  6.   
  7. import org.apache.commons.mail.EmailException;  
  8.   
  9. import org.apache.commons.mail.MultiPartEmail;  
  10.   
  11. publicclass AttachmentMailTest {  
  12.   
  13.     publicstaticvoid main(String[] args) throws EmailException, MalformedURLException {  
  14.   
  15. //     创建一个Email附件  
  16.   
  17.        EmailAttachment emailattachment = new EmailAttachment();  
  18.   
  19.        emailattachment.setPath("/biao_05.jpg");  
  20.   
  21. //     emailattachment.setURL(new URL("http://www.blogjava.net/bulktree/picture/bulktree.jpg"));  
  22.   
  23.        emailattachment.setDisposition(EmailAttachment.ATTACHMENT);  
  24.   
  25.        emailattachment.setDescription("This is Smile picture");  
  26.   
  27.        emailattachment.setName("bulktree");  
  28.   
  29. //     创建一个email  
  30.   
  31.        MultiPartEmail multipartemail = new MultiPartEmail();  
  32.   
  33.        multipartemail.setHostName("smtp.163.com");  
  34.   
  35.        multipartemail.addTo("[email protected]""bulktree");  
  36.   
  37.        multipartemail.setFrom("[email protected]""bulktree");  
  38.   
  39.        multipartemail.setAuthentication("bulktree""123456");  
  40.   
  41.        multipartemail.setSubject("This is a attachment Email");  
  42.   
  43.        multipartemail.setMsg("this a attachment Eamil Test");  
  44.   
  45.        //添加附件  
  46.   
  47.        multipartemail.attach(emailattachment);  
  48.   
  49.        //发送邮件  
  50.   
  51.        multipartemail.send();  
  52.   
  53.       System.out.println("The attachmentEmail send sucessful!!!");  
  54.     }  
  55. }  



就这样,附件也发送成功了,大家可以试一下,另外这个项目是开源的,大家可以取下载它的src来看看,我暂时就说到这儿.. 

不过用这个commons-email-1.1.jar实现发邮件还是有2个值得注意的地方: 
  1.前面提到mail.jar和activation.jar包的问题,这两个包需要额外下载并且必不可少的两个包 
  2.不知是否是我使用错误或者软件环境导致,我在第一次使用时,出现了一个奇怪的异常:

Java代码  
  1. Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream  



  在网上有人说是因为JavaEE版本和JavaMail的版本不一致导致的.我用的是jdk1.6.查了半天,没找到是哪里冲突了,于是我建web项目时,选择1.4版本,于是没有出现任何问题,可以正常使用,估计应该是myeclipse建项目时自带的jar包引起了这个问题.我用的是myeclipse 6.0.不知道在eclipse或其他版本的myeclipse上是否会出现这个问题

你可能感兴趣的:(java,session,String,properties,javamail,邮件服务器)