• java实现简单邮件的发送以及常见问题


    java实现简单邮件的发送以及常见问题

    最近遇到个需求需要实现发送邮件的功能,以前做发送邮件功能都是有邮箱用户名密码,通过用户名密码连接对应的SMTP服务器来实现邮件的发送。但是这次用公司内部的邮箱,大体原理基本相同,但是给分配的邮箱并未提供密码,所以需要实现邮箱免密发送邮件。

    java mail 实现

    import java.util.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    
    public class SendEmail {
    	public static void main(String[] args) {
    		// 收件人电子邮箱
    		String to = "****@***.com";
    
    		// 发件人电子邮箱
    		String from = "****@***.com";
    
    		// 指定发送邮件的主机
    		String host = "";
    
    		// 获取系统属性
    		Properties properties = System.getProperties();
    
    		// 设置邮件服务器
    		properties.setProperty("mail.smtp.host", host);
    		properties.setProperty("mail.smtp.auth", "false");
    		properties.setProperty("mail.stmp.from", from);
            // ehlo被设置为false的时候连接邮件服务器不需要验证
    		properties.setProperty("mail.smtp.ehlo", "false");
    
    		// 获取默认session对象
    		Session session = Session.getDefaultInstance(properties);
    		// 开启debug模式
    		session.setDebug(true);
    		try {
    			// 创建默认的 MimeMessage 对象
    			MimeMessage message = new MimeMessage(session);
    
    			// Set From: 头部头字段
    			message.setFrom(new InternetAddress(from));
    
    			// Set To: 头部头字段
    			message.addRecipient(Message.RecipientType.TO, new InternetAddress(
    					to));
    
    			// Set Subject: 头部头字段
    			message.setSubject("This is the Subject Line!");
    
    			// 设置消息体
    			message.setText("This is actual message");
    
    			// 发送消息
    			Transport.send(message);
    			System.out.println("Sent message successfully....");
    		} catch (MessagingException mex) {
    			mex.printStackTrace();
    		}
    	}
    }
    

    mail.smtp.ehlo 被设置为fales的时候连接邮件服务器不需要验证,如果不设置默认为true需要服务器需要验证。
    mail.smtp.ehlo 为false的时候连接SMTP服务器是helo模式,为true的时候是ehlo模式。

    commons-email 实现

    commons-email其实是对java mail 的封装,更进一步方便使用了。
    下面代码是实现了有用户名密码发送邮件。

    import org.apache.commons.mail.DefaultAuthenticator;
    import org.apache.commons.mail.Email;
    import org.apache.commons.mail.EmailException;
    import org.apache.commons.mail.SimpleEmail;
    
    public class MailUtil {
    	private static String _USER_NAME_ = "****@***.com";
    	private static String _PASSWORD_ = "***";
    	private static String _SMTP_ADDRESS_ = "smtp.com";
    	private final static int _SMTP_PORT_SSL_ = 465;
    	private static String from = "****@***.com";
    
    	public static void sendMail(String toAddress, String subject, String content) {
    		Email email = new SimpleEmail();
    		email.setHostName(_SMTP_ADDRESS_);
    		email.setSmtpPort(_SMTP_PORT_SSL_);
    		email.setAuthenticator(new DefaultAuthenticator(_USER_NAME_, _PASSWORD_));
    		// email.setSSLOnConnect(true);
    		email.setSSL(true);// commons-mail-1.1支持的方法,1.4中使用setSSLOnConnect(true)代替
    		try {
    			email.setFrom(from);
    			email.setSubject(subject);
    			email.setMsg(content);
    			email.addTo(toAddress);
    			email.send();
    		} catch (EmailException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void main(String[] args) {
    		// test
    		String subject = "测试邮件";
    		String content = "test test test。。。测试内容。。。这是从MailUtil.java发来的。";
    		String to = "****@***.com";
    		MailUtil.sendMail(to, subject, content);
    	}
    }
    

    常见问题

    一、运行过程抛出异常

    1、Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

    原因:此异常多出现在J2EE版本的邮件服务中,因为J2EE原有jar中包含用于邮件收发的mail.jar,只是版本可能比较低。

    解决方法:手动删除J2EE版本里的JavaMail相关的jar包(mail.jar),导入自己下载的新版本mail.jar和activation.jar。

    2、Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource

    原因:没有导入activation.jar,编译时异常,运行时如果没有使用附件功能的话会正常运行。

    解决方法:导入activation.jar

    二、发送过程出现错误,一般不是代码问题

    1、'550 5.1.1 test@163.com: Recipient address rejected: User unknown in virtual mailbox table',

    你发送的帐号在邮件系统内不存在,请检查你的邮件地址是否输入有误

    2、'554 5.7.1 test@163.com: Sender address rejected: Access denied',

    你的邮箱是内部帐号,你所发送的地址不在授权域之内

    3、'553 5.7.1 test@163.com: Sender address rejected: not logged in',

    发送邮件需要SMTP身份验证,你的帐号SMTP身份验证部分没有设置正确,请检查配置

    4、'454 4.7.1 <unknown[...]>: Client host rejected: Access denied'

    你的IP被管理员屏蔽,请检查你部的机器是否被感染病毒自动发送邮件

  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/wulaa/p/8968642.html
Copyright © 2020-2023  润新知