之前做过简单的邮件发送,不过一次电脑的意外崩溃让我的代码都离我而去,现在偶尔想起来,只好重新从头再来一遍了,为防惨剧再次发生,特写此文!
首先邮件发送需要几个必备的jar包,可以去官网下载,同样可以在csdn里百度,不少大牛有分享的,在这儿提供一个链接:
http://download.csdn.net/detail/cdmamata/4876813
必备的几个jar包如下图:
当然怕有些人第一次尝试邮件发送,在这儿提个醒,邮箱发送前一定要到邮箱里先把pop3/SMTP/IMAP协议开起来,这个是必须的,要不然你就是一直在白费力气了
在这儿我测试了两个版本,首先是客户端的,不废话直接贴代码:
<span style="font-size:14px;">package com.wyp.newTest;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class MailService {
public static void main(String[] args) {
try {
String userName = "我的账号@163.com";
String password = "密码(如果是163则需要是第三方登录的授权码)";
String smtp_server = "smtp.163.com";
String from_mail_address = userName;
String to_mail_address = "指定收件邮箱";
Authenticator auth = new PopupAuthenticator(userName, password);
Properties mailProps = new Properties();
mailProps.put("mail.smtp.host", smtp_server);
mailProps.put("mail.smtp.auth", "true");
mailProps.put("username", userName);
mailProps.put("password", password);
Session mailSession = Session.getDefaultInstance(mailProps, auth);
mailSession.setDebug(true);
MimeMessage message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(from_mail_address));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(
to_mail_address));
message.setSubject("Mail Testw");
MimeMultipart multi = new MimeMultipart();
BodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText("hello");
// textBodyPart.setFileName("37af4739a11fc9d6b311c712.jpg");
multi.addBodyPart(textBodyPart);
message.setContent(multi);
message.saveChanges();
Transport.send(message);
} catch (Exception ex) {
System.err.println("邮件发送失败的原因是:" + ex.getMessage());
System.err.println("具体的错误原因");
ex.printStackTrace(System.err);
}
}
}
class PopupAuthenticator extends Authenticator {
private String username;
private String password;
public PopupAuthenticator(String username, String pwd) {
this.username = username;
this.password = pwd;
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username, this.password);
}
}
</span>
在写上述代码的时候最重要的就是我居然忘了那个密码该填网易邮箱授权码,费了好大的劲... .... ,就是下图的这个:
如果在上述操作的时候发现自己忘了之前设置的授权密码也没关系,选择【关闭】--》【打开】,会让你重新设置的,这回可别忘了啊!!!这样一来基本客户端的邮箱发送就没问题了,我在用的时候仅测试了英文内容的发送,其他的自己测试,如果在测试过程中报错,可以去这个网址找着错误码都是什么意思,网易解释的很清楚:
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
写到这儿基本的邮件发送应该没问题了,但是如果想更自由的模仿邮箱应该怎么做呢?其实无论是用java的swing或是采用javaweb都是可以很容易办到的,我是直接实现测试了本文开端给的链接中的javaMail官方给的servlet代码【进入本文给出的第一个链接,下载里面的代码】:
新建一个web项目,将上述两个文件加入下项目中即可:
开启服务器,浏览器效果【同样密码一样要是授权密码】:
我在登陆以后进入页面报了一个莫名其妙的错误:
A3 NO SELECT The login is O EXAMINE The login is not saf your mail client: http://mail.163.com/dashi
解决方法:http://blog.csdn.net/HelloWorld20151118/article/details/49910297
在代码的编辑中依次又出现了几个问题
1、比如发件邮箱多了个后缀,变成了xxxxxxxxxxxx@163.com@imap.163.com。
原因及解决方法:查看代码发现是代码中对发件邮箱默认是不带【@163.com】这一部分的,但是直接将用户名的后缀去掉并没有实际效果,因为邮箱变成【xxxxxxxxxxxxxxx@imap.163.com】了,不符合要求了不是,因此我在代码中将拼接部分去掉了,并且在输入时依然正常输入带后缀的用户名,并在代码中默认发件服务器为【smtp.163.com】
2、邮件发送的时候报了【•553 authentication is required】
原因及解决方法:邮箱对默认的第三方登录存在不安全隐患问题,因此需要在代码中加入这些:
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, new SimpleAuthenticator(USER_NAME, PASSWORD));
然后重写用户名、密码验证的方法:
class SimpleAuthenticator extends Authenticator {
private String username;
private String password;
public SimpleAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username, this.password);
}
}
终于,大功告成,邮件发出。。。
代码下载链接:http://pan.baidu.com/s/1kUJ1q2V