Java Mail 发送邮件 JMail 多人 解决乱码 带附件
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); } }
参考博客:http://magician8421.iteye.com/blog/702017