我正在尝试使用以下代码:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*; // important
import javax.mail.event.*; // important
import java.net.*;
import java.util.*;
public class servletmail extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
response.setContentType("text/html");
try {
Properties props=new Properties();
props.put("mail.smtp.host","localhost"); // 'localhost' for testing
Session session1 = Session.getDefaultInstance(props,null);
String s1 = request.getParameter("text1"); //sender (from)
String s2 = request.getParameter("text2");
String s3 = request.getParameter("text3");
String s4 = request.getParameter("area1");
Message message =new MimeMessage(session1);
message.setFrom(new InternetAddress(s1));
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(s2,false));
message.setSubject(s3);
message.setText(s4); …Run Code Online (Sandbox Code Playgroud) 当我尝试使用JavaMail API发送邮件时收到此错误.我确信用户名和密码是100%正确的.我正在连接的Gmail帐户是一个旧帐户,因为他们说它需要时间来处理新帐户.
DEBUG SMTP RCVD: 535-5.7.1 Username and Password not accepted. Learn more at
535 5.7.1 http://mail.google.com/support/bin/answer.py?answer=14257 x35sm3011668
wfh.6
javax.mail.SendFailedException: Sending failed;
nested exception is:
javax.mail.AuthenticationFailedException
at javax.mail.Transport.send0(Transport.java:218)
at javax.mail.Transport.send(Transport.java:80)
at Main.(Main.java:41)
at Main.main(Main.java:51)
这是我的代码:
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class Main
{
String d_email = "abc@gmail.com",
d_password = "pass",
d_host = "smtp.gmail.com",
d_port = "465",
m_to = "abc@gmail.com",
m_subject = "Testing",
m_text = "testing email.";
public Main()
{
Properties props = new Properties();
props.put("mail.smtp.user", d_email);
props.put("mail.smtp.host", d_host); … Session.getDefaultInstance(props, authenticator)和之间有什么区别getInstance(props, authenticator)?一般来说,你何时会选择一个而不是另一个?
我还在getDefaultInstance(props,authenticator)上阅读了Java doc ,但仍然无法清楚地/清楚地看出差异.
希望专家可以帮助我更好地理解这一点.
更新:触发提出这个问题的实际原因是:我们在Session.getDefaultInstance()基于Web的应用程序中的某些地方使用了方法.有时,它会抛出java.lang.SecurityException: Access to default session denied,快速谷歌搜索,它建议使用Session.getInstance()方法代替.因此,当一个人选择一个而不是另一个?
我的应用程序需要临时发送电子邮件.我正在使用javamail的getDefaultSession和getTransport来发送消息,并且它都按预期工作.
但是我注意到发送可能需要很长时间 - 每次发送最多7秒.如果我打破了这些步骤,就像这样:
Transport transport = session.getTransport("smtp");
transport.connect();
transport.sendMessage( msg, addresses )
transport.close();
Run Code Online (Sandbox Code Playgroud)
...我可以看到,每次都是几乎所有时间的connect()调用.
我发现的所有例子都是这样做的 - 获得传输,连接,发送,断开连接.但当然,它们都是单拍的例子,或者只需一次通话即可发送大批电子邮件.
我以为我可以让连接保持打开状态,如下所示:
Transport transport = session.getTransport("smtp");
if (!transport.isConnected())
transport.connect();
transport.sendMessage( msg, addresses )
Run Code Online (Sandbox Code Playgroud)
(这里有一个变种,这里:java邮件保持传输对象连接).
我最终必须在某种关闭钩子中关闭它.而且我可能必须有一个后备(如果连接丢失但传输没有实现).但有没有理由不在应用程序生命周期内将其保持开放状态?
谢谢,阿拉斯泰尔
我正在使用JavaMail编写一个小型Java应用程序,向用户发送自动电子邮件.他们可以选择(现在)两个端口:25和587.可以通过GUI上的单选按钮选择端口.
我添加了一个测试按钮,允许用户测试电子邮件设置(包括端口).但是,由于某种原因,一旦用户尝试发送测试电子邮件,端口就无法更改.Javamail将始终使用原始测试电子邮件的端口.
示例:用户尝试在端口25上发送电子邮件,JavaMail表示无法在端口25上连接(例如,SMTP主机使用另一个端口).用户单击端口587,并尝试发送新电子邮件.JavaMail抛出一个错误,说它无法再次在端口25上连接.
我有点难过为什么.每次发送新的测试电子邮件时,都会创建一个全新的SendMailUsingAuthentication对象.在该类中,属性始终重置为正确的端口.每当我调试时,据我所知,所有变量都是正确的,并与正确的端口相关联.我错过了运输内部的东西吗?
在前端GUI中:
private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {
int port = port25RadioButton.isSelected() ? PORT_25 : PORT_587;
notifier = new SendMailUsingAuthentication(hostNameTextField.getText(),
userTextField.getText(), getPassword(), emailTextField.getText().split(","),port);
Thread wait = new Thread(new Runnable() {
public void run() {
try {
changeStatusText("Sending test email...");
notifier.postTestMail();
changeStatusText("Test email sent.");
} catch (AddressException ex) {
changeStatusText("Error. Invalid email address name.");
} catch (MessagingException ex) {
changeStatusText("SMTP host connection refused.");
System.err.println(ex.getMessage());
} catch (Exception ex) {
System.err.println(ex);
}
}
});
wait.start();
}
Run Code Online (Sandbox Code Playgroud)
在电子邮件发件人类中:
public void postTestMail() …Run Code Online (Sandbox Code Playgroud) 我需要通过我的应用程序发送电子邮件,javamail API如果说(任何其他邮件服务,如果可用的话也会).问题是我不想问用户他username和password.
1)是否有可能使用OAuth 2.0与JavaMail API/任何其他邮件API
2)如何获取OAuth令牌?
3)网上是否有可用的示例代码
提前致谢.
PS:我从未使用过邮件服务/ SMTP请求.
我是Amazon SES的新手,我发现有两种方法可以通过编程方式发送电子邮件:
每种方法的优缺点是什么?它们似乎可以互换,但我想听听那些有过SES经验的人.
根据我自己的要求,我将向用户发送交易电子邮件(即收据,帐户确认等)和通知电子邮件(即"您有新消息",状态更改等)我的网络和移动应用程序.如果可能的话,我想保留所有这些外发电子邮件的历史记录.
我编写了以下代码,用于通过SMTP作为TLS使用javamail API发送电子邮件,因为不支持SSL,但我最终遇到以下异常.请参阅下面的代码.我使用过调试模式,在代码下面你也可以找到异常.
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendMailTLS {
public static void main(String[] args) {
final String username = "---------@mydomain.com";
final String password = "***********";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "mail.mydomain.com");
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
session.setDebug(true);
try {
Message message = new MimeMessage(session);
message.setFrom(new
InternetAddress("---------@mydomain.com")); …Run Code Online (Sandbox Code Playgroud) 我在尝试使用java邮件时收到以下异常;
java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger
at javax.mail.Session.initLogger(Session.java:226)
at javax.mail.Session.<init>(Session.java:210)
at javax.mail.Session.getInstance(Session.java:247)
at com.secondstory.mailsender.MailSender.createSmtpSession(MailSender.java:67)
at com.secondstory.mailsender.MailSender.sendSimpleMessage(MailSender.java:38)
at com.secondstory.mailsender.MailSender.generateLostPasswordEmail(MailSender.java:79)
at com.secondstory.mailsender.MailSenderTest.shouldReturnTrueWithCredentialsSet(MailSenderTest.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MailLogger
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at …Run Code Online (Sandbox Code Playgroud) 在我的笔记本电脑(Windows 10)或我们的开发服务器(CentOS)上运行此Java服务,一切都按预期工作.但是当我在我们的实时服务器(CentOS)上运行它时,我收到以下错误:
09/Sep/2016 08:31:07,005 [ERROR] [pool-2-thread-2] - EmailSender: A Messaging exception occurred in EmailSender
javax.mail.MessagingException: [EOF]
at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363) ~[jar:rsrc:mail-1.4.jar!/:?]
at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838) ~[jar:rsrc:mail-1.4.jar!/:?]
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375) ~[jar:rsrc:mail-1.4.jar!/:?]
at javax.mail.Service.connect(Service.java:275) ~[jar:rsrc:mail-1.4.jar!/:?]
at javax.mail.Service.connect(Service.java:156) ~[jar:rsrc:mail-1.4.jar!/:?]
at com.awesomecompany.messaging.server.EmailSender.sendEmail(EmailSender.java:99) [rsrc:./:?]
at com.awesomecompany.messaging.server.MonitorDevicesRunnable.run(MonitorDevicesRunnable.java:82) [rsrc:./:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [?:1.7.0_75]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) [?:1.7.0_75]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) [?:1.7.0_75]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.7.0_75]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_75]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_75]
at java.lang.Thread.run(Thread.java:745) [?:1.7.0_75]
Run Code Online (Sandbox Code Playgroud)
我的邮箱代码:
public void sendEmail(User user) {
to[0] = user.getEmail();
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", password);
props.put("mail.smtp.port", "587"); …Run Code Online (Sandbox Code Playgroud)