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

刚结束一个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位的授权码,得到授权码赋值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值