Java Mail 发邮件
在编写代码之前 ,我们还需要做一些准备工作。
首先使用Java mail 发送邮件需要下载好两个jar包,我用的是:activation.jar、javax.mail-1.6.1.jar。JDK版本1.8.
然后,搜索QQ邮箱SMTP设置。这样可以得到,smtp主机名和端口号(465不能用)
最后要在QQ邮箱中把pop3/smtp服务打开,得到16位的密码。
接下来上代码
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进行身份验证
*/
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的配置
所以主机名应该改为 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 {
/**
* 设置链接和邮箱属性
*
*/
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