package net.guoguoda.admin.common.utils;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
public class SendMail {
/*
* POP3/SMTP协议
* 收发邮件服务器地址分别如下。
* 接收邮件服务器:pop.exmail.qq.com (端口 110)
* 发送邮件服务器:smtp.exmail.qq.com (端口 25)
* 同时支持SSL加密方式登录,此时需要更改一下端口号。
* 接收服务器端口:995
* 发送服务器端口:465
* IMAP协议
* 接收邮件服务器:imap.exmail.qq.com
* 如果使用SSL加密方式,接收服务器端口是: 993
*/
private final static String HOST = "smtp.exmail.qq.com";
private final static String SENDTYPE = "smtp";
public static void sendTxtMail(String from,String password,String to,File file){
/*
* SMTP 的全称是“Simple Mail Transfer Protocol
* 即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。
* SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
* SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
* SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
* 增加 SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰
*/
/*
* IMAP全称是Internet Mail Access Protocol,
* 即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。
* 不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,
* 如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。
* 所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
*/
//设置邮件参数
Properties props = new Properties();
props.setProperty("mail.transport.protocol", SENDTYPE);//邮件传输协议方式
props.put("mail.smtp.host", HOST);//腾讯smtp服务器地址
props.put("mail.smtp.auth", true);//是否需要smtp验证
/*
* 此处需要集成Authenticator类,重写getPasswordAuthentication方法
*/
MailAuthenticator myauth = new MailAuthenticator(from,password);//验证账户和密码
Session session = Session.getInstance(props,myauth);
session.setDebug(true);//打开debug模式,会打印发送细节到console
/*
* message是邮件的载体,一封完整的邮件包括:
* 发件人,接收人,发送方式(TO - 收件人;CC - 抄送人;BCC - 暗送人),标题(subject),内容(content)
*
*/
Message message =new MimeMessage(session);
try{
//设置邮件标题
message.setSubject("配送表发送");
//设置邮件发送人
message.setFrom(new InternetAddress(from));
//设置邮件收件人
InternetAddress target = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO,target);
/*
* Message表示一个邮件,messgaes.getContent()返回一个Multipart对象
* 一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)
* Multipart是一个容器它转载多个body Part(正文、附件或内嵌资源)
*/
Multipart multipart = new MimeMultipart();
BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("","text/html;charset=utf8");
multipart.addBodyPart(bodyPart);
/*
* 添加附件
*/
bodyPart = new MimeBodyPart();
DataSource dataSource = new FileDataSource(file.getAbsolutePath());
DataHandler dataHandler = new DataHandler(dataSource);
bodyPart.setDataHandler(dataHandler);
/*
* 邮件头(参见RFC822,RFC2047)只能包含US-ASCII字符。邮件头中任何包含非US-ASCII字符的部分必须进行编码,使其只包含US-ASCII字符。
* 所以使用java mail发送中文邮件必须经过编码,否则别人收到你的邮件只能是乱码一堆。
* 不过使用java mail 包的解决方法很简单,用它自带的MimeUtility工具中encode开头的方法(如encodeText)对中文信息进行编码就可以了。
* 通常对邮件头的编码方式有2种,一种是base64方式编码,一种是QP(quoted-printable)方式编码,javamail根据具体情况来选择编码方式。
*/
String name = MimeUtility.encodeText(file.getName(),"gb2312","B");
bodyPart.setFileName(name);
multipart.addBodyPart(bodyPart);
message.setContent(multipart);
//方式一
// Transport transport = session.getTransport(SENDTYPE);
// transport.connect("smtp.exmail.qq.com",25,from, password);
// transport.sendMessage(message, message.getAllRecipients());
// transport.close();
//方式二
Transport.send(message);
}catch(MessagingException e){
System.out.println(e.getMessage());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static void sendTxtMail(String from,String password,String to)
{
Properties props = new Properties();
props.put("mail.smtp.host", HOST); //smtp服务器地址
props.setProperty("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", false); //是否需要认证
/**实例化一个验证里,继承abstract Authenticator
* 实现
* protected PasswordAuthentication getPasswordAuthentication(){
* return new PasswordAuthentication(userName,password);
* }
*/
// MailAuthenticator myauth = new MailAuthenticator("admin@guoguoda.net","zaq12wsx~");
//获得一个带有authenticator的session实例
Session session = Session.getInstance(props);
session.setDebug(true);//打开debug模式,会打印发送细节到console
Message message = new MimeMessage(session); //实例化一个MimeMessage集成自abstract Message 。参数为session
try
{
message.setFrom(new InternetAddress(from)); //设置发出方,使用setXXX设置单用户,使用addXXX添加InternetAddress[]
message.setText("只是一个简简单单的文本内容哟!"); //设置文本内容 单一文本使用setText,Multipart复杂对象使用setContent
message.setSubject("只是简简单单的文本标题哟!"); //设置标题
message.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); //设置接收方
Transport transport = session.getTransport(SENDTYPE);
transport.connect(HOST,25,from, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}catch(AddressException e)
{
//此处处理AddressException异常 [The exception thrown when a wrongly formatted address is encountered.]
System.out.println(e.getMessage());
}catch(MessagingException e){
System.out.println(e.getMessage());
//此处处理MessagingException异常 [The base class for all exceptions thrown by the Messaging classes ]
}catch(RuntimeException e){
System.out.println(e.getMessage());
}
}
public static void main(String[] args){
File file = new File("文件路径");
SendMail.sendTxtMail("发件人邮箱","发件人邮箱密码","收件人邮箱",file);
}
}