Heim  >  Artikel  >  Java  >  Java implementiert das Senden von E-Mails an das QQ-Postfach basierend auf JavaMail

Java implementiert das Senden von E-Mails an das QQ-Postfach basierend auf JavaMail

高洛峰
高洛峰Original
2017-01-16 09:49:471794Durchsuche

Vor kurzem arbeite ich an einem News-Crawler-Projekt und möchte diese Funktion implementieren: Nachdem das Crawlen einer Seite fehlgeschlagen ist, senden Sie die URL dieser Seite an die E-Mail. Die endgültige Darstellung sieht wie folgt aus: Filterbezeichnungen, Fehlerstatuscodes usw. können später hinzugefügt werden, um die Klassifizierung und Suche nach Ausnahmen zu erleichtern.

Java implementiert das Senden von E-Mails an das QQ-Postfach basierend auf JavaMail

Entwickler können die Gründe für Crawler-Fehler anhand der URL- und Stack-Informationen in der E-Mail analysieren.

Ist der Server ausgefallen?

Oder analysiert das Dom-Parsing des Crawlers den Inhalt nicht

Oder ist der reguläre Ausdruck nicht auf diese Seite anwendbar?

Aktivieren SMTP-Dienst

Aktivieren Sie den SMTP-Dienst in den Einstellungen->Konto von QQ Mailbox

Java implementiert das Senden von E-Mails an das QQ-Postfach basierend auf JavaMail

Beachten Sie, dass QQ Mailbox nach dem Öffnen einen Autorisierungscode generiert Der Code Verwenden Sie diesen Autorisierungscode anstelle des ursprünglichen E-Mail-Passworts, um eine Verbindung zur E-Mail herzustellen. Dadurch wird die Verwendung von Klartext-Passwörtern vermieden.

Java implementiert das Senden von E-Mails an das QQ-Postfach basierend auf JavaMail

Ich habe online nach Beispielen gesucht und basierend auf diesem Artikel Java Mail (2): Einführung in JavaMail und Beispielcode zum Senden einer einfachen E-Mail

Properties props = new Properties();
 
// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.qq.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");
 
Session session = Session.getInstance(props);
 
//邮件内容部分
Message msg = new MimeMessage(session);
msg.setSubject("seenews 错误");
StringBuilder builder = new StringBuilder();
builder.append("url = " + "http://blog.csdn.net/never_cxb/article/details/50524571");
builder.append("页面爬虫错误");
builder.append("\n data " + TimeTool.getCurrentTime());
msg.setText(builder.toString());
//邮件发送者
msg.setFrom(new InternetAddress("**发送人的邮箱地址**"));
 
//发送邮件
Transport transport = session.getTransport();
transport.connect("smtp.qq.com", "**发送人的邮箱地址**", "**你的邮箱密码或者授权码**");
 
transport.sendMessage(msg, new Address[] { new InternetAddress("**接收人的邮箱地址**") });
transport.close();

Es wurde jedoch ein Fehler gemeldet

DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN failed
Exception in thread "main" javax.mail.AuthenticationFailedException: 530
Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28

Da der Beispielcode das 163-Postfach verwendet, und Der Autor ist QQ Mailbox. Schauen Sie sich die Protokollanalyse an und es stellt sich heraus, dass QQ Mailbox eine SSL-Verschlüsselung erfordert.

SSL-Verschlüsselung aktivieren

Ich habe online gesucht und festgestellt, dass andere wie 163- und Sina-Postfächer keine SSL-Verschlüsselung erfordern, sodass Sie auf QQ-Postfächer verzichten können.

Im Internet gibt es auch ein Sprichwort, dass das Ersetzen von smtp.qq.com durch smtp.exmail.qq.com keine SSL-Verschlüsselung erfordert, aber der Autor hat es nicht erfolgreich ausgeführt. Fügen wir also einfach die SSL-Verschlüsselung hinzu.

Der folgende Code aktiviert die SSL-Verschlüsselung

MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);

Erfolgreich, das Konsolenausgabeprotokoll und die Renderings lauten wie folgt

DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 465, isSSL true
220 smtp.qq.com Esmtp QQ Mail Server
DEBUG SMTP: connected to host "smtp.qq.com", port: 465
...
 data 2016-01-19 17:00:44 Tue
.
250 Ok: queued as
QUIT
221 Bye

Java implementiert das Senden von E-Mails an das QQ-Postfach basierend auf JavaMail

Vollständiges Codebeispiel

public class MailTool {
  public static void main(String[] args) throws MessagingException, GeneralSecurityException {
    Properties props = new Properties();
 
    // 开启debug调试
    props.setProperty("mail.debug", "true");
    // 发送服务器需要身份验证
    props.setProperty("mail.smtp.auth", "true");
    // 设置邮件服务器主机名
    props.setProperty("mail.host", "smtp.qq.com");
    // 发送邮件协议名称
    props.setProperty("mail.transport.protocol", "smtp");
 
    MailSSLSocketFactory sf = new MailSSLSocketFactory();
    sf.setTrustAllHosts(true);
    props.put("mail.smtp.ssl.enable", "true");
    props.put("mail.smtp.ssl.socketFactory", sf);
 
    Session session = Session.getInstance(props);
 
    Message msg = new MimeMessage(session);
    msg.setSubject("seenews 错误");
    StringBuilder builder = new StringBuilder();
    builder.append("url = " + "http://blog.csdn.net/never_cxb/article/details/50524571");
    builder.append("\n页面爬虫错误");
    builder.append("\n时间 " + TimeTool.getCurrentTime());
    msg.setText(builder.toString());
    msg.setFrom(new InternetAddress("**发送人的邮箱地址**"));
 
    Transport transport = session.getTransport();
    transport.connect("smtp.qq.com", "**发送人的邮箱地址**", "**你的邮箱密码或者授权码**");
 
    transport.sendMessage(msg, new Address[] { new InternetAddress("**接收人的邮箱地址**") });
    transport.close();
  }
}

Das Obige ist der gesamte Inhalt davon Artikel, ich hoffe, dass er für das Studium aller hilfreich sein wird.

Weitere Java-basierte JavaMail-Implementierungen zum Senden von E-Mails an QQ-Postfächer finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn