刚结束一个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位的授权码,得到授权码赋值
以上就是我学习发发邮件的过程,有什么问题欢迎留言指教