传统使用的比较简单的是 smtp 25端口收发邮件;

阿里云服务器不能作为客户端通过smtp 25端口发送邮件,需要使用ssl协议发送邮件。

首先需要判断smtp 25端口是否可用。

在服务器端telnet smtp.163.com 25 如果可以成功就用smtp 25端口开发。链接不通需要打开25端口

下面是关于JavaMail邮件开发工具类

public class MailInfo {//电子邮件 工具类

	/**
	 * 邮件主题
	 */
	public String subject;
	
	/**
	 * 邮件内容
	 */
	public String content;
	
	public String getSubject() {
		return subject;
	}
	
	public void setSubject(String subject) {
		this.subject = subject;
	}
	
	public String getContent() {
		return content;
	}
	
	public void setContent(String content) {
		this.content = content;
	}



下面是邮箱登录验证的工具类

/**
 * 邮箱登录验证
 * 
 */
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;
	}

	public String getUsername() {
		return username;
	}
	
	public void setUsername(String username) {
		this.username = username;
	}
	
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	@Override
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(username, password);
	}

}



下面是邮箱发送器工具类

/**
 * 邮件发送器,可单发,群发
 * 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
 * 需要群发邮件时,可以采用多次单发的方式进行
 * 
 */
public class MailSender {
	
	/**
     * 邮箱session
     */
    private transient Session session;
    
    /**
     * 邮件服务器登录验证
     */
    private transient MailAuthenticator authenticator;
    
    /**
     * 发送邮件的props
     */
    private final transient Properties props = System.getProperties();

    /**
     * 获取邮件发送工具实例
     * 所有的发件操作均通过该实例进行
     * @param username 发件人邮箱地址
     * @param password 发件人邮箱密码
     * 
     */
    public static MailSender getSender(String username, String password) {
    	MailSender serviceSms = new MailSender(username, password);
        return serviceSms;
    }
 
    /**
     * 初始化邮件发送器
     * @param smtpHostName SMTP邮件服务器地址
     * @param username 发送邮件的用户名(邮箱地址)
     * @param password 发送邮件的密码
     * 
     */
    public MailSender(final String smtpHostName, final String username, final String password) {
    	init(username, password, smtpHostName);
    }
 
    /**
     * 初始化邮件发送器
     * @param username 发送邮件的用户名(邮箱地址),并以此解析SMTP服务器地址
     * @param password 发送邮件的密码
     * 
     */
    public MailSender(String username, final String password) {
    	
	    //通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
	    String smtpHostName = "smtp." + username.split("@")[1];    
	    System.out.println("SMTP: " + smtpHostName);
	    System.out.println("Username: " + username);
	    System.out.println("Password: " + password);
	    init(username, password, smtpHostName);
	    
    }
 
    /**
     * 初始化
     * @param username 发送邮件的用户名(邮箱地址)
     * @param password 密码
     * @param smtpHostName SMTP主机地址
     */
    private void init(String username, String password, String smtpHostName) {
    	
    	Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        // Get a Properties object
        Properties props = new Properties();
        props.setProperty("mail.smtp.host",smtpHostName); //服务器地址
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.auth", "true");
        
        authenticator = new MailAuthenticator(username, password); //验证
		session = Session.getInstance(props, authenticator); //创建session
	    
    }
 
    /**
     * 发送邮件
     * @param recipient 收件人邮箱地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * 
     */
    public void send(String recipient, String subject, Object content) throws Exception {
    	
	    final MimeMessage message = new MimeMessage(session); //创建mime类型邮件
	    message.setFrom(new InternetAddress(authenticator.getUsername())); //设置发信人
	    message.setRecipient(RecipientType.TO, new InternetAddress(recipient)); //设置收件人
	    message.setSubject(subject); //设置主题
	    message.setContent(content.toString(), "text/html;charset=utf-8"); //设置邮件内容
	    Transport.send(message); //发送
	    
    }
 
    /**
     * 群发邮件
     * 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
     * @param recipients 收件人地址队列
     * @param subject 主题
     * @param content 内容
     * 
     */
    public void send(List<String> recipients, String subject, Object content) throws Exception {
    	    //初始化props
	    /*smtp 25端口开发代码props.put("mail.smtp.auth", "true");
	    props.put("mail.smtp.host", smtpHostName);
	    authenticator = new MailAuthenticator(username, password); //验证
	    session = Session.getInstance(props, authenticator); *///创建session                                                                  //ssl协议开发(阿里云)
	    final MimeMessage message = new MimeMessage(session); //创建mime类型邮件
	    message.setFrom(new InternetAddress(authenticator.getUsername())); //设置发信人
	    final int count = recipients.size(); //设置收件人们
	    InternetAddress[] addresses = new InternetAddress[count];
	    for (int i = 0; i < count; 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); //发送
	    
    }
 
    /**
     * 发送邮件
     * @param recipient 收件人邮箱地址
     * @param mail 邮件对象
     * 
     */
    public void send(String recipient, MailInfo mail) throws Exception {
    	send(recipient, mail.getSubject(), mail.getContent());
    }
 
    /**
     * 群发邮件
     * 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
     * @param recipients 收件人地址队列
     * @param mail 邮件对象
     * 
     */
    public void send(List<String> recipients, MailInfo mail) throws Exception {
    	send(recipients, mail.getSubject(), mail.getContent());
    }
 
}



读取配置文件工具类

/**
 * 读取配置文件(Properties)
 * 
 */
public class Resource {
	
	/**
	 * 读取指定Properties配置文件中的属性值
	 * 注意:配置文件需放置到src根目录
	 * @param fileName 文件名称
	 * @param key 键值
	 * 
	 */
	public static String getValue(String fileName, String key){

		if(!fileName.contains(".properties")){
			fileName += ".properties";
		}
		fileName = "/" + fileName;
		String value = "";
		Properties p = new Properties();  
        InputStream in = Resource.class.getResourceAsStream(fileName);
        try {
        	p.load(in);  
            value = p.getProperty(key);
    		in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return value;
		
	}
	
	/**
	 * 读取resource.properties配置文件中的属性值
	 * 该配置文件位于src根目录
	 * @param key 键值
	 * 
	 */
	public static String getValue(String key){

		String fileName = "/resource.properties"; 
		String value = "";
		Properties p = new Properties();  
        InputStream in = Resource.class.getResourceAsStream(fileName);
        try {
        	p.load(in);  
            value = p.getProperty(key);
    		in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return value;
		
	}
	
}



测试类

/**
 * 测试入口
 * @author 郭旭
 *
 */
public class Test {

	public static void main(String[] args) throws Exception {

		// 从配置文件中读取用户名、密码
		String username = Resource.getValue("username");
		String password = Resource.getValue("password");
		MailSender sender = MailSender.getSender(username, password); //获取邮件发送实例
		
		// 声明收件人、邮件标题、邮件内容
		String recipient = "XXX@qq.com";
		String subject = "测试邮件";
		StringBuffer content = new StringBuffer();
		content.append("系统邮件,请勿回复!").append("<br/>");
		content.append("<a href = 'www.baidu.com'>百度一下</a>。").append("<br/>");
		content.append("<table border=1>");
		content.append("<th>标题一</th><th>标题二</th><th>标题三</th>");
		content.append("<tr><td>1</td><td>2</td><td>3</td></tr>");
		content.append("<tr><td>4</td><td>5</td><td>6</td></tr>");
		content.append("<tr><td>7</td><td>8</td><td>9</td></tr>");
		content.append("</table>");
		
		sender.send(recipient, subject, content);
		
	}

}



代码结束