运维开发网

基于JavaMail向QQ邮箱发送邮件

运维开发网 https://www.qedev.com 2022-05-16 16:42 出处:网络
这篇文章主要为大家详细介绍了Java基于JavaMail实现向QQ邮箱发送邮件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章主要为大家详细介绍了Java基于JavaMail实现向QQ邮箱发送邮件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近,该项目正在作为一个新闻爬虫。我想实现这个功能:在一个页面爬虫失败后,我会把这个页面的url发送到邮箱。最终效果图如下。后期可以添加过滤标签、故障状态码等。以便于分类和搜索例外。


开发者可以根据邮件中的url和栈信息分析爬虫失败的原因。

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

打开SMTP服务

QQ邮箱中的设置-gt;在帐户中打开SMTP服务


注意,QQ邮箱打开后会生成一个授权码,可以用来代替原邮箱密码连接代码中的邮箱,避免使用明文密码。


我在网上查了例子。根据这篇文章,JavaMail (II): Java Mail介绍并发送了一个简单的电子邮件示例代码。

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 suppressedDEBUG SMTP: AUTH LOGIN failedException 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#63;id=28

因为样本代码使用的是163邮箱,而作者是QQ邮箱,所以日志分析显示QQ邮箱需要SSL加密。

打开SSL加密

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

网上还有一种说法,把smtp.qq.com改成smtp.exmail.qq.com不需要SSL加密,但是作者没能运行成功。所以老老实实加SSL加密。

以下代码打开SSL加密。

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

成功后,控制台输出日志和效果图如下

DEBUG SMTP: useEhlo true, useAuth trueDEBUG SMTP: trying to connect to host "smtp.qq.com", port 465, isSSL true220 smtp.qq.com Esmtp QQ Mail ServerDEBUG SMTP: connected to host "smtp.qq.com", port: 465... data 2016-01-19 17:00:44 Tue.250 Ok: queued as QUIT221 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(); }}

这就是本文的全部内容,希望对大家的学习有所帮助。


0

精彩评论

暂无评论...
验证码 换一张
取 消