1、 邮件开发涉及到的一些基本概念(表示只要代码着急拿来用的童鞋直接翻到后面第2点:)) 在简单粗暴的拿出样例之前,需要先简介一下邮件服务的一些基本概念,以期更好的理解本文。在一个目前常用的邮件系统中,收发邮件功能的实现是通过不同的协议实现的,收邮件一般采用POP(PostOffice Protocol)协议,即邮局协议,目前所用的版本是3,所以人们通常称之为POP3,。该协议定义了接收邮件的机制,并规定每个用户只能有一个邮箱的支持。占用端口一般为25;发邮件一般采用SMTP (Simple Mail Transfer Protocol)协议,即简单邮件传输协议,它定义了发送电子邮件的机制,通过它程序将和您的公司或因特网服务供应商的(InternetService Provider’s,ISP’s)SMTP 服务器通信。SMTP 服务器可将消息中转至接收方 SMTP 服务器,以便最终让用户经由 POP 或IMAP 获得。占用端口一般为110;通过程序实现这两个协议,我们就可以构建自己企业的邮件收发系统。
1.1、邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个帐号以及空间发送电子邮件和保存别人发送过来的电子邮件。
1.2、邮件传输协议 用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,POP3协议就是用来定义这种通讯格式的。因此,我们通常也把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
1.3、电子邮件的发送和接收过程 通过一张图来说明一封邮件的发送和接收过程,如下图所示:
简单说一下这个邮件收发过程: 1、xdp@sohu.com 用户写好一封Email发送到sohu的Smtp服务器。对应于上图的步骤① 2、sohu的Smtp服务器开始处理xdp@sohu.com 用户的请求,它会根据收件人的地址判断,当前收件人是不是自己管辖的用户,如果是,就直接将Email存放到为该收件人的分配的邮箱空间当中。sohu的Smtp服务器判断收件人地址发现,这一封Email的收件人gacl@sina.com 是Sina的邮件服务器管理的,于是又将Email转发给Sina的Smtp服务器。对应于上图的步骤② 3、Sina的Smtp服务器开始处理sohu的Smtp服务器发送过来的Email,Sina的Smtp服务器根据收件人的地址判断,发现收件人自己管辖的用户,于是就直接将Email存放到为gacl@sina.com 用户的分配的邮箱空间当中。对应于上图的步骤③。 4、xdp@sohu.com 用户将邮件发出去之后,就通知gacl@sina.com 用户去收取。gacl@sina.com 用户于是就连接上Sina的POP3服务器收取邮件,对应于上图的步骤④。 5、POP3服务器从gacl@sina.com 用户的邮箱空间当中取出Email,对应于步骤⑤。 6、POP3服务器将取出来的Email发给gacl@sina.com 用户,对应于步骤⑥。
2.根据代码demo样例简单上手 2.1 邮件服务器 MailServer.java (具体看代码注释) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 import java.util.List;import java.util.Properties;import javax.mail.Authenticator;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;import javax.mail.internet.MimeMessage.RecipientType;public class MailServer { private final transient Properties props = System.getProperties(); private transient MailAuthenticator authenticator; private transient Session session; public MailServer(final String smtpHostName, final String username, final String password) { init(username, password, smtpHostName); } public MailServer(final String username, final String password) { final String smtpHostName = "smtp." + username.split("@" )[1 ]; init(username, password, smtpHostName); } private void init(String username, String password, String smtpHostName) { props.put("mail.smtp.auth" , "true" ); props.put("mail.smtp.host" , smtpHostName); if (smtpHostName==null )props.put("mail.smtp.host" , smtpHostName); authenticator = new MailAuthenticator(username, password); session = Session.getInstance(props, authenticator); } public void send(String recipient, String subject, Object content) throws AddressException, MessagingException { final MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(authenticator.getUsername())); if (recipient!=null &&recipient.indexOf(";" )!=-1 ){ String [] rec = recipient.split(";" ); int len = rec.length; InternetAddress[] iad = new InternetAddress[len]; for (int i=0 ; i<len; i++){ iad[i] = new InternetAddress(rec[i]); } message.setRecipients(RecipientType.TO, iad); }else { message.setRecipient(RecipientType.TO, new InternetAddress(recipient)); } message.setSubject(subject); message.setContent(content.toString(), "text/html;charset=utf-8" ); Transport.send(message); } public void send(List<String > recipients, String subject, Object content) throws AddressException, MessagingException { final MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(authenticator.getUsername())); final int num = recipients.size(); InternetAddress[] addresses = new InternetAddress[num]; for (int i = 0 ; i < num; i++) { addresses[i] = new InternetAddress(recipients.get(i)); } message.setRecipients(RecipientType.TO, addresses); message.setSubject(subject); message.setContent(content.toString(), "text/html;charset=utf-8" ); Transport.send(message); } public class MailAuthenticator extends Authenticator { private String username; private String password; public MailAuthenticator(String username, String password) { this .username = username; this .password = password; } String getPassword() { return password; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } String getUsername() { return username; } public void setPassword(String password) { this .password = password; } public void setUsername(String username) { this .username = username; } } }
2.2 怎么简单使用 这是简单的使用邮件服务器来发送邮件,欢迎大家讨论,对于初学可以参考一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 import javax.mail.MessagingException;import javax.mail.internet.AddressException;public class MailSender { private static MailServer mailServer = null ; private static String userName; private static String password; private static String stmp; public void setUserName(String userName) { if (MailSender.userName==null ) MailSender.userName = userName; } public void setPassword(String password) { if (MailSender.password==null ) MailSender.password = password; } public void setStmp(String stmp) { if (MailSender.stmp==null ) MailSender.stmp = stmp; } public static void sendHtml(String recipient, String subject, Object content) throws AddressException, MessagingException{ if (mailServer == null ) mailServer = new MailServer(stmp,userName,password); mailServer.send(recipient, subject, content); } public static void sendHtml(String server,String password,String stmpIp, String recipient, String subject, Object content) throws AddressException, MessagingException{ new MailServer(stmpIp,server,password).send(recipient, subject, content); } public static void main(String [] args) { try { String s = "ceshi2:<br/>您好,我在给你们演示发邮件看见了没." ; sendHtml("humf@vip.qq.com" ,"password" ,"IP" , "humf@vip.qq.com" , "我是是是" , s); } catch (AddressException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } }
本文地址:http://blog.csdn.net/qq_22260641
本作品采用知识共享署名 4.0 中国大陆许可协议 进行许可,欢迎转载,但转载请注明来自御前提笔小书童 ,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文链接:https://royalscholar.cn/2017/07/18/Java中实现SMTP邮件服务器-用demo简单粗暴的来发一波邮件了/