android 发送163邮件,app里使用163邮箱发送邮件,被163认为是垃圾邮件的坑爹经历!_ !...

这是一个Java实现的邮件发送工具类,通过SMTP协议与163邮件服务器交互,支持设置多个收件人、抄送人,添加邮件主题、正文及附件。类内部使用了`AsyncTask`进行异步发送,并提供了发送状态回调接口。
摘要由CSDN通过智能技术生成

packagecom.smartdoorbell.util;importandroid.os.AsyncTask;importjava.util.Date;importjava.util.List;importjava.util.Properties;importjavax.activation.CommandMap;importjavax.activation.MailcapCommandMap;importjavax.mail.Authenticator;importjavax.mail.Message;importjavax.mail.Multipart;importjavax.mail.PasswordAuthentication;importjavax.mail.Session;importjavax.mail.Transport;importjavax.mail.internet.InternetAddress;importjavax.mail.internet.MimeBodyPart;importjavax.mail.internet.MimeMessage;importjavax.mail.internet.MimeMultipart;/*** Created by zhangjie on 15/8/31.*/

public classJEmailHelper {private int port = 25; //smtp协议使用的端口

private String host = "smtp.163.com"; //发件人邮件服务器

private String user = "[email protected]"; //使用者账号

private String password = "xxxxxxx"; //使用者密码

private ListemailTos;private ListemailCCs;privateString subject;privateString body;private Listpaths;enumSendStatus {

SENDING, UNDO, SENDOK, SENDFAIL

};privateSendStatus sendStatus;public interfaceJieEmailInfterface {voidstartSend();voidSendStatus(SendStatus sendStatus);

}privateJieEmailInfterface jieEmailInfterface;public voidsetJieEmailInfterface(JieEmailInfterface jieEmailInfterface) {this.jieEmailInfterface =jieEmailInfterface;

}publicJEmailHelper() {synchronized (JEmailHelper.class) {

sendStatus=SendStatus.UNDO;

}

}//构造发送邮件帐户的服务器,端口,帐户,密码

public JEmailHelper(String host, intport, String user, String password) {synchronized (JEmailHelper.class) {this.port =port;this.user =user;this.password =password;this.host =host;

sendStatus=SendStatus.UNDO;

}

}/***@paramemailTos

* 主要接收人的电子邮箱列表

*@paramemailCCs

* 抄送人的电子邮箱列表

*@paramsubject

* 邮件标题

*@parambody

* 正文内容

*@parampaths

* 发送的附件路径集合*/

public void setParams(List emailTos, ListemailCCs,

String subject, String body, Listpaths) {this.emailTos =emailTos;this.emailCCs =emailCCs;this.subject =subject;this.body =body;this.paths =paths;

}public voidsendEmail() {newJieAsynTask().execute();

}private void sendEmailBg() throwsException {

Properties properties= newProperties();

properties.put("mail.smtp.host", host);

properties.put("mail.smtp.port", port);

properties.put("mail.smtp.auth", "true");//true一定要加引号

properties.put("mail.transport.protocol", "smtp");

JieAuthenticator jieAuth= newJieAuthenticator(user, password);

Session session=Session.getInstance(properties, jieAuth);//创建一个消息

MimeMessage msg = newMimeMessage(session);//设置发送人

msg.setFrom(newInternetAddress(user));//设置主要接收人

if (emailTos != null && !emailTos.isEmpty()) {int size =emailTos.size();

InternetAddress[] addresses= newInternetAddress[size];for (int i = 0; i < size; i++) {

addresses[i]= newInternetAddress(emailTos.get(i));

}

msg.setRecipients(Message.RecipientType.TO, addresses);

}//设置抄送人的电子邮件

if (emailCCs != null && !emailCCs.isEmpty()) {int size =emailCCs.size();

InternetAddress[] addresses= newInternetAddress[size];for (int i = 0; i < size; i++) {

addresses[i]= newInternetAddress(emailCCs.get(i));

}

msg.setRecipients(Message.RecipientType.CC, addresses);

}

msg.setSubject(subject);//创建一个消息体

MimeBodyPart msgBodyPart = newMimeBodyPart();

msgBodyPart.setText(body);//创建Multipart增加其他的parts

Multipart mp = newMimeMultipart();

mp.addBodyPart(msgBodyPart);//创建文件附件

if (paths!=null){for(String path : paths) {if (path!=null){

MimeBodyPart fileBodyPart= newMimeBodyPart();

fileBodyPart.attachFile(path);

mp.addBodyPart(fileBodyPart);

}

}

}//增加Multipart到消息体中

msg.setContent(mp);//设置日期

msg.setSentDate(newDate());//设置附件格式

MailcapCommandMap mc =(MailcapCommandMap) CommandMap

.getDefaultCommandMap();

mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");

mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");

mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");

mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");

mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");

CommandMap.setDefaultCommandMap(mc);

msg.saveChanges();//发送消息

Transport.send(msg);

}class JieAuthenticator extendsAuthenticator {privateString strUser;privateString strPwd;publicJieAuthenticator(String user, String password) {this.strUser =user;this.strPwd =password;

}protectedPasswordAuthentication getPasswordAuthentication() {return newPasswordAuthentication(strUser, strPwd);

}

}class JieAsynTask extends AsyncTask{

@Overrideprotected voidonPreExecute() {super.onPreExecute();if (jieEmailInfterface != null) {

jieEmailInfterface.startSend();

}

}

@Overrideprotected voidonPostExecute(SendStatus result) {super.onPostExecute(result);if (jieEmailInfterface != null) {

jieEmailInfterface.SendStatus(result);

}

sendStatus=SendStatus.UNDO;

}

@OverrideprotectedSendStatus doInBackground(Void... params) {try{

sendStatus=SendStatus.SENDING;

sendEmailBg();

sendStatus=SendStatus.SENDOK;

}catch(Exception e) {

e.printStackTrace();

sendStatus=SendStatus.SENDFAIL;

}returnsendStatus;

}

}

}

### 回答1: 下面是实现自动登录带验证码的163邮箱发送邮件的一种方法: 首先,你需要安装以下库: ``` pip install selenium pip install pillow ``` 然后,你需要安装Chrome浏览器的驱动程序,并将其路径添加到系统环境变量中。 接下来,可以使用以下代码来实现自动登录: ``` from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from PIL import Image # 启动浏览器 browser = webdriver.Chrome() browser.get('http://mail.163.com/') # 等待5秒,给用户手动登录的机会 time.sleep(5) # 找到登录按钮,点击 login_button = browser.find_element_by_id('lbNormal') login_button.click() # 找到用户名输入框,并输入用户名 username = browser.find_element_by_name('email') username.send_keys('your_username') # 找到密码输入框,并输入密码 password = browser.find_element_by_name('password') password.send_keys('your_password') # 找到验证码图片,并保存到本地 verify_code_element = browser.find_element_by_id('vcodeImg') verify_code_location = verify_code_element.location verify_code_size = verify_code_element.size browser.save_screenshot('screenshot.png') x = verify_code_location['x'] y = verify_code_location['y'] width = verify_code_size['width'] height = verify_code_size['height'] # 截取验证码图片 im = Image.open('screenshot.png') im = im.crop((x, y, x + width, y + height)) im.save('verify_code.png') # 打开验证码图片,手动输入 ### 回答2: 要实现自动登录带验证码的163邮箱,并发送一封邮件给a.163.com,可以使用Python的selenium库以及邮件发送库(如smtplib)来完成。 首先,需要安装相应的库,在命令行中输入以下命令: ``` pip install selenium pip install smtplib ``` 接下来,编写代码实现自动登录邮箱功能。首先,导入必要的库和模块: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time ``` 然后,初始化WebDriver并打开163邮箱登录页面: ```python driver = webdriver.Chrome() # 需要安装Chrome浏览器驱动 driver.get('https://mail.163.com/') ``` 找到登录框中的用户名和密码输入框,并输入相应的账号和密码: ```python driver.switch_to.frame(0) # 切换到iframe username = driver.find_element_by_name('email') password = driver.find_element_by_name('password') username.send_keys('your_username') # 替换为你的邮箱账号 password.send_keys('your_password') # 替换为你的邮箱密码 ``` 此时页面会弹出验证码窗口,为了自动化,我们可以手动输入验证码并点击登录,也可以使用OCR技术自动识别验证码,这我们选择手动输入验证码的方法: ```python verification_code = input('请输入验证码:') driver.find_element_by_id('un-login').send_keys(Keys.ENTER) # 点击登录 ``` 等待一段时间,使页面完全加载,然后进入写信页面: ```python time.sleep(5) # 等待页面加载 driver.find_element_by_id('_mail_component_42_42').click() # 进入写信页 ``` 找到收件人输入框,输入收件人邮箱地址(a.163.com): ```python driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys('a.163.com') ``` 接下来,我们需要填写邮件的主题和内容,并发送邮件: ```python driver.find_element_by_class_name('nui-ipt-input').send_keys('邮件主题') # 替换为你的邮件主题 time.sleep(2) # 等待邮件主题输入框失去焦点 driver.switch_to.frame(driver.find_element_by_class_name('APP-editor-iframe')) # 切换到内容输入的iframe driver.find_element_by_tag_name('body').send_keys('邮件内容') # 替换为你的邮件内容 driver.switch_to.default_content() # 切回主页面 driver.find_element_by_class_name('nui-toolbar-item-send').click() # 点击发送按钮 ``` 最后,关闭浏览器: ```python time.sleep(2) # 等待发送成功弹窗消失 driver.quit() ``` 以上就是使用Python实现自动登录带验证码的163邮箱,并发送一封邮件给a.163.com的代码。根据你的实际情况,需要进行相应的参数替换和验证步骤的修改。 ### 回答3: 要实现自动登录带验证码的163邮箱发送邮件给a.163.com,可以使用Python的selenium库和smtplib库。以下是一个示例代码: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import time import smtplib from email.mime.text import MIMEText # 启动浏览器 driver = webdriver.Chrome() driver.get("https://mail.163.com") # 输入用户名和密码 username_input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[name="username"]'))) username_input.send_keys("your_username") password_input = driver.find_element_by_css_selector('input[name="password"]') password_input.send_keys("your_password") # 等待用户输入验证码 time.sleep(30) # 点击登录按钮 login_button = driver.find_element_by_css_selector('a[data-action="login"]') login_button.click() # 等待登录成功 WebDriverWait(driver, 10).until(EC.title_contains("网易邮箱")) # 发送邮件 smtp_server = "smtp.163.com" sender_email = "your_email@163.com" receiver_email = "a@163.com" subject = "Test Email" message = "This is a test email." msg = MIMEText(message) msg["Subject"] = subject msg["From"] = sender_email msg["To"] = receiver_email smtp = smtplib.SMTP(smtp_server) smtp.login(sender_email, "your_email_password") smtp.sendmail(sender_email, receiver_email, msg.as_string()) smtp.quit() # 关闭浏览器 driver.quit() ``` 需要注意的是,此代码中的部分参数需要你自己填写,如邮箱用户名、密码、邮件内容和发件人邮箱密码等。另外,验证码需要人工输入,代码会自动等待30秒让你输入验证码并登录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值