前言
电子邮件(electronic mail,简称E-mail,标志:@)又称电子信箱、电子邮政,它是—种用电子手段提供信息交换的通信方式。电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。
我们熟悉的邮件软件比如Outlook、网易闪电邮、Foxmail都是用来收发邮件的。当然,使用Java程序也可以收发电子邮件。
邮件发送
传统的邮件的发送过程:
传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱;
电子邮件的发送过程:
电子邮件是从用户电脑的邮件软件,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件;
邮件协议
常见的邮件协议有:POP3、SMTP、IMAP。
POP3:
POP3(Post Office Protocol 3),邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件;
SMTP:
SMTP(Simple Mail Transfer Protocol),简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP:
IMAP(Internet Mail Access Protocol)交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。
利用SMIP协议发送邮件
常用邮件服务商的SMTP信息:
QQ邮箱:SMTP服务器是,端口是465/587
163邮箱:SMTP服务器是,端口是465
126邮箱:SMTP服务器是,端口是25
Gmail邮箱:SMTP服务器是,端口是465/587
相关jar包:
然后,我们通过JavaMail API连接到SMTP服务器上:以25端口为例,连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。
首先创建会话类:
import java.util.Properties;import javax.mail.Authenticator;import javax.mail.PasswordAuthentication;import javax.mail.Session;public class Javacreatsession {public static Session creatSession() {//SMTP服务器地址String smtp="";//邮箱账号和密码(授权密码)String userName="hpc7799@";String passWord="EQRZOMDDRBXK****";//SMTP服务器的连接信息Properties props=new Properties();props.put("mail.smtp.host", smtp); //SMTP主机名props.put("mail.smtp.port", "25"); //主机端口号props.put("mail.smtp.auth", "true"); //是否需要用户认证props.put("mail.smtp.starttls.enable", "true"); //启用TLS加密//创建Session//参数1:SMTP服务器的连接信息//参数2:用户认证对象(Authenticator接口的匿名实现类)Session session=Session.getInstance(props, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(userName,passWord);}});//开启调试模式session.setDebug(true);return session;}}
发送邮件:
发送邮件时,我们需要构造一个Message对象,然后调用Transport.send(Message)即可完成发送:绝大多数邮件服务器要求发送方地址和登录用户名必须一致,否则发送将失败。
import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Session;import javax.mail.Transport;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;import javax.activation.DataHandler;import javax.mail.BodyPart;import javax.mail.Message.RecipientType;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.util.ByteArrayDataSource;public class Demo03 {public static void main(String[] args) {try {//1.创建Session会话Session session=Javacreatsession.creatSession();//2.创建邮件对象(Message抽象类的子类对象)MimeMessage msg=new MimeMessage(session);msg.setFrom(new InternetAddress("hpc7799@"));msg.setRecipient(RecipientType.TO, new InternetAddress("464822504@"));msg.setSubject("邮件标题","utf-8");//msg.setText("邮件<b>正文</b>","utf-8","html");//3.邮件内容“复合”对象Multipart multipart=new MimeMultipart();//正文//参数1:正文内容//参数2:内容类型;字符编码集BodyPart textpart=new MimeBodyPart();textpart.setContent("爱你孤身走<b>暗巷</b>","text/html;charset=utf-8");//附件BodyPart imagepart=new MimeBodyPart();imagepart.setFileName("sb.jpg"); //设置附件文件的显示名称//数据处理对象(读取附件文件从本地磁盘进行读取)imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("c:\\hpc\\QQ图片202644.jpg")), "application/octet-stream")));//添加至邮件内容multipart.addBodyPart(textpart); //添加正文 multipart.addBodyPart(imagepart); //添加附件//设置邮件内容msg.setContent(multipart);//发送邮件Transport.send(msg);} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
填入真实的地址,运行上述代码,我们可以在控制台看到Java Mail打印的调试信息,从调试信息可以看出,SMTP协议是一个请求-响应协议,客户端总是发送命令,然后等待服务器响应。服务器响应总是以数字开头,后面的信息才是用于调试的文本。这些响应码已经被定义在SMTP协议中了,查看具体的响应码就可以知道出错原因。
如果觉得《网络编程----基于Java Email的电子邮件发送》对你有帮助,请点赞、收藏,并留下你的观点哦!