java项目发送邮件,附带一些异常

来源:互联网 发布:php完全自学手册出版地 编辑:程序博客网 时间:2024/06/03 08:34

刚结束一个web项目,需要发送邮件,捣鼓了下,总结下自己的一点小经验,用着没什么问题,有不对的地方欢迎指教
我用的是qq邮箱,当然163,搜狐,新浪邮箱都是可以的,这里就以qq邮箱为例
首先获得qq邮箱16位的授权码,弄过的请跳过,先设置独立密码,和qq密码不一样,之后在邮箱首页点设置,再之后账号,往下翻
这里写图片描述
开启服务后会让你发短信得到授权码,发过后就得到一个16位的授权码,这个授权码有效时间是有限制的,过期了再次获得就好,也是一种安全保证
我用的是javax.mail包提供的邮件发送和接收功能
先引入javax.mail包,如果是maven项目则这样配置:

<dependency>    <groupId>com.sun.mail</groupId>    <artifactId>javax.mail</artifactId>    <version>1.6.0</version></dependency>

然后上代码:

import java.io.UnsupportedEncodingException;import java.util.Properties;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeUtility;public class Email {        public static void sendMail(String from,String toMail,String             mailTitle,String mailContent    ) throws            MessagingException, UnsupportedEncodingException{        String fromEmail = "fromEmail"; //fromEmail是发件人的邮箱        String password = "password";  //password是邮箱授权码        Properties props = new Properties();//加载一个配置文件        //存储发送邮件服务器的信息,qq为例,如果是163则是smtp.163.com        props.put("mail.smtp.host", "smtp.qq.com");        //使用smtp简单邮件传输协议        props.put("mail.transport.protocol","smtp");        props.put("mail.smtp.auth", "true");//是否需要身份验证        props.put("mail.smtp.ssl.enable", "true");//QQ邮箱的SSL加密        Session session = Session.getInstance(props);        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态        session.setDebug(true);        //由邮件会话创建一个扩展信息对象        MimeMessage msg = new MimeMessage(session);        //自定义昵称        String nick = MimeUtility.encodeText(from);//防止乱码        msg.setFrom(new InternetAddress(nick+"<"+fromEmail+">"));        msg.setRecipient(Message.RecipientType.TO, new             InternetAddress(toMail));//设置收件人,并设置其接受类型为to        msg.setSubject(mailTitle);//设置标题        //设置为html格式,可以发送多种样式        msg.setContent(mailContent,"text/html;charset=UTF-8");        //msg.setSentDate(new Date());  //设置发信时间        msg.saveChanges(); //存储邮件信息        //使用smtp协议获取session环境的Transprot对象来发送邮件 javamial使用        //Transport对象来管理发送邮件服务        Transport tran = session.getTransport("smtp");        tran.connect(props.getProperty("mail.smtp.host"),fromEmail,            password);//链接邮箱服务器,发送邮件的邮箱,以及授权码        //发送邮件,getAllRecipients()是所有已设好的收件人地址        tran.sendMessage(msg, msg.getAllRecipients());        tran.close();    }    public static void main(String[] args) throws MessagingException,         UnsupportedEncodingException {        //"自定义昵称",可以自己定义想要使用的发送昵称        //toEMail,是接收方的email        //title,是邮件的标题        //再下一个参数是邮件的内容,支持html        sendMail("自定义昵称","toEmail",            "title",            "<span style='color:red;'>下雨了_简</span>的博客,欢迎交流");    }}

效果如图:
这里写图片描述

每一行代码都加了注释,我觉得很容易上手,再介绍一些异常:

  • java.lang.ClassNotFoundException: com.sun.mail.util.MailLogger
    这是因为你导入的包只有api,没有包含sun的实现,重新导入javax.mail包即可

  • 530 Error: A secure connection is requiered(such as ssl)错误
    原因是你没有设置qq的加密方式,加上这句就OK了
    props.put(“mail.smtp.ssl.enable”, “true”);//QQ邮箱的SSL加密

  • 501 mail from address must be same as authorization user
    这是因为你的fromEmail(发件人)和tran.connect(邮件发送对象)使用的邮箱不一致,解决办法:保持一致

  • 535 Error:ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
    连接邮件对象使用的不是16位的授权码,得到授权码赋值

以上就是我学习发发邮件的过程,有什么问题欢迎留言指教

原创粉丝点击