java实现163邮箱发送邮件到qq邮箱成功案例

 更新时间:2016年05月19日 21:52:48   作者:Past_Future  
这篇文章主要为大家分享了java实现163邮箱发送邮件到qq邮箱成功案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

下载和上传附件、发送短信和发送邮件,都算是程序中很常用的功能,之前记录了文件的上传和下载还有发送短信,由于最近比较忙,邮件发送的功能就没有时间去弄,现在终于成功以163邮箱发送邮件到qq邮箱,以下是相关代码,具体解释可以参考代码中注释: 

package test; 
 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import java.util.Properties; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import javax.mail.Address; 
import javax.mail.Authenticator; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
import com.sun.mail.util.MailSSLSocketFactory; 
 
///** 
// * 
// * @author tuzongxun123 
// * @Description 邮件发送测试类 
// */ 
public class sendMailTest { 
 public static void main(String[] args) throws Exception { 
 // 配置信息 
 Properties pro = new Properties(); 
 pro.put("mail.smtp.host", "smtp.163.com"); 
 pro.put("mail.smtp.auth", "true"); 
 // SSL加密 
 MailSSLSocketFactory sf = null; 
 sf = new MailSSLSocketFactory(); 
 // 设置信任所有的主机 
 sf.setTrustAllHosts(true); 
 pro.put("mail.smtp.ssl.enable", "true"); 
 pro.put("mail.smtp.ssl.socketFactory", sf); 
 // 根据邮件的会话属性构造一个发送邮件的Session,这里需要注意的是用户名那里不能加后缀,否则便不是用户名了 
 //还需要注意的是,这里的密码不是正常使用邮箱的登陆密码,而是客户端生成的另一个专门的授权码 
 MailAuthenticator authenticator = new MailAuthenticator("tuzongxun123", 
  "客户端授权码"); 
 Session session = Session.getInstance(pro, authenticator); 
 // 根据Session 构建邮件信息 
 Message message = new MimeMessage(session); 
 // 创建邮件发送者地址 
 Address from = new InternetAddress("tuzongxun123@163.com"); 
 // 设置邮件消息的发送者 
 message.setFrom(from); 
 // 验证收件人邮箱地址 
 List<String> toAddressList = new ArrayList<>(); 
 toAddressList.add("1160569243@qq.com"); 
 StringBuffer buffer = new StringBuffer(); 
 if (!toAddressList.isEmpty()) { 
  String regEx = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; 
  Pattern p = Pattern.compile(regEx); 
  for (int i = 0; i < toAddressList.size(); i++) { 
  Matcher match = p.matcher(toAddressList.get(i)); 
  if (match.matches()) { 
   buffer.append(toAddressList.get(i)); 
   if (i < toAddressList.size() - 1) { 
   buffer.append(","); 
   } 
  } 
  } 
 } 
 String toAddress = buffer.toString(); 
 if (!toAddress.isEmpty()) { 
  // 创建邮件的接收者地址 
  Address[] to = InternetAddress.parse(toAddress); 
  // 设置邮件接收人地址 
  message.setRecipients(Message.RecipientType.TO, to); 
  // 邮件主题 
  // message.setSubject("java邮件测试"); 
  message.setSubject("为什么错了"); 
  // 邮件容器 
  MimeMultipart mimeMultiPart = new MimeMultipart(); 
  // 设置HTML 
  BodyPart bodyPart = new MimeBodyPart(); 
  // 邮件内容 
  // String htmlText = "java邮件测试111"; 
  String htmlText = "为什么错了"; 
  bodyPart.setContent(htmlText, "text/html;charset=utf-8"); 
  mimeMultiPart.addBodyPart(bodyPart); 
  // 添加附件 
  List<String> fileAddressList = new ArrayList<String>(); 
  fileAddressList 
   .add("C:\\Users\\tuzongxun123\\Desktop\\新建 Microsoft Office Word 文档.docx"); 
  if (fileAddressList != null) { 
  BodyPart attchPart = null; 
  for (int i = 0; i < fileAddressList.size(); i++) { 
   if (!fileAddressList.get(i).isEmpty()) { 
   attchPart = new MimeBodyPart(); 
   // 附件数据源 
   DataSource source = new FileDataSource( 
    fileAddressList.get(i)); 
   // 将附件数据源添加到邮件体 
   attchPart.setDataHandler(new DataHandler(source)); 
   // 设置附件名称为原文件名 
   attchPart.setFileName(MimeUtility.encodeText(source 
    .getName())); 
   mimeMultiPart.addBodyPart(attchPart); 
   } 
  } 
  } 
  message.setContent(mimeMultiPart); 
  message.setSentDate(new Date()); 
  // 保存邮件 
  message.saveChanges(); 
  // 发送邮件 
  Transport.send(message); 
 } 
 } 
} 
 
class MailAuthenticator extends Authenticator { 
 
 /** 
 * 用户名 
 */ 
 private String username; 
 /** 
 * 密码 
 */ 
 private String password; 
 
 /** 
 * 创建一个新的实例 MailAuthenticator. 
 * 
 * @param username 
 * @param password 
 */ 
 public MailAuthenticator(String username, String password) { 
 this.username = username; 
 this.password = password; 
 } 
 
 public String getPassword() { 
 return password; 
 } 
 
 @Override 
 protected PasswordAuthentication getPasswordAuthentication() { 
 return new PasswordAuthentication(username, password); 
 } 
 
 public String getUsername() { 
 return username; 
 } 
 
 public void setPassword(String password) { 
 this.password = password; 
 } 
 
 public void setUsername(String username) { 
 this.username = username; 
 } 
 
} 

注:我有个同事使用我这个代码更换为他的账号和客户端授权码后,一运行就报错,然后重置了一下邮箱的客户端授权码后,错误便消失了。

以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。

相关文章

  • 解决SpringBoot整合RocketMQ遇到的坑

    解决SpringBoot整合RocketMQ遇到的坑

    这篇文章主要介绍了解决SpringBoot整合RocketMQ遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java实现warcraft java版游戏的示例代码

    Java实现warcraft java版游戏的示例代码

    致敬经典的warcraft,《warcraft java版》是一款即时战略题材单机游戏,采用魔兽原味风格和机制。本文将用java语言实现,采用了swing技术进行了界面化处理,感兴趣的可以了解一下
    2022-09-09
  • Hadoop源码分析三启动及脚本剖析

    Hadoop源码分析三启动及脚本剖析

    本篇是Hadoop源码分析系列文章第三篇,主要介绍Hadoop启动以及脚本的剖析,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • Java深度优先遍历解决排列组合问题详解

    Java深度优先遍历解决排列组合问题详解

    这篇文章主要介绍了Java深度优先遍历解决排列组合问题详解,深度优先搜索是递归过程,带有回退操作,因此需要使用栈存储访问的路径信息,当访问到的当前顶点没有可以前进的邻接顶点时,需要进行出栈操作,将当前位置回退至出栈元素位置,需要的朋友可以参考下
    2024-01-01
  • Java日常练习题,每天进步一点点(58)

    Java日常练习题,每天进步一点点(58)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • SpringRetry重试机制之@Retryable注解与重试策略详解

    SpringRetry重试机制之@Retryable注解与重试策略详解

    本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健壮的应用程序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java并发编程之线程之间的共享和协作

    Java并发编程之线程之间的共享和协作

    这篇文章主要介绍了Java并发编程之线程之间的共享和协作,文中有非常详细的代码示例,对正在学习java的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-04-04
  • Java实现简单双色球摇奖功能过程解析

    Java实现简单双色球摇奖功能过程解析

    这篇文章主要介绍了Java实现简单双色球摇奖功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中Comparator与Comparable排序的区别详解

    Java中Comparator与Comparable排序的区别详解

    这篇文章主要介绍了Java中Comparator与Comparable排序的区别详解,如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable,如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,需要的朋友可以参考下
    2024-01-01
  • 用Java8 stream处理数据

    用Java8 stream处理数据

    这篇文章主要介绍了用Java8 stream处理数据,Java 8 API的设计者重新提出了一个新的抽象称为流Stream,可以让我们以一种声明的方式处理数据,此外,数据流可以充分利用多核架构而无需编写多线程的一行代码,下面我们一起来看看文章详细介绍
    2021-11-11

最新评论