使用pop3j协议尝试以下,看可能好使不
这个报错是认证失败了,可能用户名密码出错。
认证失败,还可能是连续的访问,被邮件服务器拒绝了,过一会在尝试。
QQ邮箱 POP3 和 SMTP 服务器地址设置如下:
POP3服务器(端口110)popqqcom
SMTP服务器(端口25) smtpqqcom
SMTP服务器需要身份验证。
如果是设置POP3和SMTP的SSL加密方式,则端口如下:
imap服务器(端口993)
POP3服务器(端口995)
SMTP服务器(端口465或587)。
package comghyutil;
import javaioBufferedInputStream;
import javaioBufferedOutputStream;
import javaioFile;
import javaioFileOutputStream;
import javaioIOException;
import javaioInputStream;
import javatextSimpleDateFormat;
import javautilDate;
import javautilProperties;
import javaxmailBodyPart;
import javaxmailFlags;
import javaxmailFolder;
import javaxmailMessage;
import javaxmailMessagingException;
import javaxmailMultipart;
import javaxmailPart;
import javaxmailSession;
import javaxmailStore;
import javaxmailinternetInternetAddress;
import javaxmailinternetMimeMessage;
import javaxmailinternetMimeUtility;
public class PraseMimeMessage{
private MimeMessage mimeMessage=null;
private String saveAttachPath="";//附件下载后的存放目录
private StringBuffer bodytext=new StringBuffer();
//存放邮件内容的StringBuffer对象
private String dateformat="yy-MM-dd HH:mm";//默认的日前显示格式
/
构造函数,初始化一个MimeMessage对象
/
public PraseMimeMessage() {
}
public PraseMimeMessage(MimeMessage mimeMessage) {
thismimeMessage=mimeMessage;
}
public void setMimeMessage(MimeMessage mimeMessage){
thismimeMessage=mimeMessage;
}
/
获得发件人的地址和姓名
/
public String getFrom1()throws Exception{
InternetAddress address[]=(InternetAddress[])mimeMessagegetFrom();
String from=address[0]getAddress();
if(from==null){
from="";
}
String personal=address[0]getPersonal();
if(personal==null){
personal="";
}
String fromaddr=personal+"<"+from+">";
return fromaddr;
}
/
获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同
"to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
@throws Exception /
public String getMailAddress(String type){
String mailaddr="";
try {
String addtype=typetoUpperCase();
InternetAddress []address=null;
if(addtypeequals("TO")||addtypeequals("CC")||addtypeequals("BBC")){
if(addtypeequals("TO")){
address=(InternetAddress[])mimeMessagegetRecipients(MessageRecipientTypeTO);
}
else if(addtypeequals("CC")){
address=(InternetAddress[])mimeMessagegetRecipients(MessageRecipientTypeCC);
}
else{
address=(InternetAddress[])mimeMessagegetRecipients(MessageRecipientTypeBCC);
}
if(address!=null){
for (int i = 0; i < addresslength; i++) {
String email=address[i]getAddress();
if(email==null)email="";
else{
email=MimeUtilitydecodeText(email);
}
String personal=address[i]getPersonal();
if(personal==null)personal="";
else{
personal=MimeUtilitydecodeText(personal);
}
String compositeto=personal+"<"+email+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddrsubstring(1);
}
}
else{
}
} catch (Exception e) {
// TODO: handle exception
}
return mailaddr;
}
/
获得邮件主题
/
public String getSubject()
{
String subject="";
try {
subject=MimeUtilitydecodeText(mimeMessagegetSubject());
if(subject==null)subject="";
} catch (Exception e) {
// TODO: handle exception
}
return subject;
}
/
获得邮件发送日期
/
public String getSendDate()throws Exception{
Date senddate=mimeMessagegetSentDate();
SimpleDateFormat format=new SimpleDateFormat(dateformat);
return formatformat(senddate);
}
/
解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件
主要是根据MimeType类型的不同执行不同的 *** 作,一步一步的解析
/
public void getMailContent(Part part)throws Exception{
String contenttype=partgetContentType();
int nameindex=contenttypeindexOf("name");
boolean conname=false;
if(nameindex!=-1)conname=true;
if(partisMimeType("text/plain")&&!conname){
bodytextappend((String)partgetContent());
}else if(partisMimeType("text/html")&&!conname){
bodytextappend((String)partgetContent());
}
else if(partisMimeType("multipart/")){
Multipart multipart=(Multipart)partgetContent();
int counts=multipartgetCount();
for(int i=0;i<counts;i++){
getMailContent(multipartgetBodyPart(i));
}
}else if(partisMimeType("message/rfc822")){
getMailContent((Part)partgetContent());
}
else{}
}
/
获得邮件正文内容
/
public String getBodyText(){
return bodytexttoString();
}
/
判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
@throws MessagingException /
public boolean getReplySign() throws MessagingException{
boolean replysign=false;
String needreply[]=mimeMessagegetHeader("Disposition-Notification-To");
if(needreply!=null){
replysign=true;
}
return replysign;
}
/
获得此邮件的Message-ID
@throws MessagingException /
public String getMessageId() throws MessagingException{
return mimeMessagegetMessageID();
}
/
判断此邮件是否已读,如果未读返回返回false,反之返回true
@throws MessagingException /
public boolean isNew() throws MessagingException{
boolean isnew =false;
Flags flags=((Message)mimeMessage)getFlags();
FlagsFlag[]flag=flagsgetSystemFlags();
for (int i = 0; i < flaglength; i++) {
if(flag[i]==FlagsFlagSEEN){
isnew=true;
break;
}
}
return isnew;
}
/
判断此邮件是否包含附件
@throws MessagingException /
public boolean isContainAttach(Part part) throws Exception{
boolean attachflag=false;
String contentType=partgetContentType();
if(partisMimeType("multipart/")){
Multipart mp=(Multipart)partgetContent();
//获取附件名称可能包含多个附件
for(int j=0;j<mpgetCount();j++){
BodyPart mpart=mpgetBodyPart(j);
String disposition=mpartgetDescription();
if((disposition!=null)&&((dispositionequals(PartATTACHMENT))||(dispositionequals(PartINLINE)))){
attachflag=true;
}else if(mpartisMimeType("multipart/")){
attachflag=isContainAttach((Part)mpart);
}else{
String contype=mpartgetContentType();
if(contypetoLowerCase()indexOf("application")!=-1) attachflag=true;
if(contypetoLowerCase()indexOf("name")!=-1) attachflag=true;
}
}
}else if(partisMimeType("message/rfc822")){
attachflag=isContainAttach((Part)partgetContent());
}
return attachflag;
}
/
保存附件
@throws Exception
@throws IOException
@throws MessagingException
@throws Exception /
public void saveAttachMent(Part part) throws Exception {
String fileName="";
if(partisMimeType("multipart/")){
Multipart mp=(Multipart)partgetContent();
for(int j=0;j<mpgetCount();j++){
BodyPart mpart=mpgetBodyPart(j);
String disposition=mpartgetDescription();
if((disposition!=null)&&((dispositionequals(PartATTACHMENT))||(dispositionequals(PartINLINE)))){
fileName=mpartgetFileName();
if(fileNametoLowerCase()indexOf("GBK")!=-1){
fileName=MimeUtilitydecodeText(fileName);
}
saveFile(fileName,mpartgetInputStream());
}
else if(mpartisMimeType("multipart/")){
fileName=mpartgetFileName();
}
else{
fileName=mpartgetFileName();
if((fileName!=null)){
fileName=MimeUtilitydecodeText(fileName);
saveFile(fileName,mpartgetInputStream());
}
}
}
}
else if(partisMimeType("message/rfc822")){
saveAttachMent((Part)partgetContent());
}
}
/
设置附件存放路径
/
public void setAttachPath(String attachpath){
thissaveAttachPath=attachpath;
}
/
设置日期显示格式
/
public void setDateFormat(String format){
thisdateformat=format;
}
/
获得附件存放路径
/
public String getAttachPath()
{
return saveAttachPath;
}
/
真正的保存附件到指定目录里
/
private void saveFile(String fileName,InputStream in)throws Exception{
String osName=SystemgetProperty("osname");
String storedir=getAttachPath();
String separator="";
if(osName==null)osName="";
if(osNametoLowerCase()indexOf("win")!=-1){
//如果是window *** 作系统
separator="/";
if(storedir==null||storedirequals(""))storedir="c:\tmp";
}
else{
//如果是其他的系统
separator="/";
storedir="/tmp";
}
File strorefile=new File(storedir+separator+fileName);
BufferedOutputStream bos=null;
BufferedInputStream bis=null;
try {
bos=new BufferedOutputStream(new FileOutputStream(strorefile));
bis=new BufferedInputStream(in);
int c;
while((c=bisread())!=-1){
boswrite(c);
bosflush();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
bosclose();
bisclose();
}
}
/
PraseMimeMessage类测试
@throws Exception /
public static void main(String[] args) throws Exception {
String host="pop3sinacomcn";
String username="guohuaiyong70345";
String password="071120";
Properties props=new Properties();
Session session=SessiongetDefaultInstance(props,null);
Store store=sessiongetStore("pop3");
storeconnect(host,username,password);
Folder folder=storegetFolder("INBOX");
folderopen(FolderREAD_ONLY);
Message message[]=foldergetMessages();
PraseMimeMessage pmm=null;
for (int i = 0; i < messagelength; i++) {
Systemoutprintln("第"+(i+1)+"封邮件");
pmm=new PraseMimeMessage((MimeMessage)message[i]);
Systemoutprintln("主题 :"+pmmgetSubject());
pmmsetDateFormat("yy年MM月dd日 HH:mm");
Systemoutprintln("发送时间 :"+pmmgetSendDate());
Systemoutprintln("是否回执 :"+pmmgetReplySign());
Systemoutprintln("是否包含附件 :"+pmmisContainAttach((Part)message[i]));
Systemoutprintln("发件人 :"+pmmgetFrom1());
Systemoutprintln("收件人 :"+pmmgetMailAddress("TO"));
Systemoutprintln("抄送地址 :"+pmmgetMailAddress("CC"));
Systemoutprintln("密送地址 :"+pmmgetMailAddress("BCC"));
Systemoutprintln("邮件ID :"+i+":"+pmmgetMessageId());
pmmgetMailContent((Part)message[i]); //根据内容的不同解析邮件
pmmsetAttachPath("c:/tmp/mail"); //设置邮件附件的保存路径
pmmsaveAttachMent((Part)message[i]); //保存附件
Systemoutprintln("邮件正文 :"+pmmgetBodyText());
Systemoutprintln("第"+(i+1)+"封邮件结束");
}
}
}
public boolean mainto()
{
boolean flag = true;
//建立邮件会话
Properties pro = new Properties();
proput("mailsmtphost","smtpqqcom");//存储发送邮件的服务器
proput("mailsmtpauth","true"); //通过服务器验证
Session s =SessiongetInstance(pro); //根据属性新建一个邮件会话
//ssetDebug(true);
//由邮件会话新建一个消息对象
MimeMessage message = new MimeMessage(s);
//设置邮件
InternetAddress fromAddr = null;
InternetAddress toAddr = null;
try
{
fromAddr = new InternetAddress(451144426+"@qqcom"); //邮件发送地址
messagesetFrom(fromAddr); //设置发送地址
toAddr = new InternetAddress("12345367@qqcom"); //邮件接收地址
messagesetRecipient(MessageRecipientTypeTO, toAddr); //设置接收地址
messagesetSubject(title); //设置邮件标题
messagesetText(content); //设置邮件正文
messagesetSentDate(new Date()); //设置邮件日期
messagesaveChanges(); //保存邮件更改信息
Transport transport = sgetTransport("smtp");
transportconnect("smtpqqcom", "451144426", "密码"); //服务器地址,邮箱账号,邮箱密码
transportsendMessage(message, messagegetAllRecipients()); //发送邮件
transportclose();//关闭
}
catch (Exception e)
{
eprintStackTrace();
flag = false;//发送失败
}
return flag;
}
这是一个javaMail的邮件发送代码,需要一个mailjar
参考代码如下:
import javaxmail;
import javautil;
import javaio;
public class ReceiveMail {
//处理任何一种邮件都需要的方法
private void handle(Message msg) throws Exception {
Systemoutprintln("邮件主题:" + msggetSubject());
Systemoutprintln("邮件作者:" + msggetFrom()[0]toString());
Systemoutprintln("发送日期:" + msggetSentDate());
}
//处理文本邮件
private void handleText(Message msg) throws Exception {
thishandle(msg);
Systemoutprintln("邮件内容:"+msggetContent());
}
//处理Multipart邮件,包括了保存附件的功能
private static void handleMultipart(Message msg) throws Exception {
String disposition;
BodyPart part;
Multipart mp = (Multipart) msggetContent();
//Miltipart的数量,用于除了多个part,比如多个附件
int mpCount = mpgetCount();
for (int m = 0; m < mpCount; m++) {
thishandle(msg);
part = mpgetBodyPart(m);
disposition = partgetDisposition();
//判断是否有附件
if (disposition != null && dispositionequals(PartATTACHMENT))
{
//这个方法负责保存附件
saveAttach(part);
} else {
//不是附件,就只显示文本内容
Systemoutprintln(partgetContent());
}
}
}
private static void saveAttach(BodyPart part) throws Exception {
//得到未经处理的附件名字
String temp = partgetFileName();
//除去发送邮件时,对中文附件名编码的头和尾,得到正确的附件名
//(请参考发送邮件程序SendMail的附件名编码部分)
String s = tempsubstring(8, tempindexOf("="));
//文件名经过了base64编码,下面是解码
String fileName = base64Decoder(s);
Systemoutprintln("有附件:" + fileName);
InputStream in = partgetInputStream();
FileOutputStream writer = new FileOutputStream(new File(
"保存附件的本地路径"+ "\\"+fileName));
byte[] content = new byte[255];
int read = 0;
while ((read = inread(content)) != -1) {
writerwrite(content);
}
writerclose();
inclose();
}
//base64解码
private static String base64Decoder(String s) throws Exception {
sunmiscBASE64Decoder decoder = new sunmiscBASE64Decoder();
byte[] b = decoderdecodeBuffer(s);
return (new String(b));
}
public static void receive(String receiverMailBoxAddress, String username,String password) {
//本人用的是yahoo邮箱,故接受邮件使用yahoo的pop3邮件服务器
String host = "popmailyahoocomcn";
try {
//连接到邮件服务器并获得邮件
Properties prop = new Properties();
propput("mailpop3host", host);
Session session = SessiongetDefaultInstance(prop);
Store store = sessiongetStore("pop3");
storeconnect(host, username, password);
Folder inbox = storegetDefaultFolder()getFolder("INBOX");
//设置inbox对象属性为可读写,这样可以控制在读完邮件后直接删除该附件
inboxopen(FolderREAD_WRITE);
Message[] msg = inboxgetMessages();
FetchProfile profile = new FetchProfile();
profileadd(FetchProfileItemENVELOPE);
inboxfetch(msg, profile);
for (int i = 0; i < msglength; i++) {
//标记此邮件的flag标志对象的DELETED位为true,可以在读完邮件后直接删除该附件,具体执行时间是在调用
//inboxclose()方法的时候
msg[i]setFlag(FlagsFlagDELETED, true);
handleMultipart(msg[i]);
Systemoutprintln("");
}
if (inbox != null) {
//参数为true表明阅读完此邮件后将其删除,更多的属性请参考mailjar的API
inboxclose(true);
}
if (store != null) {
storeclose();
}
} catch (Exception e) {
eprintStackTrace();
}
}
}
1SMTP协议
用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
2POP3协议
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
下图用于演示两帐户相互发送邮件的过程
31JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
32发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
33Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
4邮件组织结构相关的API
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
5具体的例子程序
package cnedudlmusend;import javautilProperties;
import javaxactivationDataHandler;
import javaxactivationFileDataSource;
import javaxmailMessage;
import javaxmailSession;
import javaxmailTransport;
import javaxmailinternetInternetAddress;
import javaxmailinternetMimeBodyPart;
import javaxmailinternetMimeMessage;
import javaxmailinternetMimeMultipart;
import javaxmailinternetMimeUtility;
public class SendMail {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
//连接的邮件服务器的主机名
propsetProperty("mailsmtphost", "smtpsinacomcn");
//发送邮件的协议
propsetProperty("mailtransportprotocol", "smtp");
//是否向邮件服务器提交认证
propsetProperty("mailsmtpauth", "true");
//创建session
Session session = SessiongetInstance(prop);
sessionsetDebug(true);
//得到transport
Transport ts = sessiongetTransport();
//连接邮件服务器
tsconnect("smtpsinacomcn", "xxxx@sinacom", "xxxxx");
//发送邮件
MimeMessage message = createMessage(session);
tssendMessage(message, messagegetAllRecipients());
tsclose();
}
public static MimeMessage createMessage(Session session) throws Exception {
MimeMessage message = new MimeMessage(session);
//设置邮件的基本信息
messagesetFrom(new InternetAddress("xxxx@sinacom"));
messagesetRecipient(MessageRecipientTypeTO, new InternetAddress("1219070362@qqcom"));
messagesetSubject("test");
//正文
MimeBodyPart text = new MimeBodyPart();
//设置charaset可以解决中文正文的乱码问题,内嵌可下载的
textsetContent("你好xxx,<img src='c:/dogjpg' />测试成功!<br/><img src='cid:aaajpg' />", "text/html;charset=gbk");
//1
MimeBodyPart image = new MimeBodyPart();
imagesetDataHandler(new DataHandler(new FileDataSource("src/88jpg")));
imagesetContentID("aaajpg");
//附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src/javamail架包jar"));
attachsetDataHandler(dh);
//解决文件中文乱码问题
attachsetFileName(MimeUtilityencodeText(dhgetName()));
//描述正文和的关系
MimeMultipart mp = new MimeMultipart();
mpaddBodyPart(text);
mpaddBodyPart(image);
mpsetSubType("related");
//描述正文和附件
MimeMultipart mp2 = new MimeMultipart();
mp2addBodyPart(attach);
//将正文封装为一个body
MimeBodyPart content = new MimeBodyPart();
contentsetContent(mp);
mp2addBodyPart(content);
mp2setSubType("mixed");
messagesetContent(mp2);
messagesaveChanges();
return message;
}
}
以上就是关于javamail接收邮件报错全部的内容,包括:javamail接收邮件报错、javamail接收邮件怎么解析内容、用java写一个邮件发送代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)