一、邮件发送
1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示。
SMTP协议使用的端口号:25
rfc821详细记载了该协议的相关信息
(1)使用telnet发送邮件(使用126邮箱服务器,现在126邮箱服务器要求使用类似于QQ的独立密码进行客户端的验证(网页登陆不需要))
第一步:连接到邮箱服务器 telnet smtp.126.com 25
第二步: ehlo aaa(任意字符串)
第三步:请求验证登录 auth login
第四步:输入使用Base64编码后的用户名 XXXX
第五步:输入使用Base64编码后的密码 XXXX
第六步:声明发件人 mail from:<发件人邮箱地址>
第七步:生命收件人 rcpt to:<收件人邮箱地址>
第八步:开始正文数据部分 data
第九步:信头部分 from:<发件人邮箱地址>
from:<收件人邮箱地址>
第十步:主题 subject:信的主题
第十一步:回车换行 回车
第十二步:书写正文部分 例:这是我的邮箱地址:XXXXX等
第十三步:结束 回车,.,回车
第十四步:和服务器断开连接 quit
(2)Base64编码:BASE64Encoder类来实现
如果使用MyEclipse自带的Jdk1.6,则不能使用该类;应当将自带的jre移除,使用自己安装的jdk1.6。
使用Base64编码示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.kdyzm.demo; //BASE64Encoder类实际上是sun公司内部使用的类。一般最好不要使用。 //使用该类将用户名和密码进行转码之后才能被服务器识别。 import sun.misc.BASE64Encoder; public class Base64EncoderDemo { public static void main(String[] args) { BASE64Encoder encoder=new BASE64Encoder(); String user=encoder.encode("邮箱地址,如kdyzm".getBytes()); String pass=encoder.encode("邮箱密码或者独立密码、客户端授权密码".getBytes()); System.out.println(user); System.out.println(pass); } }
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
08rP5LXY1rejrMjna2R5em0=
08rP5MPcwuu78tXftsDBosPcwuuhor/Nu6e2y8rayKjD3MLr
(2)解决中文乱码问题
使用SecureCRT或者putty或者Xshell等都能实现telnet连接,但是这些工具发送的邮件都会有中文乱码问题,即使用邮箱客户端查看的时候是乱码,解决方法就是使用windows自带的telnet工具,使用windows自带的telnet工具在输入的时候可能会出现乱码,但是在邮箱中查看邮件的时候并不会产生乱码。
(3)截图
在邮箱中查看:
在这里顺便一提:data命令之后输入的from:<邮箱名>中邮箱名可以任意写,这样做的好处可以随便整人~但是稍微有点网络基础的人就能够通过命令行查看邮件,这样这种方法就没用了,因为通过命令行可以查看更为隐蔽的信息,其中有一个sender字段可以查看实际的发件人。
2.使用java发送简单邮件
(1)需要的两个jar包:
mail.jar包:发送邮件的核心包
activation.jar包:加密用
(2)使用的三个核心类:
Session类:封装了用户名、密码、连接的服务器、是否调试等信息。
MimeMessage类:邮件的主体类,该类封装了发件人、收件人、抄送人、暗送人、主题、邮件内容等信息
Transport类:该类封装了如何连接服务器、怎样将邮件发送到服务器等信息。
(3)简单的邮件发送示例(不带附件)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.kdyzm.sendmail.demo; /* * 发送一封普通邮件,没有附件,不是网页代码,最简单的邮件发送 */ import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message.RecipientType; 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; /* * 演示基础的发送邮件的方法,不包含附件 */ public class SendMailBaseDemo { public static void main(String[] args) throws AddressException, MessagingException { //声明放置配置信息的配置对象 Properties p=new Properties(); //设置连接那一台服务器 p.setProperty("mail.host", "smtp.126.com"); //设置是否验证 p.setProperty("mail.smtp.auth", "true"); //获取session对象 Session s=Session.getDefaultInstance(p,new Authenticator() { //此方法返回用户名和密码的对象 @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("用户名", "密码"); } }); //设置调试模式 s.setDebug(true); //声明信息,该类是Message的实现类。 MimeMessage msg=new MimeMessage(s); //设置发件人 msg.setFrom(new InternetAddress("kdyzmx@126.com")); //设置收件人 msg.setRecipient(RecipientType.TO, new InternetAddress("kdyzmx@163.com")); //设置抄送 msg.setRecipient(RecipientType.CC, new InternetAddress("kdyzm@foxmail.com")); //设置暗送 msg.setRecipient(RecipientType.BCC, new InternetAddress("kdyzm@sina.cn")); //设置主题 msg.setSubject("这是用java发送的邮件666"); msg.setContent("这是用java发送的邮件的内容666","text/plain;charset=utf-8"); Transport.send(msg); } }
验证结果:
163邮箱示例:
后台打印输出:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
DEBUG: setDebug: JavaMail version 1.5.4 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] DEBUG SMTP: need username and password for authentication DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "smtp.126.com", port 25, isSSL false 220 126.com Anti-spam GT for Coremail System (126com[20140526]) DEBUG SMTP: connected to host "smtp.126.com", port: 25 EHLO kdyzm-PC 250-mail 250-PIPELINING 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFMLeG3UCa0xDrUUUUj 250-STARTTLS 250 8BITMIME DEBUG SMTP: Found extension "PIPELINING", arg "" DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN" DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFMLeG3UCa0xDrUUUUj" DEBUG SMTP: Found extension "STARTTLS", arg "" DEBUG SMTP: Found extension "8BITMIME", arg "" DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM DEBUG SMTP: AUTH LOGIN command trace suppressed DEBUG SMTP: AUTH LOGIN succeeded DEBUG SMTP: use8bit false MAIL FROM:<kdyzmx@126.com> 250 Mail OK RCPT TO:<kdyzmx@163.com> 250 Mail OK RCPT TO:<kdyzm@foxmail.com> 250 Mail OK RCPT TO:<kdyzm@sina.cn> 250 Mail OK DEBUG SMTP: Verified Addresses DEBUG SMTP: kdyzmx@163.com DEBUG SMTP: kdyzm@foxmail.com DEBUG SMTP: kdyzm@sina.cn DATA 354 End data with <CR><LF>.<CR><LF> From: kdyzmx@126.com To: kdyzmx@163.com Cc: kdyzm@foxmail.com Message-ID: <19456522.0.1435139854187@smtp.126.com> Subject: =?GBK?B?1eLKx9PDamF2Ybeiy821xNPKvP42NjY=?= MIME-Version: 1.0 Content-Type: text/plain;charset=utf-8 Content-Transfer-Encoding: base64 6L+Z5piv55SoamF2YeWPkemAgeeahOmCruS7tueahOWGheWuuTY2Ng== . 250 Mail OK queued as smtp5,jtKowACnyJXLfopVz3cMAA--.9857S2 1435139788 DEBUG SMTP: message successfully delivered to mail server QUIT 221 Bye
注意事项:
【1】MimeMessage类的setContent方法中设置文档类型的时候需要进行编码才不会产生乱码
msg.setContent("这是用java发送的邮件的内容666","text/plain;charset=utf-8");
【2】在创建PasswordAuthentication类对象的时候,使用的密码是“客户端授权密码(网易邮箱的称呼,QQ邮箱称之为独立密码)”
【3】本小练习没有用到activation.jar包
(4)根据后台输出内容分析发送过程
后台打印输出的内容很明显的显示出了EHLO、MAIL FROM:<kdyzmx@126.com>、RCPT TO:<kdyzmx@163.com>、DATA、From: kdyzmx@126.com、To: kdyzmx@163.com等命令,所以可以推测mail.jar包实际上在是模拟我们命令行发送邮件的过程。
3.使用java发送带有附件的邮件。
(1)使用到的核心类(除了上面介绍的三个类)
MimeMultipart类:用于封装复合的数据类型
MimeBodyPart类:用于只封装某一种数据类型
DataSource接口:用于封装某种数据源,并提供了读出和写入的方法。
Datahandler类:提供了对DataSource对象更多的操作方法
MimeUtility类:主要提供了几种方法用于对数据进行编码和解码。
(2)发送带有附件的邮件示例程序:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package com.kdyzm.sendmail.demo; import java.io.UnsupportedEncodingException; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; /* * 发送一封带有附件的邮件。 */ public class SendMailAttachFile { public static void main(String[] args) throws UnsupportedEncodingException, MessagingException { Properties p=new Properties(); p.setProperty("mail.host", "smtp.sina.cn"); p.setProperty("mail.smtp.auth", "true"); Session session=Session.getDefaultInstance(p,new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("用户名", "密码"); } }); session.setDebug(true); //声明MimeMessage MimeMessage msg=new MimeMessage(session); msg.setFrom(new InternetAddress("kdyzm@sina.cn")); msg.setRecipient(RecipientType.TO, new InternetAddress("kdyzmx@126.com")); msg.setSubject("这是用Java发送的带有附件的邮件!"); //第一步,声明多处理的Part MimeMultipart mm=new MimeMultipart(); //文字部分 //声明body MimeBodyPart body=new MimeBodyPart();