本文转自与博客园一杯凉茶的博客.
一、发送邮件的原理
在了解其原理之前,先要知道两个协议,SMTP和POP3
SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协议,默认端口,25
POP3:Post Office Protocol 3,即邮局协议,接收邮件的协议,默认端口,110
知道了这两个协议,下面来说说邮件发送和接收的原理图,分两种,相同邮件(qq邮箱给QQ邮箱)和不同邮件(QQ邮箱给163邮箱)是不一样的。
解释:
为了方便起见,将新浪邮箱,list@sina.com称为用户A,将搜狐邮箱,wangwu@sohu.com 称为用户B
用户A(新浪邮箱,list@sina.com)给用户B(搜狐邮箱,wangwu@sohu.com)发送一封邮件,那么整个过程就为图中的实线部分,用户A通过OutLook(浏览器或者客户端)登录自己的邮箱帐号,编写邮件,使用Smtp协议发送给Sina的邮件服务器中的Smtp服务器(专门用来发送的服务器),然后在通过SMTP协议,传输给Sohu的邮件服务器中的Smtp服务器,然后通过Sohu的Smtp服务器将邮件发送给用户B的存储设备进行存储(每个用户都会有一个存储空间用来存储邮件的),到这里,用户A就相当于发送成功了,因为已经到达了目的地,如果B用户需要查看邮件内容,必须通过POP3服务器将从自己的存储设备中拿到,然后返回到浏览器或者客户端中显示。
用户B给用户A发送一封邮件,那么整个过程就为图中的虚线部分,是和A给B发一样的步骤
用户A给一个同样使用新浪邮箱的用户C发送一封邮件,那么其过程就简单的多了,先通过Smtp服务器,然后smtp服务器会将其发送到用户C的存储设备上,A发送邮件就成功了,用户C要显示自己邮箱中的邮件,那么就通过POP3服务器从自己存储设备中拿取所有邮件进行查看。
二、通过Java代码实现发送邮件
2.1、准备jar包
核心:mail.jar
依赖:activation.jar, 邮件需要发送附件时使用
2.2、使用163邮箱发送邮件
2.2.1、首先在163邮箱中注册一个帐号。有的话就省略这一步
2.2.2、编写java代码发送邮件,记住三大步
2.2.2.1、获得连接(连接邮箱的服务器和登录)
代码
1 //0.1 确定连接位置 2 Properties props = new Properties(); 3 //获取163邮箱smtp服务器的地址, 4 props.setProperty("mail.host", "smtp.163.com"); 5 //是否进行权限验证。 6 props.setProperty("mail.smtp.auth", "true"); 7 8 9 //0.2确定权限(账号和密码) 10 Authenticator authenticator = new Authenticator() { 11 @Override 12 public PasswordAuthentication getPasswordAuthentication() { 13 //填写自己的163邮箱的登录帐号和授权密码,授权密码的获取,在后面会进行讲解。 14 return new PasswordAuthentication("163邮箱帐号","授权码"); 15 } 16 }; 17 18 //1 获得连接 19 /** 20 * props:包含配置信息的对象,Properties类型 21 * 配置邮箱服务器地址、配置是否进行权限验证(帐号密码验证)等 22 * 23 * authenticator:确定权限(帐号和密码) 24 * 25 * 所以就要在上面构建这两个对象。 26 */ 27 28 Session session = Session.getDefaultInstance(props, authenticator);
2.2.2.2、创建消息(1、发件人,2、收件人,3、邮件标题,4、邮件内容)
代码
1 //2 创建消息 2 Message Message = new MimeMessage(session); 3 // 2.1 发件人 xxx@163.com 4 message.setFrom(new InternetAddress("xxx@163.com")); 5 /** 6 * 2.2 收件人 7 * 第一个参数: 8 * RecipientType.TO 代表收件人 9 * RecipientType.CC 抄送 10 * RecipientType.BCC 暗送 11 * 比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在给B发邮件时, 12 * 将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件 13 * 而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。 14 * 第二个参数 15 * 收件人的地址,或者是一个Address[],用来装抄送或者暗送人的名单。或者用来群发。可以是相同邮箱服务器的,也可以是不同的 16 * 这里我们发送给我们的qq邮箱 17 */ 18 message.setRecipient(RecipientType.TO, new InternetAddress("邮箱")); 19 // 2.3 主题(标题) 20 message.setSubject("邮件的标题"); 21 // 2.4 正文 22 String str = "李四: <br/>" 23 "您好,您在本论坛注册用户,点击下面url进行激活<br/>" 24 "http://ww......<br/>" 25 "如果不能点击,请复制直接激活<br/>" 26 "如果不是本人,请删除邮件"; 27 //设置编码,防止发送的内容中文乱码。 28 message.setContent(str, "text/html;charset=UTF-8");
2.2.2.3、发送邮件