使用Java应用程序发送E-mail十分简单,但是需要依赖jar包。
安装JavaMail API,使用其中的mail.jar;
安装Java Activation Framework(JAF)中的activation.jar。
(详细内容请参考:菜鸟教程——Java 发送邮件)
一个Java代码示例:
这个示例代码中,构造方法需要传入服务器、端口、账号、密码、发送者显示的名称。 可以支持一次发送多人、添加多个附件、支持各种内容格式。
包含一个内部类,用于账号密码认证。
package com.ebtrust.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/**
* java send mail demo
*
*/
public class MailUtil {
String smtp, smtp_port, servername, serverpaswd, personal;
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
/**
* 构造方法
* @param smtp 发送服务器
* @param smtp_port 端口号
* @param servername 发送者账号
* @param serverpaswd 发送者密码
* @param personal 发件人名称显示
*/
public MailUtil(String smtp, String smtp_port,String servername, String serverpaswd, String personal){
this.smtp = smtp;
this.smtp_port = smtp_port;
this.servername = servername;
this.serverpaswd = serverpaswd;
this.personal = personal;
}
public void sendMail(String subject, String email, String content){
this.sendMail(subject, servername, new String[]{email}, content, new String[0], "text/html;charset=gb2312");
}
/**
* send mail
* @param subject 邮件主题
* @param from 邮件发送来源方
* @param to 邮件发送目标方,可以为多个
* @param text 邮件内容
* @param filenames 附件名称数组 每个元素的格式为 d:\a.doc;b.doc , 其中<span style="font-family: Arial, Helvetica, sans-serif;">d:\a.doc为本身文件路径, b.doc为附件中显示的名字</span>;
* @param mimeType 文件格式
*/
private void sendMail(String subject, String from, String[] to, String text, String[] filenames, String mimeType) {
try {
//邮件发送者必须与账号相同
from = servername; // 邮件发送者
Properties props = new Properties();
javax.mail.Session mailSession = null; // 邮件会话对象
javax.mail.internet.MimeMessage mimeMsg = null; // MIME邮件对象
props = java.lang.System.getProperties(); // 获得系统属性对象
props.put("mail.smtp.host", smtp); // 设置SMTP主机
//以下三行设置ssl连接。目前测试过qq企业邮箱、qq邮箱和163邮箱,只有qq企业邮箱需要设置SSL连接
if (smtp.equals("smtp.exmail.qq.com")) {
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtp_port);
}
props.setProperty("mail.smtp.port", smtp_port);
props.put("mail.smtp.auth", "true"); // 是否到服务器用户名和密码验证
// 到服务器验证发送的用户名和密码是否正确
SmtpAuthenticator myEmailAuther = new SmtpAuthenticator(servername, serverpaswd);
// 设置邮件会话 注意这里将认证信息放进了Session的创建参数里
mailSession = javax.mail.Session.getInstance(props,
(Authenticator) myEmailAuther);
// 设置传输协议
javax.mail.Transport transport = mailSession.getTransport("smtp");
// 设置from、to等信息
mimeMsg = new javax.mail.internet.MimeMessage(mailSession);
if (null != from && !"".equals(from)) {
InternetAddress sentFrom = new InternetAddress(from);
sentFrom.setPersonal(personal);
mimeMsg.setFrom(sentFrom); // 设置发送人地址
}
InternetAddress[] sendTo = new InternetAddress[to.length];
for (int i = 0; i < to.length; i++) {
System.out.println("发送到:" + to[i]);
sendTo[i] = new InternetAddress(to[i]);
}
mimeMsg.setRecipients(
javax.mail.internet.MimeMessage.RecipientType.TO, sendTo);
mimeMsg.setSubject(subject, "gb2312");
MimeBodyPart messageBodyPart1 = new MimeBodyPart();
// messageBodyPart.setText(UnicodeToChinese(text));
messageBodyPart1.setContent(text, mimeType);
// 附件传输格式
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart1);
for (int i = 0; i < filenames.length; i++) {
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
String filename = filenames[i].split(";")[0];
String displayname = filenames[i].split(";")[1];
// 得到数据源
FileDataSource fds = new FileDataSource(filename);
// BodyPart添加附件本身
messageBodyPart2.setDataHandler(new DataHandler(fds));
// BodyPart添加附件文件名
messageBodyPart2.setFileName(MimeUtility
.encodeText(displayname));
multipart.addBodyPart(messageBodyPart2);
}
mimeMsg.setContent(multipart);
// 设置信件头的发送日期
mimeMsg.setSentDate(new Date());
mimeMsg.saveChanges();
// 发送邮件
Transport.send(mimeMsg);
transport.close();
System.out.println("发送到成功!!!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String title = "title";// 所发送邮件的标题
String from = "xxx@qq.com";// 从那里发送
String sendTo[] = { "xxx@163.com" };// 发送到那里
// 邮件的文本内容,可以包含html标记则显示为html页面
String content = "test java send mail !!!!!!<br><a href=\"http://sjsky.javaeye.com/\">My blog</a>";
// 所包含的附件,及附件的重新命名
String fileNames[] = {"/Users/penie_shen/Desktop/1.png;test.png"};
//MailUtil test = new MailUtil("smtp.qq.com", "465", "xxx@qq.com", "wdliwltgllaedecf", "你的好朋友");
MailUtil test = new MailUtil();
try {
// MailSender mailsender = new MailSender();
test.sendMail(title, test.servername, sendTo, content, fileNames,
"text/html;charset=gb2312");
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Smtp认证
*/
class SmtpAuthenticator extends Authenticator {
String username = null;
String password = null;
/**
* SMTP身份验证
* @param username
* @param password
*/
public SmtpAuthenticator(String username, String password) {
super();
this.username = username;
this.password = password;
}
/**
* @return pass
*/
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username, this.password);
}
}
}
笔者试着用过腾讯企业邮箱、腾讯qq邮箱、网易163邮箱,注意点说明如下:
首先,记得到邮箱内开启相关服务。
其次,相关设置内容如下:
- 腾讯企业邮箱:smtp服务器:smtp.exmail.qq.com;端口:465;
- 腾讯qq邮箱:smtp服务器:smtp.qq.com;端口:465;密码非邮箱登录密码,而是获取到的授权码:为16位随机字母;
- 网易163邮箱:smtp服务器:smtp.qq.com; 端口:25(25为大多数邮箱服务器smtp服务默认端口),密码非邮箱登录密码,而是另外设置的授权码。
腾讯企业邮箱中开启了SSL验证,而qq和163邮箱没有开启,所以在代码中,设置如下:
//以下三行设置ssl连接。目前测试过qq企业邮箱、qq邮箱和163邮箱,只有qq企业邮箱需要设置SSL连接
if (smtp.equals("smtp.exmail.qq.com")) {
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtp_port);
}