`
ztfjava
  • 浏览: 72671 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SendEmail经常遇到的问题总结

    博客分类:
  • Java
阅读更多
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();
    }
  }
}

分享到:
评论

相关推荐

    QTP日志实践的几点总结

    创建一个名为`SendEmail`的子程序,通过创建并配置Outlook对象,设置邮件主题、内容、附件(如刚才捕获的截图)以及收件人地址,实现自动化发送带有测试结果的电子邮件。这在团队协作或者需要远程监控测试情况时特别...

    群发mail

    在实际的IT实践中,开发者可能会遇到如邮件验证、防止被识别为垃圾邮件、处理大容量邮件列表等问题。 标签中的“源码”意味着我们将讨论的是实际的编程代码,而“工具”可能指的是用于辅助发送邮件的第三方库或者...

    java发送邮件项目

    Java发送邮件是一个常见的任务,尤其在企业级应用中,用于通知、报告或者...通过理解并实践该项目,开发者可以掌握Java发送邮件的基本流程,学习如何配置邮件会话、创建和发送邮件,以及处理可能遇到的认证和安全问题。

    zabbix实现邮件告警的方法

    在配置邮件告警时,可能会遇到SSL安全验证的问题。由于SendEmail默认使用SSL_verify_mode为SSL_VERIFY_NONE可能会造成安全风险,因此推荐将其设置为SSL_VERIFY_PEER,并指定CA证书或CA路径以进行验证。如果确实不...

    Qt 使用sendemailapi实现邮件发送

    在使用Qt进行应用程序开发时,有时我们需要集成邮件发送功能,以便用户能够直接通过应用发送电子邮件。在这种场景下,"sendemailapi"是一个可能...如果你在实现过程中遇到问题,与其他开发者交流讨论是很好的解决办法。

    java版发送邮件工具类

    在实际应用中,你还需要考虑错误处理和异常捕获,因为邮件发送可能会遇到网络问题、权限问题或者邮件服务器配置问题。`SendJMail.java`工具类可能已经内置了这些错误处理机制,但理解这些潜在问题可以帮助你在出现...

    WinForms演示邮件发送

    在.NET框架中,WinForms(Windows Forms)是一个用于构建桌面应用程序的用户界面的库。它提供了丰富的控件和功能,让开发者能够创建交互式的...如果你在实际开发中遇到任何问题,可以继续探索相关文档或寻求更多帮助。

    SMTP客户端的简单实现

    - 处理异常:在发送邮件过程中,可能会遇到网络问题或认证失败等问题,需要捕获并处理异常。 - 安全性:如果使用不安全的SMTP服务器,可能面临安全风险,比如用户名和密码被截取。因此,建议使用SSL/TLS加密连接。...

    jsp写的收发邮件,使用javamail写的

    在使用JavaMail过程中,可能会遇到网络问题、认证错误或邮件服务器拒绝连接等问题。因此,需要适当地捕获和处理`MessagingException`和其他相关异常。 8. **实战应用**: 以JSP为例,用户可能通过表单提交邮件...

    indy的客户端使用说明

    在实际应用中,网络环境可能会遇到各种各样的问题,因此错误处理和异常管理是不可或缺的一部分。例如,在上述 SMTP 示例中,如果服务器拒绝向某个地址发送邮件(如黑名单中的地址),客户端需要能够识别这种情况并...

    Springboot阿里、腾讯短信和邮件发送service封装

    在Spring Boot应用中,我们经常会遇到需要集成第三方服务来实现短信和邮件的发送功能,例如阿里云的SmsService和腾讯云的QcloudSmsService等。这些服务可以帮助我们在用户注册、密码找回、订单确认等场景下进行有效...

    Laravel开发-sunmailer

    在实际使用过程中,可能遇到SMTP连接问题或其他错误。SunMailer会抛出异常,你可以捕获这些异常进行处理或记录日志。为了方便调试,可以开启日志模式: ```php 'SunMailer' => [ // ... 'debug' => true, ], ``` ...

    c#实现SMTP发送邮件功能

    - 发送邮件时可能遇到网络问题,因此建议增加异常处理机制。 - 对于大型应用,考虑到性能因素,应考虑使用异步方式发送邮件。 - 在某些情况下,邮件服务商可能会限制频繁发送邮件的行为,请根据实际情况调整发送策略...

    python利用smtplib实现QQ邮箱发送邮件

    在实际编程中,可能会遇到的一些错误和问题,例如在使用smtplib进行邮件发送时,可能会遇到UnicodeDecodeError错误。这通常与计算机名或某些环境变量含有中文字符有关。解决这类问题,通常需要检查代码中涉及的字符...

    CentOS7搭建gerrit 代码审查服务方法

    总结起来,搭建Gerrit代码审查服务主要包括创建专用账户、安装Java、下载安装Gerrit、配置Gerrit及启动服务、配置反向代理等步骤。这个过程可以帮助团队实现更高效、安全的代码审核流程,提升软件开发的质量和效率。

Global site tag (gtag.js) - Google Analytics