使用JavaMail发送邮件

注意:阿里云关闭25号端口,所以,本地测试成功,到服务器上却失败!!

今天做的项目有个地方需要用到JavaMail,需要发送纯文本邮件,用起来比较简单,只是不同的邮件服务器可能会遇到许多不同的问题。

一开始自己测试使用的是163邮箱,非常顺畅,下面贴出我的代码,要用的直接可以复制粘贴,改改邮件服务器,账号密码就能用。

package com.hbbc.test;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Sendmail {
	
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		Properties prop = new Properties();
		// 设置邮件服务器
		prop.setProperty("mail.host", "邮件服务器地址");
		// 设置邮件传输协议
		prop.setProperty("mail.transport.protocol", "smtp");
		// 设置进行身份验证
		prop.setProperty("mail.smtp.auth", "true");
		// 使用JavaMail发送邮件的5个步骤
		// 1、创建session
		Session session = Session.getInstance(prop);
		// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
		session.setDebug(true);
		// 2、通过session得到transport对象
		Transport ts = session.getTransport();
		// 3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
		ts.connect("邮件服务器地址", "账号", "密码");
		// 4、创建邮件
		Message message = createSimpleMail(session);
		// 5、发送邮件
		ts.sendMessage(message, message.getAllRecipients());
		ts.close();
	}

	/**
	 * @Method: createSimpleMail
	 * @Description: 创建一封只包含文本的邮件
	 * @param session
	 * @return
	 * @throws Exception
	 */
	public static MimeMessage createSimpleMail(Session session)
			throws Exception {
		// 创建邮件对象
		MimeMessage message = new MimeMessage(session);
		// 指明邮件的发件人
		message.setFrom(new InternetAddress("发件人"));
		// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
		message.setRecipient(Message.RecipientType.TO, new InternetAddress(
				"收件人"));
		// 邮件的标题
		message.setSubject("邮件标题");
		// 邮件的文本内容
		message.setContent("邮件内容", "text/html;charset=UTF-8");
		// 返回创建好的邮件对象
		return message;
	}
}

在发送邮件时,可能会遇到被163认为是垃圾邮件的时候,简单的解决办法就是给自己抄送一份。
报错信息:

com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp11,D8CowACnIsnYuENXzwhNBw--.59036S2 1464056024,please see http://mail.163.com/help/help_spam_16.htm?ip=121.34.169.53&hostid=smtp11&time=1464056024

解决办法
添加抄送人:

message.setRecipient(Message.RecipientType.CC, new InternetAddress("抄送人"));

Message.RecipientType.CC 抄送人
Message.RecipientType.TO 收件人
Message.RecipientType.BCC 暗抄送人

完整方法如下:

public static MimeMessage createSimpleMail(Session session)
			throws Exception {
		// 创建邮件对象
		MimeMessage message = new MimeMessage(session);
		// 指明邮件的发件人
		message.setFrom(new InternetAddress("发件人"));
		// 指明邮件的抄送人
		message.setRecipient(Message.RecipientType.CC, new InternetAddress(
				"抄送人"));
		// 指明邮件的收件人
		message.setRecipient(Message.RecipientType.TO, new InternetAddress(
				"收件人"));
		// 邮件的标题
		message.setSubject("邮件标题");
		// 邮件的文本内容
		message.setContent("邮件内容", "text/html;charset=UTF-8");
		// 返回创建好的邮件对象
		return message;
	}

后来要客户提供发件邮箱,他给了个outlook的邮箱,本以为修改下邮件服务器地址,账号密码就行,没想到遇到问题,不允许客户端匿名发送邮件。
报错代码如下:

530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [HK0PR03CA0009.apcprd03.prod.outlook.com]
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [HK0PR03CA0009.apcprd03.prod.outlook.com]

	at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
	at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)
	at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
	at com.hbbc.test.Sendmail.main(Sendmail.java:38)

后来找到解决办法,添加如下代码即可

// 如果为真,则允许使用STARTTLS命令(如果服务器支持)在发出任何登录命令之前将连接切换到受tls保护的连接。注意,必须配置适当的信任存储,以便客户机信任服务器的证书。默认值为false。
		prop.setProperty("mail.smtp.starttls.enable", "true");

你可能感兴趣的:(Java技术)