Java Mail 发邮件

在编写代码之前 ,我们还需要做一些准备工作。

首先使用Java mail 发送邮件需要下载好两个jar包,我用的是:activation.jar、javax.mail-1.6.1.jar。JDK版本1.8.

然后,搜索QQ邮箱SMTP设置。这样可以得到,smtp主机名和端口号(465不能用)

Java Mail 发邮件


最后要在QQ邮箱中把pop3/smtp服务打开,得到16位的密码。

Java Mail 发邮件

接下来上代码

import java.util.Properties;
import javax.mail.Authenticator;
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;
import javax.mail.internet.MimeMessage.RecipientType;
import org.junit.Test;

public class SendEmail {

public static  void Send() throws AddressException, MessagingException {
/**
* 设置链接和邮箱属性

*/
Properties pos=new Properties();
//身份验证必须为true
pos.put("mail.smtp.auth", "true");
//设置smtp主机名
pos.put("mail.host", "smtp.qq.com");
//设置端口号
pos.put("mail.smtp.port","587");
//发件邮箱
pos.put("mail.user", "*****@qq.com");
        // 此处的密码就是前面说的16位SMTP口令

         pos.put("mail.password", "*********");


/**
* 构建授权信息,用于进行SMTP进行身份验证
*/

Authenticator auth=new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
  String userName = pos.getProperty("mail.user");
                          String password = pos.getProperty("mail.password");
  return new PasswordAuthentication(userName,password);
}
};

//创建对话
Session session=Session.getInstance(pos, auth);

/**
* 设置邮件的相关内容属性
*/
MimeMessage msg=new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(pos.getProperty("mail.user")));
//收件人  RecipientType.TO普通收件人   RecipientType.cc抄送       RecipientType.bcc密送 
msg.setRecipients(RecipientType.TO, "*****@qq.com");
//主题
msg.setSubject("这是一个标题");
//内容  与 编码格式
msg.setContent("你好 Email", "text/html;charset=utf-8");

/**
* 发件
*/
Transport.send(msg);
}

public static void main (String[] args) {
try {
Send();
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

这样一封邮件就通过我的qq邮箱发出去了,然后我又用outlook试了试,结果报错了。最后,受一篇博文的启发终于找到原因。

让我们看一下 Microsoft 对outlook的配置

Java Mail 发邮件

所以主机名应该改为 smtp-mail.outlook.com,端口为587,注意最后的smtp加密方法为STARTTLS。这就导致了我们的配置中必须把STARTTLS加密打开。直接上代码:

import java.util.Properties;
import javax.mail.Authenticator;
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;
import javax.mail.internet.MimeMessage.RecipientType;
import org.junit.Test;

public class SendEmail {


public static  void Send() throws AddressException, MessagingException {
/**
* 设置链接和邮箱属性

*/
Properties pos=new Properties();
//身份验证必须为true
pos.put("mail.smtp.auth", "true");
//设置smtp主机名
pos.put("mail.host", "smtp-mail.outlook.com");
//设置端口号
pos.put("mail.smtp.port","587");
//用户名
pos.put("mail.user", "******@outlook.com");
        // 此处为outlook邮箱密码
        pos.put("mail.password", "******");
         //STARTTLS加密打开
pos.put("mail.smtp.starttls.enable", "true");
    
/**
* 构建授权信息,用于进行SMTP进行身份验证
*/
Authenticator auth=new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
  String userName = pos.getProperty("mail.user");
              String password = pos.getProperty("mail.password");
return new PasswordAuthentication(userName,password);
}
};

//创建对话
Session session=Session.getInstance(pos, auth);

/**
* 设置邮件的相关内容属性
*/
MimeMessage msg=new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(pos.getProperty("mail.user")));
//收件人  RecipientType.TO普通收件人   RecipientType.cc抄送       RecipientType.bcc密送 
msg.setRecipients(RecipientType.TO, "*******@qq.com");
//标题
msg.setSubject("这是一个标题");
//内容  与 编码格式
msg.setContent("你好 Email", "text/html;charset=utf-8");

/**
* 发件
*/
Transport.send(msg);
}

public static void main (String[] ags) {
try {
Send();
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

所有的Properties配置项说明:http://blog.sina.com.cn/s/blog_872758480100zsgx.html