使用javamail发信过程中的一些问题及解决方法

今天在研究javamail发信的过程中,出现了一些小问题,现总结如下,以免后来者走些不必要的弯路,先把完整的能够正常运行的代码示例粘贴如下: 
发邮件源代码: 
package com.hyq.test; 

import java.util.Properties; 
import javax.mail.*; 
import javax.mail.internet.*; 

public class MailExample { 

  public static void main (String args[]) throws Exception { 
     
    String host = "smtp.163.com";   //发件人使用发邮件的电子信箱服务器 
    String from = "你自己的电子信箱";    //发邮件的出发地(发件人的信箱) 
    String to = "收件人信箱";   //发邮件的目的地(收件人信箱) 

    // Get system properties 
    Properties props = System.getProperties(); 

    // Setup mail server 
    props.put("mail.smtp.host", host); 

    // Get session 
    props.put("mail.smtp.auth", "true"); //这样才能通过验证 

    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码"); 
    Session session = Session.getDefaultInstance(props, myauth); 

//    session.setDebug(true); 

    // Define message 
    MimeMessage message = new MimeMessage(session); 
     

    // Set the from address 
    message.setFrom(new InternetAddress(from)); 

    // Set the to address 
    message.addRecipient(Message.RecipientType.TO, 
      new InternetAddress(to)); 

    // Set the subject 
    message.setSubject("测试程序!"); 

    // Set the content 
    message.setText("这是用java写的发送电子邮件的测试程序!"); 

    message.saveChanges(); 

      Transport.send(message); 
     
  } 


校验发信人权限的方法 
package com.hyq.test; 

import javax.mail.PasswordAuthentication; 

class MyAuthenticator 
      extends javax.mail.Authenticator { 
    private String strUser; 
    private String strPwd; 
    public MyAuthenticator(String user, String password) { 
      this.strUser = user; 
      this.strPwd = password; 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(strUser, strPwd); 
    } 
  } 


注意:上面的事例仅为使用163信箱时发送电子邮件的方法,因为使用的host为:smtp.163.com,如源代码中:String host = "smtp.163.com";   //发件人使用发邮件的电子信箱服务器,如果使用其它的电子邮件发送,就必须在其邮件服务器上查找相应的电子邮件服务器,例如搜狐就要使用smtp.sohu.com,具体情况具体对待,都可以从所使用的邮件服务器上获得的。如果没有使用host ,也就是说,没有进行props.put("mail.smtp.host", host);设置,那么就会抛javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;的异常。当然了,如果你没有正确配置,这个异常仍然会被抛出的。 

有些邮件服务系统是不需要验证发件人的授权的,所以可以很简单的使用 
    Session session = Session.getDefaultInstance(props, null); 
             而不必使用 
    props.put("mail.smtp.auth", "true");  
    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码"); 
    Session session = Session.getDefaultInstance(props, myauth); 

就可以发送电子邮件了,这个多为一些企事业单位的内部电子信箱系统。 
但是对于很多门户网站上的电邮系统,如:163,sohu,yahoo等等,如果仍然简单的这样使用就会抛 

com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxuAyCAfmnZE8BwtIA==.32705S2 


 at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388) 

 at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959) 

 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583) 

 at javax.mail.Transport.send0(Transport.java:169) 

 at javax.mail.Transport.send(Transport.java:98) 

这样的异常,要求你必须进行授权校验,它的目的就是阻止他人任意乱发邮件,也算是为了减少垃圾邮件的出现吧。这时候,我们就要使用 
    props.put("mail.smtp.auth", "true");  
    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码"); 
    Session session = Session.getDefaultInstance(props, myauth); 

这里还有一个特别注意的事情:在你使用Session.getDefaultInstance时,一定要将    props.put("mail.smtp.auth", "true"); 置为true,它默认的是false,如果你没有做这一步,虽然你使用了Session.getDefaultInstance(props, myauth);,你自己也确实    MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码");但是它仍然会抛出 
com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxJA2SBrm3ZEFv0gIA==.40815S2 


 at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388) 

 at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959) 

 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583) 

 at javax.mail.Transport.send0(Transport.java:169) 

 at javax.mail.Transport.send(Transport.java:98) 
这样的异常。我就在这一步费了好长时间,后来才发现了这个问题,很是郁闷。不过还好,总算解决了。 

其实上面的做法只是比较简单的一种,也有很多其它的写法,如: 
Properties props = System.getProperties();可以使用 
Properties props = new Properties();来代替。 


Transport.send(message);可以使用下面的代码来代替 
      String username = "你的电子信箱用户名"; 
      String password = "你的电子信箱密码"; 
      message.saveChanges(); //    implicit with send() 
      Transport transport = session.getTransport("smtp"); 
      transport.connect("mail.htf.com.cn", username, password); 
      transport.sendMessage(message, message.getAllRecipients()); 
      transport.close(); 
这种方法在同时发送多封电子邮件时比较有用。 

还有一些具体的相关概念,可以查看相关的官方文档,在我查询资料时,发现了一篇文章写得相当仔细,可以加以参考:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html 

另附上使用org.apache.commons.mail进行发电子邮件的示例: 
import org.apache.commons.mail.SimpleEmail; 
import org.apache.commons.mail.*; 

public class TestCommon { 
  public TestCommon() { 
  } 
  public static void main(String[] args){ 
    SimpleEmail email = new SimpleEmail(); 
    email.setHostName("smtp.163.com");//设置使用发电子邮件的邮件服务器 
    try { 
      email.addTo("收件人信箱"); 
      email.setAuthentication("发件人信箱","发件人信箱密码"); 
      email.setFrom("发件人信箱"); 
      email.setSubject("Test apache.commons.mail message"); 
      email.setMsg("This is a simple test of commons-email"); 
      email.send(); 
    } 
    catch (EmailException ex) { 
      ex.printStackTrace(); 
    } 
  } 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题

在用 VS2015 编译 Debug 版的 openCV 源码时,最后一步生成 INSTALL,碰到了下面问题:因为配置 Windows 版 caffe 的需要,我先安装了一个 Anaconda3(3.6版本),caffe 最高支支持到 3.5 &#xff0c…

python做硬件自动化测试仪器_基于Python PyVisa和GPIB的硬件测试仪器控制方法

基于Python和GPIB的硬件测试仪器控制方法 背景 在物联网通信时代,嵌入式模块开发越发广泛,自动化测试成为大家老生常谈的话题。对于一些高精度仪器,我们知道它是用GPIB控制用来测试,也希望可以通过一个程序实现自动化控制&#xf…

外点惩处函数法·约束优化问题

版权声明:本文为博主原创文章,未经博主同意不得转载,博客主页 http://blog.csdn.net/i_love_home https://blog.csdn.net/zstu_wangrui/article/details/36242529 外点惩处函数法约束优化问题 外点法惩处函数(r添加,SU…

在单元测试和TDD中指定时间的重要性

最近,我一直在写与自动测试有关的更高级的概念(主要与Spock有关)。 但是,在进行测试培训时,我清楚地看到,通常对特定工具的知识并不是主要问题。 即使使用Spock,也可以编写肿且难以维护的测试&a…

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题…

.pro.user文件

.pro.user 用于记录打开工程的路径,所用的编译器、构建的工具链、生成目录、打开工程的qt-creator的版本等。 当更换编译环境时,要将其删除。

python tkinter实例_python绘制一个图形示例源码(tkinter)

【实例简介】 【实例截图】【核心代码】 # -*- coding: utf-8 -*- #!/usr/bin/python import math from tkinter import * class PTS: def __init__(self): self.x 0 self.y 0 points [] def LineToDemo(): screenx 400 screeny 400 canvas Canvas(width screenx,height…

PHP算法之冒泡排序

//冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array [11,5,4,58,1,222,34]; for ($j 0; $j< count($array)-1; $j) { for($i 0 ; $i < count($array)-$j-1; $i){if(…

jaxb 命名空间_在JAXB解组期间应用名称空间

jaxb 命名空间对于某些XML模式来说&#xff0c;它是一组严格的规则&#xff0c;用于规定XML文档的结构方式。 但是对于其他人来说&#xff0c;通常的准则是指出XML的外观。 这意味着有时出于某些原因&#xff0c;人们希望接受不符合XML模式的输入。 在此示例中&#xff0c;我将…

pro文件

配置 注释 以“#”开始&#xff0c;到这一行结束。 快捷键&#xff1a;Ctrl / CONFIG 指定编译器选项和项目配置&#xff0c;值由qmake内部识别并具有特殊意义。 以下配置值控制编译标志&#xff1a; 选项说明release项目以release模式构建。如果也指定了debug&#xff0c;那么…

Java Thread 总结

线程的概述&#xff08;Introduction&#xff09; 线程是一个程序的多个执行路径&#xff0c;执行调度的单位&#xff0c;依托于进程存在。 线程不仅可以共享进程的内存&#xff0c;而且还拥有一个属于自己的内存空间&#xff0c;这段内存空间也叫做线程栈&#xff0c;是在建立…

前端和后端哪个工资高_新媒体运营和网络运维哪个好,哪个工资待遇高,门槛低?...

文/水流云在草青青通常情况下&#xff0c;门槛高低和待遇高低成反比。工资待遇和工作本领成正比。除非你有人脉或贵人&#xff0c;除非你踩狗屎运。门槛低&#xff0c;待遇高的工作对绝大多数人而言是梦话。不知题主朋友的特长是什么&#xff1f;有哪些工作经验&#xff1f;青青…

python框架源码学习

最近下了一个别人的接口测试框架原码来学习 1.有用到logbook模块进行日志管理 2.使用xlrd模块对excel数据表的操作 3.使用自定义的代码输出测试报告 4.使用logger模块记录运行时日志 主要是看了关于接口的代码&#xff1a;封装了http请求的get/post请求 用法&#xff1a; 需要导…

使用TestContainers进行数据库测试

如果您曾经编写过测试数据库交互的代码&#xff0c;例如数据访问对象&#xff0c;那么您很可能遇到了测试中最长期的烦恼之一&#xff1a;为了准确地测试这些交互&#xff0c;需要一个数据库。 为了本文的方便&#xff0c;让我们考虑一个将PostgreSQL用作其环境的一部分的应用…

cuda安装配置VS2013

1.1 安装cuda 首先官网下载安装包&#xff0c;这个就不细说了 &#xff0c;我下的是这个版本cuda_8.0.61_win10.exe&#xff0c;&#xff0c;注意win7和win10版本要对应&#xff0c;千万别弄错了 之后双击会出现如下截图&#xff0c;解压完以后一直点下一步如下图出现这个等半个…

两列布局、三列适应布局、两列等高适应布局。

一. 两列布局&#xff1a;左侧定宽、右侧自适应。 四种方法 &#xff1a;flex 、position、float和负外边距、外边距 1. 使用flex. <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style type"tex…

操作系统的线程和进程的区别_面试官:你熟悉多线程嘛?线程跟进程有什么区别?...

这篇文章跟大家聊聊线程&#xff0c;讲到线程&#xff0c;⼜不得不提进程了~进程我们估计是很了解的了&#xff0c;在windows下打开任务管理器&#xff0c;可以发现我们在操作系统上运⾏的程序都是进程。什么是叫一个进程&#xff1f; 什么叫一个线程&#xff1f;进程&#xff…

以OpenCV为例配置VS第三方库

正常情况下&#xff0c;你拿到的别人的第三方动态库&#xff08;静态库调用方式这里不讲&#xff0c;有另外一篇文章&#xff09;至少应该包含下面三种文件&#xff1a; 1. 头文件&#xff0c;这个一般放在include这样字眼的文件夹下&#xff0c;比如OpenCV的&#xff1a;然后i…

光纤接口怎么接 图解_光纤的数据比网线快很多倍,但为什么没有在家庭局域网中普及呢?...

光纤的数据吞吐量比网线大很多&#xff0c;速度也更快&#xff0c;网络光纤入户已经普及&#xff0c;但是家庭内组网却没有普及&#xff0c;大部分家庭组网还是网线较多。分析起来主要的原因有&#xff1a;光纤线的价格和网线差不多&#xff0c;但是因为光纤所使用的专用的光接…

项目Alpha冲刺--1/10

项目Alpha冲刺--1/10作业要求 这个作业属于哪个课程软件工程1916-W(福州大学)这个作业要求在哪里项目Alpha冲刺团队名称基于云的胜利冲锋队项目名称云评&#xff1a;高校学生成绩综合评估及可视化分析平台这个作业的目标团队的代码规范、本次冲刺任务与计划其他参考文献1.邹欣.…