Java中实现SMTP邮件服务器-用demo简单粗暴的来发一波邮件了

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、邮件传输协议


1.2.1、SMTP协议


  用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

1.2.2、POP3协议


  同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,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 (具体看代码注释)

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;

/**
 * 简单邮件发送器,可单发,群发。
 * 
 * @author humingfeng
 * 
 */
public class MailServer {

	/**
	 * 发送邮件的props文件
	 */
	private final transient Properties props = System.getProperties();
	/**
	 * 邮件服务器登录验证
	 */
	private transient MailAuthenticator authenticator;

	/**
	 * 邮箱session
	 */
	private transient Session session;

	/**
	 * 初始化邮件发送器
	 * 
	 * @param smtpHostName
	 *            SMTP邮件服务器地址
	 * @param username
	 *            发送邮件的用户名(地址)
	 * @param password
	 *            发送邮件的密码
	 */
	public MailServer(final String smtpHostName, final String username,
			final String password) {
		init(username, password, smtpHostName);
	}

	/**
	 * 初始化邮件发送器
	 * 
	 * @param username
	 *            发送邮件的用户名(地址),并以此解析SMTP服务器地址
	 * @param password
	 *            发送邮件的密码
	 */
	public MailServer(final String username, final String password) {
		// 通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
		final String smtpHostName = "smtp." + username.split("@")[1];
		init(username, password, smtpHostName);

	}

	/**
	 * 初始化
	 * 
	 * @param username
	 *            发送邮件的用户名(地址)
	 * @param password
	 *            密码
	 * @param smtpHostName
	 *            SMTP主机地址
	 */
	private void init(String username, String password, String smtpHostName) {
		// 初始化props
		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 = Session.getInstance(props, authenticator);
	}

	/**
	 * 发送邮件
	 * 
	 * @param recipient
	 *            收件人邮箱地址
	 * @param subject
	 *            邮件主题
	 * @param content
	 *            邮件内容
	 * @throws AddressException
	 * @throws MessagingException
	 */
	public void send(String recipient, String subject, Object content)
			throws AddressException, MessagingException {
		// 创建mime类型邮件
		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");
//		message.setText(content.toString(), "GBK");
		// 发送
		Transport.send(message);
	}

	/**
	 * 群发邮件
	 * 
	 * @param recipients
	 *            收件人们
	 * @param subject
	 *            主题
	 * @param content
	 *            内容
	 * @throws AddressException
	 * @throws MessagingException
	 */
	public void send(List<String> recipients, String subject, Object content)
			throws AddressException, MessagingException {
		// 创建mime类型邮件
		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);
	}

	/**
	 * 服务器邮箱登录验证
	 * 
	 * @author MZULE
	 * 
	 */
	public class MailAuthenticator extends Authenticator {

		/**
		 * 用户名(登录邮箱)
		 */
		private String username;
		/**
		 * 密码
		 */
		private String password;

		/**
		 * 初始化邮箱和密码
		 * 
		 * @param username
		 *            邮箱
		 * @param 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 怎么简单使用

这是简单的使用邮件服务器来发送邮件,欢迎大家讨论,对于初学可以参考一下
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;


/**
 * @author 
 *
 */
public class MailSender {
    /**
     * 服务邮箱
     */
    private static MailServer mailServer = null;

	//
	private static String userName;

	
	private static String password;

	
	private static String stmp;
 
	/**
	 * @param userName the userName to set
	 */
	public void setUserName(String userName) {
		if(MailSender.userName==null)
			MailSender.userName = userName;
	}
	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		if(MailSender.password==null)
			MailSender.password = password;
	}
	/**
	 * @param stmp the stmp to set
	 */
	public void setStmp(String stmp) {
		if(MailSender.stmp==null)
			MailSender.stmp = stmp;
	}
    /**
     * 使用默认的用户名和密码发送邮件
     * @param recipient
     * @param subject
     * @param content
     * @throws MessagingException 
     * @throws AddressException 
     */
    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);
    }
    /**
     * 使用指定的用户名和密码发送邮件
     * @param server
     * @param password
     * @param recipient
     * @param subject
     * @param content
     * @throws MessagingException 
     * @throws AddressException 
     */
    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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

本文地址:http://blog.csdn.net/qq_22260641


  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用Java Socket类与SMTP服务器通信并发送电子邮件的Servlet示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SendEmailServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取邮件相关信息 String toAddress = request.getParameter("toAddress"); String subject = request.getParameter("subject"); String message = request.getParameter("message"); // SMTP服务器信息 String host = "smtp.example.com"; int port = 25; // 发件人和收件人信息 String fromAddress = "[email protected]"; String username = "[email protected]"; String password = "password"; // 建立Socket连接 Socket socket = new Socket(host, port); // 创建输入输出流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 接收服务器欢迎信息 String welcomeMsg = in.readLine(); System.out.println(welcomeMsg); // 发送EHLO命令 out.println("EHLO " + host); // 接收服务器回应 String ehloMsg = ""; while ((ehloMsg = in.readLine()) != null) { System.out.println(ehloMsg); if (ehloMsg.indexOf("250 ") == 0) { break; } } // 发送AUTH LOGIN命令 out.println("AUTH LOGIN"); // 接收服务器回应 String authMsg = in.readLine(); System.out.println(authMsg); // 发送用户名和密码 out.println(new String(Base64.getEncoder().encode(username.getBytes()))); out.println(new String(Base64.getEncoder().encode(password.getBytes()))); // 发送MAIL FROM命令 out.println("MAIL FROM: <" + fromAddress + ">"); // 接收服务器回应 String mailFromMsg = in.readLine(); System.out.println(mailFromMsg); // 发送RCPT TO命令 out.println("RCPT TO: <" + toAddress + ">"); // 接收服务器回应 String rcptToMsg = in.readLine(); System.out.println(rcptToMsg); // 发送DATA命令 out.println("DATA"); // 接收服务器回应 String dataMsg = in.readLine(); System.out.println(dataMsg); // 发送邮件内容 out.println("From: " + fromAddress); out.println("To: " + toAddress); out.println("Subject: " + subject); out.println(""); out.println(message); out.println("."); // 接收服务器回应 String sendMsg = in.readLine(); System.out.println(sendMsg); // 发送QUIT命令 out.println("QUIT"); // 关闭Socket连接 socket.close(); // 返回结果 response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h2>Email sent successfully.</h2>"); out.println("</body></html>"); } } ``` 上述代码,我们建立了一个Socket连接到SMTP服务器,并通过输入输出流发送SMTP命令来完成邮件发送的过程。在实际应用,我们需要将邮件相关信息从前端表单获取并传递给Servlet来完成邮件发送的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值