邮件发送实现原理:
邮件服务器和电子邮箱:
邮件服务器:
要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。
这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
电子邮箱:
电子邮箱(E-mail地址)的获得需要在邮件服务器上进行申请 ,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个帐户。用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个帐号分配一定的空间,用户从而可以使用这个帐号以及空间,发送电子邮件和保存别人发送过来的电子邮件。
邮件传输协议和邮件服务器类型:
SMTP协议(发送邮件)
用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
POP3协议(接收)
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
手工演示电子邮件的发送:
- 准备实验环境
- 提前在sohu 和sina上注册一个免费帐号
- 获取smtp和pop3服务器的名称
- sina或 sohu会在其帮助中心里提示管理当前注册帐号的邮件服务器的主机名。
- 编写base64编码程序对用户名和密码进行编码。
- 手工使用SMTP协议发送电子邮件
- 手工使用POP3协议接收电子邮件
还参考了一篇文章:https://www.jianshu.com/p/0ff2b9237315
win10启用telnet:
https://jingyan.baidu.com/article/3ea51489ba79e252e61bba97.html
telnet smtp.sina.cn 25
220 smtp-5-122.smtpsmail.fmail.xd.sinanode.com ESMTP
ehlo
250 smtp-5-122.smtpsmail.fmail.xd.sinanode.com
auth login
334 VXNlcm5hbWU6
emhlbmdqaWFuaV8xOTk1QHNpbmEuY29t
334 UGFzc3dvcmQ6
邮箱密码的64位编码
235 OK Authenticated
mail from:zhengjiani_1995@sina.com
250 ok
rcpt to:nicezheng@foxmail.com
250 ok
data
354 End data with .
**from:**zhengjiani_1995@sina.com
**to:**nicezheng@foxmail.com
subject:helloHello, xsm-ue!
.
250 ok queue id 7343365767177
quit
221 smtp-5-122.smtpsmail.fmail.xd.sinanode.com
其中所遇到的错误:
451 Service temporarily unavailable.
发信账号频率超限
参考:https://help.aliyun.com/knowledge_detail/44499.html
553 Envolope sender mismatch with login user..
不匹配
参考:http://www.magicwinmail.com/faq_setup.php
502 unimplemented (#5.5.1)
java发送邮件:
public class MailDemo1 { public static void main(String[] args) throws Exception{ Properties prop=new Properties(); prop.setProperty("mail.transport.protocol","smtp");//协议 prop.setProperty("mail.smtp.host","localhost");//主机名 prop.setProperty("mail.smtp.auth","true");//是否开启权限控制 prop.setProperty("mail.debug","true");//如果设置为true则在发送邮件时会打印发送时信息 //创建程序到邮件服务器之间的一次会话 Session session=Session.getInstance(prop); //获取邮件对象 Message msg=new MimeMessage(session); msg.setFrom(new InternetAddress("zhengjiani_1995@sina.com")); msg.setSubject("这是来自java程序的一封邮件"); msg.setText("这是邮件的正文...内容..."); //找到邮递员 Transport trans=session.getTransport(); trans.connect("zhengjiani_1995","password"); trans.sendMessage(msg,msg.getAllRecipients()); }}