1

需求

最近项目在做新闻爬虫,想实现这个功能:爬虫某个页面失败后,把这个页面的 url 发到笔者的邮箱。最终实现的效果图如下,后期可以加上过滤标签、失败状态码等,方便分类搜索异常。

开发人员可以根据邮件里的 url 和堆栈信息,分析爬虫失败的原因。

  • 是不是服务器 down 了?
  • 还是爬虫的 Dom 解析没有解析到内容?
  • 还是正则表达式对于这个页面不适用?

开启SMTP服务

在 QQ 邮箱里的 设置->账户里开启 SMTP 服务

注意开启完之后,QQ 邮箱会生成一个授权码,在代码里连接邮箱使用这个授权码而不是原始的邮箱密码,这样可以避免使用明文密码。

下载依赖的 jar 包

官方下载地址 http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.7-oth-JPR。
解压完之后,通常我们只需要其中的mail.jar,把它加到我们 java 工程的依赖包中。

代码

网上查了一下例子,根据这篇文章 Java Mail(二):JavaMail介绍及发送一封简单邮件 的示例代码。

Properties props = new Properties();// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.qq.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");Session session = Session.getInstance(props);//邮件内容部分
Message msg = new MimeMessage(session);
msg.setSubject("seenews 错误");
StringBuilder builder = new StringBuilder();
builder.append("url = " + "http://blog.csdn.net/never_cxb/article/details/50524571");
builder.append("页面爬虫错误");
builder.append("\n data " + TimeTool.getCurrentTime());
msg.setText(builder.toString());
//邮件发送者
msg.setFrom(new InternetAddress("**发送人的邮箱地址**"));//发送邮件
Transport transport = session.getTransport();
transport.connect("smtp.qq.com", "**发送人的邮箱地址**", "**你的邮箱密码或者授权码**");transport.sendMessage(msg, new Address[] { new InternetAddress("**接收人的邮箱地址**") });
transport.close();

但是报错了

DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN failed
Exception in thread "main" javax.mail.AuthenticationFailedException: 530
Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28

因为示例代码是用的163邮箱,而笔者是 QQ 邮箱,看 Log 分析是 QQ 邮箱需要 SSL 加密。

开启 SSL 加密

网上搜了一下,其他比如163、新浪邮箱不需要 SSL 加密,可以放弃 QQ 邮箱。

网上还有种说法,把 smtp.qq.com 换成 smtp.exmail.qq.com也不需要 SSL加密,但是笔者没有run成功。所以还是老老实实加上 SSL 加密吧。

下面的代码开启了 SSL 加密

MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);

成功了,控制台输出 Log 和效果图如下

DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 465, isSSL true
220 smtp.qq.com Esmtp QQ Mail Server
DEBUG SMTP: connected to host "smtp.qq.com", port: 465
...data 2016-01-19 17:00:44 Tue
.
250 Ok: queued as
QUIT
221 Bye

完整代码示例

public class MailTool {public static void main(String[] args) throws MessagingException, GeneralSecurityException {Properties props = new Properties();// 开启debug调试props.setProperty("mail.debug", "true");// 发送服务器需要身份验证props.setProperty("mail.smtp.auth", "true");// 设置邮件服务器主机名props.setProperty("mail.host", "smtp.qq.com");// 发送邮件协议名称props.setProperty("mail.transport.protocol", "smtp");MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);props.put("mail.smtp.ssl.enable", "true");props.put("mail.smtp.ssl.socketFactory", sf);Session session = Session.getInstance(props);Message msg = new MimeMessage(session);msg.setSubject("seenews 错误");StringBuilder builder = new StringBuilder();builder.append("url = " + "http://blog.csdn.net/never_cxb/article/details/50524571");builder.append("\n页面爬虫错误");builder.append("\n时间 " + TimeTool.getCurrentTime());msg.setText(builder.toString());msg.setFrom(new InternetAddress("**发送人的邮箱地址**"));Transport transport = session.getTransport();transport.connect("smtp.qq.com", "**发送人的邮箱地址**", "**你的邮箱密码或者授权码**");transport.sendMessage(msg, new Address[] { new InternetAddress("**接收人的邮箱地址**") });transport.close();}
}

Java 基于JavaMail实现向QQ邮箱发送邮件(未测试)相关推荐

  1. Java基于JavaMail实现向QQ邮箱发送邮件遇到的问题

    最近使用Java基于JavaMail实现向QQ邮箱发送邮件老是发送失败,在网上搜了下,终于找到原因,记录下. 参考:http://www.jb51.net/article/78405.htm 网上还有 ...

  2. 基于java mail实现简单的QQ邮箱发送邮件

    刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 S ...

  3. java发送qq邮箱不成功_java,_使用QQ邮箱发送邮件遇到的问题,java - phpStudy

    使用QQ邮箱发送邮件遇到的问题 代码是在网上抄的别人今年写的,但是我运行起来一直报错,也不知道什么原因,请大神帮忙指点一下::谢谢!!! 以下是我的代码 public class Sendmail8 ...

  4. Java mail使用QQ邮箱发送邮件配置方案

    Java mail使用QQ邮箱发送邮件配置方案 java mail配置了QQ邮箱作为服务器发送邮件,结果导致出现503异常: Authentication failed; nested excepti ...

  5. java模拟登录qq邮箱_使用Java实现qq邮箱发送邮件

    本文实例为大家分享了Java操作qq邮箱发送邮件的具体代码,供大家参考,具体内容如下 今天尝试了使用QQ邮箱的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务来进行发送 ...

  6. java 发送激活邮件 以qq邮箱为例

    java发送激活邮件 以qq邮箱为例 1.首先发送者邮箱需要开启服务 登录qq邮箱,选择设置--账号,开启以上两个服务.会获得相应的两个授权码 2.以下代码为发送邮件代码 package com.em ...

  7. legend3---lavarel中使用qq邮箱发送邮件

    legend3---lavarel中使用qq邮箱发送邮件 一.总结 一句话总结: 第一步:配置邮箱做服务器,比如qq邮箱,网易163邮箱 第二步:配置lavarel的配置文件 第三部:写邮件发送代码就 ...

  8. python3利用smtplib通过qq邮箱发送邮件

    前言 本文主要给大家介绍了关于python3 smtplib通过qq邮箱发送邮件的相关内容, smtplib模块是smtp简单邮件传输协议客户端的实现,为了通用性,有时候发送邮件的时候要带附件或图片, ...

  9. php模拟登录qq邮箱_PHP 利用QQ邮箱发送邮件的实现

    这篇文章主要介绍了关于PHP 利用QQ邮箱发送邮件的实现,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 ...

  10. python 用QQ邮箱发送邮件

    SMTP 是发送邮件的协议.Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮箱. Python对SMTP支持有smtplib 和email 两个模块,email负责构造 ...

最新文章

  1. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...
  2. GitHub 热榜:中国博士开发可交互全球疫情地图,登上柳叶刀!
  3. Spring boot 参数校验
  4. Linux文件目录操作指令
  5. 学习《HTML+CSS基础课程》里的权值
  6. 数据结构知识点大汇总(四)
  7. java回忆录—输入输出流详细讲解(入门经典)
  8. ZF环境要求及如何配置
  9. loader 编写一个android_Android之Loader理解
  10. CentOS 7系统升级备份恢复实验记录
  11. 5.9 亿国内用户简历遭殃,数据库持续“裸奔”!
  12. linux 触屏设备 无法处理touchevent_一次通讯干扰处理
  13. Vue电影网站构建实战教程
  14. Android项目编译异常之AAPT: error
  15. 商业智能,数据仓库,ETL,数仓调度工具informatica介绍手账(三)
  16. OpenStack高级控制服务之使用编配服务(Heat)实现自动化部署云主机
  17. leetcode之Isomorphic strings
  18. 2022摄影摄像行业年度分析报告:单反小幅下滑,微单销额增长超32%
  19. linux 应用编程(持续更新)
  20. 阿里巴巴Java开发手册认证考试题库

热门文章

  1. 一文入手 JUC(20+单元)
  2. MATLAB(3)MATLA 求极限 求积分 求微分 求级数的和
  3. 安装unbuntu,vmware傻瓜式笔记
  4. python汇率兑换程序_Python中汇率兑换程序的实现,python
  5. 如何删除“我的电脑”、“此电脑”中坚果云图标--三种方法(2020年的可行方案)
  6. 云杰恒指:6.20恒指期货早盘资讯
  7. linux curl证书错误,curl – SSL证书错误
  8. 基于华为java编程规范的checkstyle.xml以及格式化模版,注释模版
  9. centos linux系统后门程序
  10. 【渝粤教育】电大中专计算机职业素养 (11)作业 题库