zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    数字证书原理,公钥私钥加密原理
    Ubuntu 文件文件夹查看权限和设置权限
    Python glob使用
    python split(),os.path.split()和os.path.splitext()函数用法
    python sys.argv[]用法
    python将图片转base64,前端显示
    log4j简单使用
    Log4j简介
    ibatis/mybatis显示sql语句 log4j.properties配置文件
    mybatis WARN No appenders could be found for logger的解决方法
  • 原文地址:https://www.cnblogs.com/zhaoyhBlog/p/6249798.html
Copyright © 2011-2022 走看看