javamail接收邮件报错

javamail接收邮件报错,第1张

使用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写一个邮件发送代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9488811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存