发邮件出错javamail到底错哪儿了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发邮件出错javamail到底错哪儿了相关的知识,希望对你有一定的参考价值。
参考技术A 首页Web开发
Android
J2EE
PHP
Linux/Unix
MySql
C#
更多...
当前位置:我的异常网» J2EE » 发邮件出错javamail!到底错哪儿了!【100分】
发邮件出错javamail!到底错哪儿了!【100分】(2)
www.MyException.Cn 网友分享于:2015-08-26 浏览:183次
SMTP邮件协议对象创建成功
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 smtp.qq.com Esmtp QQ Mail Server
DEBUG SMTP: connected to host "smtp.qq.com", port: 25
EHLO moby-PC
250-smtp.qq.com
250-PIPELINING
250-SIZE 52428800
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "52428800"
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
连接服务器成功
DEBUG SMTP: use8bit false
MAIL FROM:<yajuan.sun@qq.com>
250 Ok
RCPT TO:<test@qq.com>
250 Ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP: chiqingye@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>
From: yajuan.sun@qq.com
To: test@qq.com
Message-ID: <6037166.0.1363187885900.JavaMail.moby@moby-PC>
Subject: =?UTF-8?B?5rWL6K+V?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
5Y+q5piv5LiA5Liq5rWL6K+V
.
250 Ok: queued as
QUIT
221 Bye
邮件发送成功
用你的代码没有有测出问题,发送成功了。只测试业务逻辑,没有使用servlet方式发送本回答被提问者采纳
使用JavaMail收发邮件
概述
邮件相关的标准
厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:
SMTP(Simple Mail Transfer Protocol):即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
POP3(Post Office Protocol - Version 3):即邮局协议版本3,用于接收电子邮件的标准协议。
IMAP(Internet Mail Access Protocol):即Internet邮件访问协议。是POP3的替代协议。
这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。
MIME(Multipurpose Internet Mail Extensions):即多用途因特网邮件扩展标准。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。
JavaMail简介
JavaMail是由Sun发布的用来处理email的API。它并没有包含在Java SE中,而是作为Java EE的一部分。
mail.jar:此JAR文件包含JavaMail
API和Sun提供的SMTP、IMAP和POP3服务提供程序;
activation.jar:此JAR文件包含JAF
API和Sun的实现。
JavaMail包中用于处理电子邮件的核心类是:Properties、Session、Message、Address、Authenticator、Transport、Store等。
邮件传输过程
如上图,电子邮件的处理步骤如下:
(1)创建一个Session对象。
(2)Session对象创建一个Transport对象/Store对象,用来发送/保存邮件。
(3)Transport对象/Store对象连接邮件服务器。
(4)Transport对象/Store对象创建一个Message对象(也就是邮件内容)。
(5)Transport对象发送邮件;Store对象获取邮箱的邮件。
Message结构
MimeMessage类:代表整封邮件。
MimeBodyPart类:代表邮件的一个MIME信息。
MimeMultipart类:代表一个由多个MIME信息组合成的组合MIME信息。
JavaMail的核心类
JavaMail对收发邮件进行了高级的抽象,形成了一些关键的的接口和类,它们构成了程序的基础,下面我们分别来了解一下这些最常见的对象。
java.util.Properties类(属性对象)
java.util.Properties类代表一组属性集合。
它的每一个键和值都是String类型。
由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail通过Properties对象封装这些属性信息。
例:如下面的代码封装了几个属性信息:
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.host", "[email protected]");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,
下表是一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):
关键词 |
类型 |
描述 |
mail.debug |
boolean |
debug开关。 |
mail.host |
String |
指定发送、接收邮件的默认邮箱服务器。 |
mail.store.protocol |
String |
指定接收邮件的协议。 |
mail.transport.protocol |
String |
指定发送邮件的协议。 |
mail.debug.auth |
boolean |
debug输出中是否包含认证命令。默认是false。 |
详情请参考官方API文档:
https://javamail.java.net/nonav/docs/api/。
javax.mail.Session类(会话对象)
Session表示一个邮件会话。
Session的主要作用包括两个方面:
l接收各种配置属性信息:通过Properties对象设置的属性信息;
l初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。
JavaMail在Jar包的META-INF目录下,通过以下文件提供了基本配置信息,以便session能够根据这个配置文件加载提供者的实现类:
javamail.default.providers;
javamail.default.address.map。
例:
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);
javax.mail.Transport 类(邮件传输)
邮件操作只有发送或接收两种处理方式。
JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。
getTransport:Session类中的getTransport()有多个重载方法,可以用来创建Transport对象。
connect:如果设置了认证命令——mail.smtp.auth,那么使用Transport类的connect方法连接服务器时,则必须加上用户名和密码。
sendMessage:Transport类的sendMessage方法用来发送邮件消息。
close:Transport类的close方法用来关闭和邮件服务器的连接。
javax.mail.Store类(邮件存储)
getStore:Session类中的getStore()有多个重载方法,可以用来创建Store对象。
connect:如果设置了认证命令——mail.smtp.auth,那么使用Store类的connect方法连接服务器时,则必须加上用户名和密码。
getFolder: Store类的getFolder方法可以获取邮箱内的邮件夹Folder对象
close:Store类的close方法用来关闭和邮件服务器的连接。
javax.mail.Message(消息对象)
javax.mail.Message是个抽象类,只能用子类去实例化,多数情况下为javax.mail.internet.MimeMessage。
MimeMessage 代表MIME 类型的电子邮件消息。
要创建一个 Message,需要将
Session 对象传递给 MimeMessage 构造器:
MimeMessage message = new MimeMessage(session);
注意:还存在其它构造器,如用按
RFC822 格式的输入流来创建消息。
setFrom:设置邮件的发件人
setRecipient:设置邮件的发送人、抄送人、密送人
三种预定义的地址类型是:
Message.RecipientType.TO:收件人
Message.RecipientType.CC:抄送人
Message.RecipientType.BCC:密送人
setSubject:设置邮件的主题
setContent:设置邮件内容
setText:如果邮件内容是纯文本,可以使用此接口设置文本内容。
javax.mail.Address(地址)
一旦您创建了 Session 和
Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是 javax.mail.internet.InternetAddress 类。
若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。
例:
Authenticator:认证者
与 java.net 类一样,JavaMail
API 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于JavaMail API 来说,这些资源就是邮件服务器。JavaMail Authenticator 在 javax.mail 包中,而且它和 java.net 中同名的类 Authenticator 不同。两者并不共享同一个 Authenticator,因为JavaMail API 用于
Java 1.1,它没有 java.net 类别。
要使用 Authenticator,先创建一个抽象类的子类,并从 getPasswordAuthentication() 方法中返回
PasswordAuthentication 实例。创建完成后,您必需向 session 注册
Authenticator。然后,在需要认证的时候,就会通知 Authenticator。您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为 PasswordAuthentication 对象返回给调用程序。
例:
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
实例
发送文本邮件
Properties prop = new Properties();
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.host", MAIL_SERVER_HOST);
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 1、创建session
Session session = Session.getInstance(prop);
Transport ts = null;
// 2、通过session得到transport对象
ts = session.getTransport();
// 3、连上邮件服务器
ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
// 4、创建邮件
MimeMessage message = new MimeMessage(session);
// 邮件消息头
message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
message.setSubject("测试文本邮件"); // 邮件的标题
// 邮件消息体
message.setText("天下无双。");
// 5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
发送HTML格式的邮件
Properties prop = new Properties();
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.host", MAIL_SERVER_HOST);
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 1、创建session
Session session = Session.getInstance(prop);
Transport ts = null;
// 2、通过session得到transport对象
ts = session.getTransport();
// 3、连上邮件服务器
ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
// 4、创建邮件
MimeMessage message = new MimeMessage(session);
// 邮件消息头
message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
message.setSubject("测试HTML邮件"); // 邮件的标题
String htmlContent = "<h1>Hello</h1>" + "<p>显示图片<img src=‘cid:abc.jpg‘>1.jpg</p>";
MimeBodyPart text = new MimeBodyPart();
text.setContent(htmlContent, "text/html;charset=UTF-8");
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("D:\\[04]Temp\\img\\1.jpg"));
image.setDataHandler(dh);
image.setContentID("abc.jpg");
// 描述
以上是关于发邮件出错javamail到底错哪儿了的主要内容,如果未能解决你的问题,请参考以下文章