java中使用javamail发送邮件

Posted 街头浪子kevin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中使用javamail发送邮件相关的知识,希望对你有一定的参考价值。

1. 电子邮件协议

  电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。
  其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

2. JavaMail

  Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,可以去 Java 或 Oracle 官网下载。

  下载地址:
  https://java.net/projects/javamail/pages/Home 或者 http://www.oracle.com/technetwork/java/javamail/index.html

  我自己使用的jar包下载地址

三、发送邮件的前提
  发送邮件首先需要有一个邮箱账号和密码(如果设置了客户端授权密码,此处的密码为客户端授权密码),并且邮箱账号必须要开启 SMTP 服务。
  以163邮箱为例,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,:
    
四. 创建并发送电子邮件

  邮件创建步骤:

    创建一个邮件对象(MimeMessage);
    设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
    设置邮件的主题(标题);
    设置邮件的正文(内容,附件);
    设置显示的发送时间;
    保存到本地。

 

  1 import java.io.File;
  2 import java.io.FileOutputStream;
  3 import java.io.OutputStream;
  4 import java.util.ArrayList;
  5 import java.util.Date;
  6 import java.util.List;
  7 import java.util.Properties;
  8 
  9 import javax.activation.DataHandler;
 10 import javax.activation.FileDataSource;
 11 import javax.mail.BodyPart;
 12 import javax.mail.Message;
 13 import javax.mail.Multipart;
 14 import javax.mail.Session;
 15 import javax.mail.Transport;
 16 import javax.mail.internet.InternetAddress;
 17 import javax.mail.internet.MimeBodyPart;
 18 import javax.mail.internet.MimeMessage;
 19 import javax.mail.internet.MimeMultipart;
 20 
 21 import org.apache.commons.lang.StringUtils;
 22 
 23 public class SendEmailUtil {
 24     /**
 25      * 发送邮件的方法
 26      * 
 27      * @param serverAddress
 28      *            服务器地址
 29      * @param user
 30      *            服务器用户名
 31      * @param pwd
 32      *            服务器密码
 33      * @param from
 34      *            发送人
 35      * @param subject
 36      *            标题
 37      * @param emailReceiver
 38      *            接收人
 39      * @param htmlContents
 40      *            发送内容
 41      * @param ucode
 42      *            编码格式
 43      * @param fileName
 44      *            附件名称
 45      * @throws java.lang.Exception
 46      */
 47     public boolean sendEmail(String serverAddress, String user, String pwd,
 48             String from, String subject, List emailReceiver,
 49             String htmlContents, String ucode, String fileName) {
 50         boolean flag = false;
 51         htmlContents = htmlContents+ "       (此邮件为自动发送,请勿回复)";
 52         try {
 53             // 创建Properties对象
 54             Properties props = System.getProperties();
 55             // 创建信件服务器
 56             props.put("mail.smtp.auth", "true");
 57             // 得到默认的对话对象
 58             Session session = Session.getDefaultInstance(props, null);
 59             // 创建一个消息,并初始化该消息的各项元素
 60             Message message = new MimeMessage(session);
 61             message.setFrom(new InternetAddress(from));
 62             // 编码方式
 63             if (ucode.indexOf("GBK") != -1) {
 64                 String tempFrom = new String(from.getBytes("GBK"), "UTF-8");
 65                 message.setFrom(new InternetAddress(tempFrom));
 66             }
 67             // 准备收件人地址
 68             InternetAddress[] address = new InternetAddress[emailReceiver.size()];
 69             for (int i = 0; i < address.length; i++) {
 70                 address[i] = new InternetAddress((String) emailReceiver.get(i));
 71             }
 72             System.out.println(address[0]);
 73             message.setRecipients(Message.RecipientType.TO, address);
 74             /*// Cc: 抄送(可选)
 75             message.setRecipient(MimeMessage.RecipientType.CC,
 76                     new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
 77             // Bcc: 密送(可选)
 78             message.setRecipient(MimeMessage.RecipientType.BCC,
 79                     new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));*/
 80 
 81             // 邮件主题
 82             message.setSubject(subject);
 83             System.out.println(message.getSubject());
 84             // 设置内容
 85             BodyPart bp = new MimeBodyPart();
 86             bp.setContent(htmlContents, ucode);
 87             // 后面的BodyPart将加入到此处创建的Multipart中
 88             Multipart mp = new MimeMultipart();
 89             mp.addBodyPart(bp);
 90             // 保存附件
 91             addFileAffix(mp, fileName);
 92             // Multipart加入到信件
 93             message.setContent(mp);
 94             System.out.println(message.getContent());
 95             // 设置信件头的发送日期
 96             message.setSentDate(new Date());
 97             System.out.println(message.getSentDate());
 98             //保存对message设置
 99             message.saveChanges();
100             
101             //保存邮件到本地
102             OutputStream out = new FileOutputStream("MyEmail.eml");
103             message.writeTo(out);
104             out.flush();
105             out.close();
106             // 发送信件
107             Transport trans = session.getTransport("smtp");
108             trans.connect(serverAddress, user, pwd);
109             trans.sendMessage(message, message.getAllRecipients());
110             trans.close();
111             flag = true;
112         } catch (Exception e) {
113             System.out.println("error:邮件服务器连接错误!");
114             e.printStackTrace();
115         } finally {
116             // 删除临时文件
117             if (StringUtils.isNotBlank(fileName)){}
118                 deleteFile(fileName);
119         }
120         return flag;
121     }
122 
123     /**
124      * 发送附件
125      * 
126      * @param mp
127      *            邮件信息
128      * @param fileName
129      *            附件全路径(包括文件名称)
130      * @return
131      */
132     public boolean addFileAffix(Multipart mp, String fileName) {
133         try {
134             String newName = "";
135             newName = fileName.substring(fileName.lastIndexOf(File.separator) + 1,
136                             fileName.length());
137             if (StringUtils.isEmpty(fileName))
138                 return false;
139             BodyPart bp = new MimeBodyPart();
140 
141             FileDataSource fileds = new FileDataSource(fileName);
142 
143             bp.setDataHandler(new DataHandler(fileds));
144             // bp.setFileName("=?GBK?B?"+ enc.encode(fileName.getBytes()) + "?=");
145             bp.setFileName(newName);
146             mp.addBodyPart(bp);
147 
148             return true;
149 
150         } catch (Exception e) {
151 
152             return false;
153 
154         }
155     }
156 
157     /**
158      * 删除文件
159      * 
160      * @param fileName
161      */
162     public void deleteFile(String fileName) {
163         if (StringUtils.isEmpty(fileName))
164             return;
165         File file = new File(fileName);
166         if (file.isFile()) {
167             file.delete();
168         }
169     }
170     
171     public static void main(String[] args) {
172         SendEmailUtil sendEmail = new SendEmailUtil();
173         List receiverList = new ArrayList<String>();
174         receiverList.add("yyy@qq.com");
175         receiverList.add("zzz@qq.com");
176         sendEmail.sendEmail("smtp.163.com", "xxx@163.com", "xxx", "xxx@163.com", "测试邮件", 
177                 receiverList, "这是一封测试邮件", "GBK", "C:/222.rar");
178     }
179 }
View Code

 

以上是关于java中使用javamail发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

java中使用javamail发送邮件

javamail电子邮件不发送

Java编程系列使用JavaMail通过SMTP协议发送局域网(内网)邮件

基于JavaMail的Java邮件发送:简单邮件发送

javamail接收邮件报错

java-基于JavaMail的Java邮件发送