使用Javax.mail发送简单邮件到QQ邮箱的流程:
1、 Properties对象封装会话所需的信息
2、根据Properties对象封装的信息创建Session对象
Session session = Session.getInstance(Properties properties);
3、 根据session对象创建邮件MimeMessage
MimeMessage message = createMimeMessage(Session session ,……);
4、 根据session对象与smtp服务器创建连接
Transport transport = session.getTransport();
transport.connect(“发件人邮箱”,“发件人邮箱授权码”);
5、 发送邮件
transport.sendMail(message,message.getAllRecepient);
6、 关闭连接
tranpsort.close()
【遇到问题】:
【原因】:
缺少activation.jar
Properties属性:
属性名 | 属性类型 | 说明 |
mail.stmp.host | String | SMTP服务器地址,如smtp.sina.com.cn |
mail.stmp.port | int | SMTP服务器端口号,默认为25 |
mail.stmp.auth | boolean | SMTP服务器是否需要用户认证,默认为false |
mail.stmp.user | StringSMTP | 默认的登陆用户名 |
mail.stmp.from | String | 默认的邮件发送源地址 |
mail.stmp.socketFactory.class | String | socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.net.SocketFactory接口 |
mail.stmp.socketFactory.port | int | 指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号 |
mail.smtp.socketFactory.fallback | boolean | 设置为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为true |
package Samples;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Demo01 {
public static void sendEmail() throws Exception {
//1、 Properties对象封装会话所需的信息
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");//使用协议 smtp
props.setProperty("mail.smtp.host", "smtp.qq.com");// qq的smtp服务器地址
props.setProperty("mail.smtp.port", "465"); //协议端口号
props.setProperty("mail.smtp.auth", "true");// 需要授权
//是否需要SSL安全认证 qq是要求需要的
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false"); // 没有经过SSL认证的邮件不接收
props.setProperty("mail.smtp.socketFactory.port", "465"); //SSL 认证端口与smtp一样就可以了
//2、根据Properties对象封装的信息创建Session对象
Session session = Session.getInstance(props);
//3、 根据session创建邮件MimeMessage
MimeMessage message = creatMimeMessage(session,"发件人邮箱地址","收件人邮箱地址","UTF-8");
//4、通过session建立与stmp服务器的连接
Transport transport = session.getTransport();
//connect(String host,String user,String password) host:发件人邮箱地址; user:用户名; password:邮箱授权码
transport.connect("发件人邮箱地址","发件人QQ邮箱授权码");
//5、发送邮件
transport.sendMessage(message, message.getAllRecipients());
//6、关闭连接
transport.close();
}
public static MimeMessage creatMimeMessage(Session session,String send, String recipient, String charset) throws Exception {
//简单邮件:{发件人(from)、收件人(to)、标题(subject)、正文(content)、日期()date} {图片、附件}
MimeMessage message = new MimeMessage(session);
//InternetAddress(String address,String personal, String charset) 其中address:邮件地址 ;personal:标识 ; charset:编码
Address from = new InternetAddress(send,"我是发件人",charset);
Address to = new InternetAddress(recipient,"我是收件人",charset);
message.setFrom(from);
//收件人类型:普通收件人(TO)、抄送(CC)、密送(BCC)
message.setRecipient(MimeMessage.RecipientType.TO,to);
message.setSubject("这是主题",charset); // 邮件主题
message.setContent("这是正文……","text/html;charset=utf-8"); //正文内容
message.setSentDate(new Date()); //发件日期
return message;
}
public static void main(String[] args) throws Exception {
sendEmail();
}
}
注意:
1、 邮件是网页显示的,content的编码格式为"text/html;charset=utf-8",因此:message.setContent(“这是正文……”,“text/html;charset=utf-8”);
2 、javax.mail包的Address类为抽象类,所以使用其子类InternetAddress:
3、addRecipient(Message.RecipientType, Address)
Message.RecipientType表示/收件人类型,为枚举类型。有以下三种
:普通收件人(MimeMessage.RecipientType…TO)、抄送(MimeMessage.RecipientType…CC)、密送(MimeMessage.RecipientType…BCC)