为什么使用465端口呢:
因为阿里云服务器以安全为由将25端口给封了,无法使用25号端口发送邮件,所以只有使用465端口啦。
实现java发送邮件的过程大体有以下几步:
1. 准备一个properties文件,该文件用于存放SMTP服务器地址等参数。
2. 利用properties创建一个Session对象
3. 利用Session创建Message对象,然后设置邮件主题,收件人及正文等信息
如果发送文本邮件,使用message.setText(content)。
如果发送html邮件,使用message.setContent(content, "text/html;charset=utf-8")。
如果发送带附件的邮件,使用message.setContent(multipart)。
multipart对象是一个用于装附件的容器。
multipart.addBodyPart(bodyPart)将附件装入multipart容器。
bodyPart是一个附件对象。
bodyPart.setDataHandler(new DataHandler(new FileDataSource("文件路径")));将文件包装成附件。
4. 利用Transport对象发送邮件
准备条件
1.两个jar包,网上到处都是随便下载。
下面两个网站有大量的jar包
http://maven.ibiblio.org/maven/
2.如果可以,就准备一个配置文件,但不准备也行,至于为什么,看代码就知道了。
以下是使用465端口发送文本邮件和带有附件的邮件的例子。
package com.wenba1314.tools;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class EmailTool {
//创建pro用于保存所需的数据
public static Properties pro;
static {
pro = new Properties();
try {
/*加载配置文件,配置文件需要有
from字段用于保存发件人账号
password为代理密码
注意此密码并非邮箱账户密码,而是开启客户端代理时设置的密码
*/
pro.load(EmailTool.class.getClassLoader().getResourceAsStream("email.properties"));
} catch (Exception e) {
System.out.println("配置文件未找到,使用默认的账户发送!");
pro.setProperty("from", "********@163.com");
pro.setProperty("password", "********");
}
pro.setProperty("mail.smtp.ssl.enable", "true");
pro.setProperty("mail.smtp.host", "smtp.163.com");
pro.setProperty("mail.smtp.port", "465");
pro.setProperty("mail.smtp.auth", "true");
pro.setProperty("mail.debug","true");
}
public static void main(String[] args) {
System.out.println(pro);
sendTextMessage("********@qq.com","你是猪变得么","猪啊");
sendEmailWithAttachments("********@qq.com","c:\\Users\\pc\\Desktop\\a.jpg","猪啊");
}
//发送普通的文本文件,一般用于网站向用户发送验证码。第一个参数为收件人地址,第二个参数为文本信息,第三个参数为邮件主题
public static void sendTextMessage(String toEmailAddress, String content, String subject) {
//创建session对象,第一个参数为连接邮件服务器的连接信息,第二个为身份验证的接口,重写抽象方法,参数为登陆邮件服务器的代理账号密码。
Session session = Session.getDefaultInstance(pro, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(pro.getProperty("from"), pro.getProperty("password"));
}
});
try {
//创建消息对象
MimeMessage message = new MimeMessage(session);
//设置发件人
message.setFrom(new InternetAddress(pro.getProperty("from")));
//设置收件人
message.addRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress(toEmailAddress)});
//设置文本主题
message.setSubject(subject);
//设置文本内容
message.setText(content);
//使用静态方法发送邮件,此静态方法包装了保存内容,连接服务器等方法。
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
//发送带附件的邮件,第一个参数为收件人地址,第二个参数为附件路径,第三个参数为邮件主题
public static void sendEmailWithAttachments(String toEmailAddress,String NameOfTheAttachment ,String subject) {
//创建session对象,第一个参数为连接邮件服务器的连接信息,第二个为身份验证的接口,重写抽象方法,参数为登陆邮件服务器的代理账号密码。
Session session = Session.getDefaultInstance(pro, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(pro.getProperty("from"), pro.getProperty("password"));
}
});
try {
//创建消息对象
MimeMessage message = new MimeMessage(session);
//设置发件人
message.setFrom(new InternetAddress(pro.getProperty("from")));
//设置收件人
message.addRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress(toEmailAddress)});
//设置文本主题
message.setSubject(subject);
// 添加附件
/*创建multipart对象,
*并向其中添加邮件的各个部分内容,包括文本内容和附件,
* 然后将此对象放入MimeMessage对象中,使用message.setContent(multipart);
* */
Multipart multipart = new MimeMultipart();
if (NameOfTheAttachment != null && !"".equals(NameOfTheAttachment)) {
// 根据路径获取文件
FileDataSource dataSource = new FileDataSource(NameOfTheAttachment);
//创建附件对象
BodyPart bodyPart = new MimeBodyPart();
//设置附件内容
bodyPart.setDataHandler(new DataHandler(dataSource));
//设置附件名
//MimeUtility.encodeWord可以避免文件名乱码
bodyPart.setFileName(MimeUtility.encodeWord(dataSource.getFile().getName()));
//将附件放入multipart中
multipart.addBodyPart(bodyPart );
}
// 将multipart放入message中
message.setContent(multipart);
//使用静态方法发送邮件,此静态方法包装了保存内容,连接服务器等方法。
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}