在Tomcat 6.0上使用Javamail发送带附件的电子邮件时遇到问题。Javamail发送带附件的邮件适用于Windows,但不适用于Linux
在我的机器上使用Tomcat服务器发送邮件时(Windows 7 64),它工作正常。我已经用本地smtp服务器和一个Gmail账户作为中继来测试它。但是,当我的远程Tomcat服务器(运行linux)发送邮件时,收到的邮件乱七八糟,没有主题,附件显示为文本(原始为pdf文件),并且一些邮件标头与邮件混合在一起。我尝试过使用在Windows上测试时使用的相同方法:尝试使用本地smtp服务器,然后使用gmail作为中继。它在两种情况下都不起作用。
我也尝试更改我的本地JavaMail库,并使用远程服务器上的相同内容(从服务器复制到我的机器),但运行本地的结果始终相同。电子邮件以预期的方式收到。
当我发送电子邮件时,它会发送另一份副本给我,所以我可以跟踪发生了什么。在日志下面展示了两种邮件(原件和复印件),运行使用嵌入在我的j2ee.jar JavaMail的本地测试时(请参见下面的其他细节)JAVAMAIL输出:
DEBUG: setDebug: JavaMail version 1.3.1
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587
220 mx.google.com ESMTP jz16sm6498879vdb.9
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO Felipe-HP
250-mx.google.com at your service, [177.17.162.156]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 STARTTLS
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 xxxxxxxxx
334 xxxxxxxxx
235 2.7.0 Accepted
DEBUG SMTP: use8bit false
MAIL FROM:< [email protected]>
250 2.1.0 OK jz16sm6498879vdb.9
RCPT TO:< [email protected]>
250 2.1.5 OK jz16sm6498879vdb.9
DEBUG SMTP: Verified Addresses
DEBUG SMTP: [email protected]
DATA
354 Go ahead jz16sm6498879vdb.9
Message-ID: <[email protected]>
From: [email protected]
To: [email protected]
Subject: Boleto Amaua - 06/05/2012
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_1451495453.1335464128994"
------=_Part_0_1451495453.1335464128994
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
------=_Part_0_1451495453.1335464128994
Content-Type: application/octet-stream;
name=boleto-158-255-1335464128903.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=boleto-158-255-1335464128903.pdf
Content-Description: Attached file: boleto-158-255-1335464128903.pdf
------=_Part_0_1451495453.1335464128994--
.
250 2.0.0 OK 1335464133 jz16sm6498879vdb.9
QUIT
DEBUG: setDebug: JavaMail version 1.3.1
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587
220 mx.google.com ESMTP jz16sm6499184vdb.9
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO Felipe-HP
250-mx.google.com at your service, [177.17.162.156]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 STARTTLS
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 xxxxxxxxxx
334 xxxxxxxxxx
235 2.7.0 Accepted
DEBUG SMTP: use8bit false
MAIL FROM:< [email protected]>
250 2.1.0 OK jz16sm6499184vdb.9
RCPT TO:< [email protected]>
250 2.1.5 OK jz16sm6499184vdb.9
DEBUG SMTP: [email protected]
DEBUG SMTP: [email protected]
DATA
354 Go ahead jz16sm6499184vdb.9
Message-ID: <[email protected]>
From: [email protected]
To: [email protected]
Subject: =?ISO-8859-1?Q?C=F3pia_Boleto_Amaua_-_06/05/2012?=
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_1_1973765399.1335464133435"
------=_Part_1_1973765399.1335464133435
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
###################################################################
Mail Content
###################################################################
------=_Part_1_1973765399.1335464133435
Content-Type: application/octet-stream;
name=boleto-158-255-1335464128903.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=boleto-158-255-1335464128903.pdf
Content-Description: Attached file: boleto-158-255-1335464128903.pdf
##################################################################
Attachment content
##################################################################
------=_Part_1_1973765399.1335464133435--
.
250 2.0.0 OK 1335464137 jz16sm6499184vdb.9
QUIT
下面是所示的日志我的服务器生成:
Loading javamail.default.providers from jar:file:/opt/tomcat60/lib/mail.jar!/META-INF/javamail.default.providers
DEBUG: loading new provider protocol=imap, className=com.sun.mail.imap.IMAPStore, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=imaps, className=com.sun.mail.imap.IMAPSSLStore, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=smtp, className=com.sun.mail.smtp.SMTPTransport, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=smtps, className=com.sun.mail.smtp.SMTPSSLTransport, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=pop3, className=com.sun.mail.pop3.POP3Store, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=pop3s, className=com.sun.mail.pop3.POP3SSLStore, vendor=Sun Microsystems, Inc, version=null
Loading javamail.default.providers from jar:file:/home/xxxxxxx/public_html/WEB-INF/lib/mail.jar!/META-INF/javamail.default.providers
DEBUG: loading new provider protocol=imap, className=com.sun.mail.imap.IMAPStore, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=imaps, className=com.sun.mail.imap.IMAPSSLStore, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=smtp, className=com.sun.mail.smtp.SMTPTransport, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=smtps, className=com.sun.mail.smtp.SMTPSSLTransport, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=pop3, className=com.sun.mail.pop3.POP3Store, vendor=Sun Microsystems, Inc, version=null
DEBUG: loading new provider protocol=pop3s, className=com.sun.mail.pop3.POP3SSLStore, vendor=Sun Microsystems, Inc, version=null
DEBUG: getProvider() returning provider protocol=smtp; [email protected]; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 mx.google.com ESMTP dc7sm2927045vdc.6
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO l50dnn0358.locaweb.com.br
250-mx.google.com at your service, [187.45.198.10]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 PIPELINING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO l50dnn0358.locaweb.com.br
250-mx.google.com at your service, [187.45.198.10]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 PIPELINING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<[email protected]>
250 2.1.0 OK dc7sm2927045vdc.6
RCPT TO:<[email protected]>
250 2.1.5 OK dc7sm2927045vdc.6
DEBUG SMTP: Verified Addresses
DEBUG SMTP: [email protected]
DATA
354 Go ahead dc7sm2927045vdc.6
------=_Part_0_16475596.1335412817148
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
###################################################################
Mail Content
###################################################################
------=_Part_0_16475596.1335412817148
Content-Type: application/octet-stream; name=boleto-1436-1707-1335412817075.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=boleto-1436-1707-1335412817075.pdf
Content-Description: Attached file: boleto-1436-1707-1335412817075.pdf
##################################################################
Attachment content
##################################################################
------=_Part_0_16475596.1335412817148--
.
250 2.0.0 OK 1335412824 dc7sm2927045vdc.6
QUIT
221 2.0.0 closing connection dc7sm2927045vdc.6
DEBUG: getProvider() returning provider protocol=smtp; [email protected]; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 mx.google.com ESMTP c17sm2919516vdj.12
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO l50dnn0358.locaweb.com.br
250-mx.google.com at your service, [187.45.198.10]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 PIPELINING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO l50dnn0358.locaweb.com.br
250-mx.google.com at your service, [187.45.198.10]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 PIPELINING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<[email protected]>
250 2.1.0 OK c17sm2919516vdj.12
RCPT TO:<[email protected]>
250 2.1.5 OK c17sm2919516vdj.12
DEBUG SMTP: Verified Addresses
DEBUG SMTP: [email protected]
DATA
354 Go ahead c17sm2919516vdj.12
------=_Part_1_22662950.1335412824767
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
###################################################################
Mail Content
###################################################################
------=_Part_1_22662950.1335412824767
Content-Type: application/octet-stream; name=boleto-1436-1707-1335412817075.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=boleto-1436-1707-1335412817075.pdf
Content-Description: Attached file: boleto-1436-1707-1335412817075.pdf
##################################################################
Attachment content
##################################################################
------=_Part_1_22662950.1335412824767--
.
250 2.0.0 OK 1335412828 c17sm2919516vdj.12
QUIT
221 2.0.0 closing connection c17sm2919516vdj.12
在我的远程服务器上,我们有上下文/ WEB-INF/lib中的JavaMail库。我们拥有一个mail.jar和一个包含JavaMail的j2ee.jar。另外,在tomcat文件夹中还有另一个mail.jar(可以在日志中看到)和另一个包含Javamail的j2ee.jar。
我试着用最近的一个替换服务器的/WEB-INF/lib/mail.jar,但日志甚至没有改变。在我的本地测试中使用来自服务器的.jars会产生正确的结果。
请注意,我的服务器不显示一些应该存在的调试行。
下面是用来发送电子邮件的代码:
Properties props = new Properties();
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.mime.charset", "ISO-8859-1");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.starttls.required", "true");
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", Integer.toString(port));
this.session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usr, pass);
}
});
MimeMultipart mp = new MimeMultipart("mixed");
MimeBodyPart txtPart = new MimeBodyPart();
if(this.message == null){
if(this.session != null){
this.message = new MimeMessage(this.session);
} else {
throw new Exception("");
}
}
this.session.setDebug(true);
this.message.setFrom(new InternetAddress(this.from));
this.message.setRecipient(Message.RecipientType.TO, new InternetAddress(this.to));
this.message.setSubject(this.subject);
txtPart.setDisposition(Part.INLINE);
txtPart.setText(text);
mp.addBodyPart(txtPart);
for (int i = 0; i < this.attach.size(); i++) {
MimeBodyPart filePart = new MimeBodyPart();
File file = (File) this.attach.elementAt(i);
FileDataSource fds = new FileDataSource(file);
DataHandler dh = new DataHandler(fds);
filePart.setFileName(file.getName());
filePart.setDisposition(Part.ATTACHMENT);
filePart.setDescription("Attached file: " + file.getName());
filePart.setDataHandler(dh);
mp.addBodyPart(filePart);
}
this.message.setContent(mp);
Transport.send(this.message);
任何进一步的细节需要,请询问。
感谢您的考虑!
它并没有奏效。我将JavaMail 1.4.5复制到/ WEB-INF/lib /并删除了j2ee.jar。 JavaMail调试输出保持不变,就好像我没有删除j2ee.jar并将新的JavaMail复制到应用程序库。我误解了Tomcat安装中的j2ee.jar,但我可以确认那里有一个mail.jar,里面有JavaMail 1.3.1类。我需要确保删除该文件能够解决问题,因为我们公司在该服务器上有其他产品,并且我不知道是否删除该mail.jar(在tomcat安装内)会中断任何应用程序。谢谢! – b020 2012-04-27 20:00:56
还有一个Tomcat选项可以让你的应用中的类优先于服务器中的类;这可能有助于这里。 – 2012-04-27 23:17:23
我找不到任何关于此的内容。也许我在搜索中使用了错误的关键字。你能指点一下如何改变这个选项的方向吗? – b020 2012-04-30 18:03:38