Java 收取 和 发送 邮件+SSL

 

这里使用 Gmail 邮箱测试

1. 收取邮件

package lius.javamail.ssl;

import java.io.UnsupportedEncodingException;

import java.security.*;

import java.util.Properties;

import javax.mail.*;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeUtility;

/**

 * 用于收取Gmail邮件

 * @author Winter Lau

 */

public class GmailFetch {

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

  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

  final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

  // Get a Properties object

  Properties props = System.getProperties();

  props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);

  props.setProperty("mail.pop3.socketFactory.fallback", "false");

  props.setProperty("mail.pop3.port", "995");

  props.setProperty("mail.pop3.socketFactory.port", "995");

  //以下步骤跟一般的JavaMail操作相同

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

  //请将红色部分对应替换成你的邮箱帐号和密码

  URLName urln = new URLName("pop3","pop.gmail.com",995,null,

    "邮箱帐号", "邮箱密码");

  Store store = session.getStore(urln);

  Folder inbox = null;

  try {

   store.connect();

   inbox = store.getFolder("INBOX");

   inbox.open(Folder.READ_ONLY);

   FetchProfile profile = new FetchProfile();

   profile.add(FetchProfile.Item.ENVELOPE);

   Message[] messages = inbox.getMessages();

   inbox.fetch(messages, profile);

   System.out.println("收件箱的邮件数:" + messages.length);

   for (int i = 0; i < messages.length; i++) {

    //邮件发送者

    String from = decodeText(messages[i].getFrom()[0].toString());

    InternetAddress ia = new InternetAddress(from);

    System.out.println("FROM:" + ia.getPersonal()+'('+ia.getAddress()+')');

    //邮件标题

    System.out.println("TITLE:" + messages[i].getSubject());

    //邮件大小

    System.out.println("SIZE:" + messages[i].getSize());

    //邮件发送时间

    System.out.println("DATE:" + messages[i].getSentDate());

   }

  } finally {

   try {

    inbox.close(false);

   } catch (Exception e) {}

   try {

    store.close();

   } catch (Exception e) {}

  }

 }

 protected static String decodeText(String text)

   throws UnsupportedEncodingException {

  if (text == null)

   return null;

  if (text.startsWith("=?GB") || text.startsWith("=?gb"))

   text = MimeUtility.decodeText(text);

  else

   text = new String(text.getBytes("ISO8859_1"));

  return text;
 }
}

2.发送邮件

package lius.javamail.ssl;

import java.security.Security;

import java.util.Date;

import java.util.Properties;

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.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

/**

 * 使用Gmail发送邮件

 * @author Winter Lau

 */

public class GmailSender {

 public static void main(String[] args) throws AddressException, MessagingException {

  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

  final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

  // Get a Properties object

  Properties props = System.getProperties();

  props.setProperty("mail.smtp.host", "smtp.gmail.com");

  props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);

  props.setProperty("mail.smtp.socketFactory.fallback", "false");

  props.setProperty("mail.smtp.port", "465");

  props.setProperty("mail.smtp.socketFactory.port", "465");

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

  final String username = "邮箱帐号";

  final String password = "邮箱密码";

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

      protected PasswordAuthentication getPasswordAuthentication() {

          return new PasswordAuthentication(username, password);

      }});

       // -- Create a new message --

  Message msg = new MimeMessage(session);

  // -- Set the FROM and TO fields --

  msg.setFrom(new InternetAddress(username + "@mo168.com"));

  msg.setRecipients(Message.RecipientType.TO, 

    InternetAddress.parse("[收件人地址]",false));

  msg.setSubject("Hello");

  msg.setText("How are you");

  msg.setSentDate(new Date());

  Transport.send(msg);

  System.out.println("Message sent.");
 }
}

现在发送邮件时会发生异常信息,如下:

 

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:419)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:342)
Caused by: javax.mail.MessagingException: Exception reading response;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1462)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1260)
    ... 4 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
    ... 8 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
    at sun.security.validator.Validator.validate(Validator.java:218)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
    ... 26 more

 

原因是需要保存安装证书

 

官方的QA http://java.sun.com/products/javamail/FAQ.html#installcert

 

Q: When connecting to my mail server over SSL I get an exception like "unable to find valid certification path to requested target".
A: Your server is probably using a test certificate or self-signed certificate instead of a certificate signed by a commercial Certificate Authority. You'll need to install the server's certificate into your trust store. The InstallCert program will help.

 

使用DOS命令进入InstallCert.java 存放目录
运行 javac InstallCert.java 将InstallCert.java 编译成 .class文件

在运行 java InstallCert smtp.xyz.com:465【其中xyz是要使用的mail,例如:smtp.126.com】【465是端口号】

得到jssecacerts文件后复制到jdk1.6.0_14\jre\lib\security目录 

然后再发送邮件就OK了

 

代码都是测试过的,运行没问题。

InstallCert.java资源已经上传到CSDN上,需要的可以去资源页下载。

下载地址: http://download.csdn.net/detail/liguo9860/3684166

 

参考:

http://fableking.iteye.com/blog/929726

http://a51480139.blog.163.com/blog/static/336814592008414294592/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值