Вот пример кода. Это вдохновлено кодом, найденным на сайте Python Cookbook (не удается найти точную ссылку)
def createhtmlmail (html, text, subject, fromEmail):
"""Create a mime-message that will render HTML in popular
MUAs, text in better ones"""
import MimeWriter
import mimetools
import cStringIO
out = cStringIO.StringIO() # output buffer for our message
htmlin = cStringIO.StringIO(html)
txtin = cStringIO.StringIO(text)
writer = MimeWriter.MimeWriter(out)
#
# set up some basic headers... we put subject here
# because smtplib.sendmail expects it to be in the
# message body
#
writer.addheader("From", fromEmail)
writer.addheader("Subject", subject)
writer.addheader("MIME-Version", "1.0")
#
# start the multipart section of the message
# multipart/alternative seems to work better
# on some MUAs than multipart/mixed
#
writer.startmultipartbody("alternative")
writer.flushheaders()
#
# the plain text section
#
subpart = writer.nextpart()
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
pout = subpart.startbody("text/plain", [("charset", 'us-ascii')])
mimetools.encode(txtin, pout, 'quoted-printable')
txtin.close()
#
# start the html subpart of the message
#
subpart = writer.nextpart()
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
#
# returns us a file-ish object we can write to
#
pout = subpart.startbody("text/html", [("charset", 'us-ascii')])
mimetools.encode(htmlin, pout, 'quoted-printable')
htmlin.close()
#
# Now that we're done, close our writer and
# return the message body
#
writer.lastpart()
msg = out.getvalue()
out.close()
print msg
return msg
if __name__=="__main__":
import smtplib
html = 'html version'
text = 'TEST VERSION'
subject = "BACKUP REPORT"
message = createhtmlmail(html, text, subject, 'From Host ')
server = smtplib.SMTP("smtp_server_address","smtp_port")
server.login('username', 'password')
server.sendmail('sender@host.com', 'target@otherhost.com', message)
server.quit()
Для реализации выпадающего меню вы можете использовать угловой материал Использовать компонент автозаполнения для ui
Демо-шаблон
HTML
blockquote><form class="example-form"> <mat-form-field class="example-full-width"> <input type="text" placeholder="search" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="auto" (keyup)="updated()" [(ngModel)]="data"> <mat-autocomplete #auto="matAutocomplete"> <mat-option *ngFor="let option of options" [value]="option"> {{option}} </mat-option> </mat-autocomplete> </mat-form-field> </form>
Теперь для поиска в массиве строки (в этом примере
all[]
) вы можете использовать эту логикуЗдесь я Я использую регулярное выражение для соответствия любой подстроке этих строк в массиве
Тип машинописного текста
blockquote>export class AppComponent { myControl = new FormControl(); options: string[] = []; data : any; constructor() { } public updated() { this.options = []; if (this.myControl.value.length > 0) { let all = ['John', 'Jenny', 'Jonson'] let searchedWord = this.myControl.value for(let key in all) { let r = all[key].search(new RegExp(searchedWord, "i")); if (r != -1) { this.options.push(all[key]) } } } else { this.options = [] } } }
Рабочий пример: stackblitz