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.
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
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.
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
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!